【jenkins】使用pipeline 部署 springboot 微服務集羣

1 利用jenkins pipeline部署最終效果圖(注意本文涉及到:jenkins安裝,部署,插件安裝,groovy,ssh插件等較多涉及點)

 

2 準備 已經安裝好jenkins的可以直接略過

jenkins 安裝
1 下載 wget -O jenkins https://pkg.jenkins.io/redhat-stable/jenkins-2.235.1-1.1.noarch.rpm
2 安裝 rpm -ivh jenkins-2.235.1-1.1.noarch.rpm
3 修改 vim /etc/sysconfig/jenkins   修改用戶名和密碼  端口: JENKINS_PORT="8888"
4 啓動: systemctl start jenkins
5 訪問: IP+端口
6 登錄
7 下載available updates 配置文件

Now change it to http://updates.jenkins-ci.org/update-center.json

You are done!


安裝maven:
wget -O maven.tar.gz https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar -xzf  maven.tar.gz
//查看java安裝目錄
[root@izm5e3f1yp ~]# which java # 1
/usr/bin/java
[root@izm5e3f1yp ~]# ls -lrt /usr/bin/java  #2 
lrwxrwxrwx 1 root root 22 Apr 23  2019 /usr/bin/java -> /etc/alternatives/java
[root@izm5e3f1yp ~]# ls -lrt /etc/alternatives/java  #3
lrwxrwxrwx 1 root root 34 Apr 23  2019 /etc/alternatives/java -> /usr/java/jdk1.8.0_77/jre/bin/java
修改:/etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_77
export MAVEN_HOME=/root/apache-maven-3.6.3
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
生效:source /etc/profile
驗證:mvn -v

配置jenkins環境變量
JAVA_HOME=/usr/java/jdk1.8.0_77
M2_HOME=/root/apache-maven-3.6.3
PATH+EXTRA=M2_HOME/bin

修改ecs maven 私服地址
maven settings配置中使用阿里私服,可加速依賴下載速度
<mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

3 選擇pipeline模式部署服務

4 關鍵代碼樣例

node {
   #定義遠程機器,可定義多個
   def remote = [:]
   remote.name = '172.168.100.101'
   remote.host = '172.168.100.101'
   remote.user = 'tomcat'
   remote.password = 'tomcat@123456'
   remote.allowAnyHosts = true
   # 命令執行
   stage('Remote SSH') {
     sshCommand remote: remote, command: "ls -lrt"
     sshCommand remote: remote, command: "for i in {1..5}; do echo -n \"Loop \$i \"; date ; sleep 1; done"
   }
   # 寫文件,並遠在程機器執行
   stage('Remote SSH-write') {
    writeFile file: 'abc.sh', text: 'pwd'
    sshScript remote: remote, script: "abc.sh"
  }
   # PUT文件
  stage('Remote SSH-putfile') {
    writeFile file: 'abc.sh', text: 'if [ ! -d  "myproject" ];then  mkdir myproject fi;'
    sshPut remote: remote, from: 'abc.sh', into: '.'
  }
  # 拉去代碼
  stage('Remote SSH-checkout-build') {
    sshRemove remote: remote, path: "abc.sh"
    checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'ee1e129b-a876-47a9-a7e3-e0b13fa497f0', url: 'https://gitee.com/guofu/myproject']]])
    sh label: '', script: 'mvn clean package'

  }
  # 整理資源
  stage('Remote SSH-clean_remote') {
    writeFile file: 'clean_remote_old_jar.sh', text: 'rm myproject/*.jar'
    sshScript remote: remote, script: "clean_remote_old_jar.sh"
 }
 # 傳送jar到目標機器
 stage('Remote SSH-sendfile') {
    sh label: '', script: 'if [ ! -d  "myproject" ];then  mkdir myproject; fi;'
    sh label: '', script: 'rm myproject/*.jar'
    sh label: '', script: 'jar=$(find ./rec-myproject/target/**.jar) ; mv $jar "./myproject/myproject_$BUILD_NUMBER-$JOB_NAME.jar"'
    sshPut remote: remote, from: 'myproject/', into: '.'
  }
  # deploy.sh 放置在代碼中,一併上傳到git倉庫的部署腳本
 stage('Remote SSH-deploy') {
    sshScript remote: remote, script: "rec-myproject/src/main/resources/deploy.sh"
  }

}

deploy.sh 樣例
#!/bin/bash

cd myproject

    pid=$(jps -l | grep myproject | awk 'NR==1{print $1}')
    echo $pid
    if [ "$pid" != "" ];then
        echo "kill $pid"
        kill -9 $pid
    fi
    serverPort=9988
    status=$(lsof -i:$serverPort)
    whatToFind="java"
    while [[ "$status" == *"$whatToFind"* ]]
    do
        v_time=`date "+%Y-%m-%d %H:%M:%S"`
        status=$(lsof -i:$serverPort)
    done

jar=$(find **$BUILD_NUMBER**.jar)

debug="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=9001,suspend=n"

GC_PARAM="-Xmx2g -Xms2g"
LOG_ASYN="-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector "
PRINT_GC="-XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:-PrintHeapAtGC -XX:-UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:/root/habit-dynamic-rec/logs/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/myproject/logs/heaperr.log"

nohup nice java -XX:+UseG1GC $LOG_ASYN $GC_PARAM  $debug $PRINT_GC -jar  $jar --spring.profiles.active=prod  >/dev/null 2>&1 &


# 監聽端口上線情況
whatToFind="java"
status=$(lsof -i:$serverPort)
while [[ "$status" != *"$whatToFind"* ]]
    do
        v_time=`date "+%Y-%m-%d %H:%M:%S"`
        status=$(lsof -i:$serverPort)
        tail -5  logs/all.log
        sleep 1;
    done
echo "success!!!"

5 多機器部署

6 腳本語法參考:

https://github.com/jenkinsci/ssh-steps-plugin#remote

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章