首頁>技術>

解決方案:

Jenkin多分支流水線,允許Jenkinsfile與需要 Jenkins 構建的應用程式程式碼放在一起,然後 Jenkins 從原始碼管理系統中檢出 Jenkinsfile 檔案作為流水線專案構建過程的一部分並接著執行你的流水線。

下面我們就來體驗下Jenkins多分支的構建過程吧。

Jenkinsfile

Jenkins流水線的定義通常需要寫入到一個文字檔案(稱為 Jenkinsfile )中,該檔案可以被放入專案的原始碼版本庫中。

注意:Jenkinsfile放到專案版本庫的根路徑下。

在此我們還是延續使用helloworld的java專案。

Jenkinsfile的程式碼如下:

vim Jenkinsfilepipeline { options { ansiColor('xterm') timestamps() } agent { label 'docker-slave-java' } triggers { GenericTrigger (causeString: 'Generic Cause', genericVariables: [[defaultValue: 'deploy', key: 'deploy_env', regexpFilter: '', value: '']], regexpFilterExpression: '', regexpFilterText: '', token: '123456') } environment { APP_NAME = "helloworld" IMAGE_NAME = "helloworld/helloworld" MONITOR_URL = "http://127.0.0.1:8080" JAVA_OPTS = "-Xmx128m -Xms128m -Dspring.profiles.active=branch" PORT = "9080:8080" } parameters { choice choices: ['deploy', 'rollback', 'restart'], description: '''deploy:釋出 rollback:回滾 restart:重啟 注意:restart 引數只適用與docker環境''', name: 'deploy_env' string defaultValue: '0', description: '''回滾版本號,發版時忽略 注意: 版本號為git commitid,如7e2c56522188c98f6294d91c8568dfcedf994e42。''', name: 'version', trim: false } stages { stage('操作校驗') { steps { sh label: '', script: ''' echo ${APP_NAME} #操作校驗 if [ "${deploy_env}" = "deploy" ];then  echo -e "\\\\033[34mstart ${deploy_env}\\\\033[0m"  echo ${GIT_PREVIOUS_SUCCESSFUL_COMMIT}  echo ${GIT_COMMIT}  [ "${GIT_PREVIOUS_SUCCESSFUL_COMMIT}" != "${GIT_COMMIT}" ] && echo -e "\\\\033[34mstart maven package\\\\033[0m" || { #版本未更新,停止發版 echo -e "\\\\033[31mRepositories not update, stop ${deploy_env}\\\\033[0m" exit 1  }  /usr/local/maven/bin/mvn clean package docker:build -DdockerImageTags=${GIT_COMMIT} -Dmaven.test.skip=true -DpushImageTag  [ $? -eq 0 ] && echo -e "\\\\033[32mmaven package success\\\\033[0m" || { echo -e "\\\\033[31mmaven package fail\\\\033[0m" exit 1  } elif [ "${deploy_env}" = "rollback" ];then  echo -e "\\\\033[34mstart ${deploy_env}\\\\033[0m"  echo ${GIT_PREVIOUS_SUCCESSFUL_COMMIT}  echo ${GIT_COMMIT}  #檢視遠端分支是否有此版本  git branch -r --contains $version  [ $? -eq 0 ] && echo -e "\\\\033[34mstart docker steps\\\\033[0m" || { echo -e "\\\\033[31mverison is wrong,please check version\\\\033[0m" exit 1  } fi''' } } stage('開發部署') { when { branch 'develop' } steps { sshPublisher(publishers: [sshPublisherDesc(configName: 'test-3.63', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: """ #!/bin/bash IN_FACE=`/sbin/route -n |awk \\'{if(\\$4~/UG/){print \\$8}}\\'|head -n 1` LOCAL_IP=`/sbin/ip addr show \\"\\${IN_FACE}\\" | grep -w \\'inet\\' | awk \\'{print \\$2}\\'` CONTAINER_NAME=`echo ${IMAGE_NAME} | awk -F/ \\'{print \\$2}\\'` #刪除老映象 DEL_IMAGE() {  echo -e "\\\\033[34mrm image ${IMAGE_NAME}:\\$1\\\\033[0m"  sudo docker image rm harbor.cityre.cn/${IMAGE_NAME}:\\$1 --no-prune  [ \\$? -eq 0 ] && echo -e "\\\\033[32mrm ${IMAGE_NAME}:\\$1 succss \\\\033[0m" || { echo -e "\\\\033[31mrm ${IMAGE_NAME}:\\$1 fail \\\\033[0m" exit 1  } } #健康檢查 HEALTHCHECK() {  timeout=180  echo -e "\\\\033[34mhealth check\\\\033[0m"  for (( i=1;i<=\\$timeout;i++ ))  do status=\\$(sudo docker inspect --format=\\'{{json .State.Health}}\\' \\${CONTAINER_NAME}|grep -Po \\'"Status[":]+\\\\K[^"]+\\') echo \\$status if [ \\$status = \\'healthy\\' ];then  echo -e "\\\\033[32m\\${LOCAL_IP} \\${CONTAINER_NAME} status is \\${status}\\\\033[0m"  [ ${deploy_env} != "restart" ] && DEL_IMAGE \\${OLD_VERSION}  exit 0 elif [ \\$status = \\'starting\\' ];then  sleep 23 else  echo -e "\\\\033[31m\\${LOCAL_IP} \\${CONTAINER_NAME} status is \\${status}\\\\033[0m"  exit 1 fi  done } #定義docker-compose變數,注意第一步清空env,後續追加env INIT_VAR() {  echo -e "\\\\033[34minit docker-compose variable\\\\033[0m"  echo "IMAGE_NAME=${IMAGE_NAME}" > .env  echo "CONTAINER_NAME=\\${CONTAINER_NAME}" >> .env  echo "APP_NAME=${APP_NAME}" >> .env  echo "MONITOR_URL=${MONITOR_URL}" >> .env  echo "PORT=${PORT}" >> .env  echo "JAVA_OPTS=\\$(echo ${JAVA_OPTS}|sed 's/branch/test/')" >> .env } #進入專案目錄 cd /App/java_app_tmp/${APP_NAME} #提前讀取env檔案中的老版本號,用於刪除老映象 [ -f .env ] && OLD_VERSION=\\$(grep VERSION .env|awk -F= \\'{print \\$2}\\') case ${deploy_env} in deploy)  echo -e "\\\\033[34mstart ${deploy_env} steps\\\\033[0m"  INIT_VAR  echo "VERSION=${GIT_COMMIT}" >> .env  sudo docker-compose up -d --build  HEALTHCHECK  ;; rollback)  echo -e "\\\\033[34mstart ${deploy_env} steps\\\\033[0m"  INIT_VAR  echo "VERSION=${version}" >> .env  sudo docker-compose up -d --build  HEALTHCHECK  ;; restart)  sudo docker-compose restart  HEALTHCHECK  ;; *)  exit 1  ;; esac""", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) } } stage('測試部署') { when { branch 'develop' } steps { sh 'uname -a' } } } post { unstable { emailext ( body: """專案名稱:${JOB_NAME}\\n構建編號:${BUILD_NUMBER}\\n構建日誌:${BUILD_URL}console""", subject: '【Jenkins構建通知】:$JOB_NAME - Build # $BUILD_NUMBER - Unstable!', to: '[email protected]', from: '[email protected]' ) } success { emailext ( body: """專案名稱:${JOB_NAME}\\n構建編號:${BUILD_NUMBER}\\n構建日誌:${BUILD_URL}console""", subject: '【Jenkins構建通知】:$JOB_NAME - Build # $BUILD_NUMBER - Successful!', to: '[email protected]', from: '[email protected]' ) } failure { emailext ( body: """專案名稱:${JOB_NAME}\\n構建編號:${BUILD_NUMBER}\\n構建日誌:${BUILD_URL}console""", subject: '【Jenkins構建通知】:$JOB_NAME - Build # $BUILD_NUMBER - Failure!', to: '[email protected]', from: '[email protected]' ) } }}

我們在git版本中分了dev、test、master三個分支,分別對應開發、測試、生產三個環境,Jenkinsfile中通過when+branch來分別匹配不同的分支執行的操作。如下:

when { branch 'develop'}

本次實驗我們設定:

開發部署實現開發分支的docker構建。測試部署實現測試分支的輸出核心資訊。郵件通知實現失敗/成功/不穩定等3個維度的郵件通知。Jenkins構建

Jenkins流水線使用Blue Ocean效果更佳哦。

新建多分支流水線專案

我們的專案為docker-test-java3

配置多分支流水線

我們只需配置git程式碼庫即可,此時會自動檢測分支。如果程式碼庫中沒有Jenkinsfile會提示報錯。

我們只需在對應分支直接構建即可。

總結

從以上過程我們可以看出,多分支流水線的重點在於Jenkinsfile檔案,但是由於多分支流水線需要Jenkins放在版本庫中,因此運維也要像開發一樣維護Jenkinsfile,容易導致版本衝突。

因此對於此種情況,我認為還是需要擴充套件共享庫的,這樣可以進一步優化為多個專案使用同一套流水線,運維只需維護擴充套件共享庫即可。

390

Git

Docker

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 動作編輯器實時佈局,佈局實時驗證,AndroidStudio 4值得更新