DevOps之Jenkins流水線

1 、Jenkins流水線任務(wù)介紹

之前采用Jenkins的自由風(fēng)格構(gòu)建的項目,每個步驟流程都要通過不同的方式設(shè)置,并且構(gòu)建過程中整體流程是不可見的,無法確認(rèn)每個流程花費的時間,并且問題不方便定位問題。

Jenkins的Pipeline可以讓項目的發(fā)布整體流程可視化,明確執(zhí)行的階段,可以快速的定位問題。并且整個項目的生命周期可以通過一個Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在項目中維護(hù)。

所以Pipeline相對自由風(fēng)格或者其他的項目風(fēng)格更容易操作。

2、 Jenkins流水線任務(wù)

2.1、 構(gòu)建Jenkins流水線任務(wù)
  • 構(gòu)建任務(wù)

    構(gòu)建Jenkins流水線任務(wù)
  • 生成Groovy腳本

    Hello World腳本生成
  • 構(gòu)建后查看視圖

    構(gòu)建后查看視圖
2.2、 Groovy腳本
  • Groovy腳本基礎(chǔ)語法

    // 所有腳本命令包含在pipeline{}中
    pipeline {  
      // 指定任務(wù)在哪個節(jié)點執(zhí)行(Jenkins支持分布式)
        agent any
        
        // 配置全局環(huán)境,指定變量名=變量值信息
        environment{
          host = '192.168.117.112'
        }
    
        // 存放所有任務(wù)的合集
        stages {
          // 單個任務(wù)
            stage('任務(wù)1') {
              // 實現(xiàn)任務(wù)的具體流程
                steps {
                    echo 'do something'
                }
            }
          // 單個任務(wù)
            stage('任務(wù)2') {
              // 實現(xiàn)任務(wù)的具體流程
                steps {
                    echo 'do something'
                }
            }
            // ……
        }
    }
    
  • 編寫例子測試

    pipeline {
        agent any
    
        // 存放所有任務(wù)的合集
        stages {
            stage('拉取Git代碼') {
                steps {
                    echo '拉取Git代碼'
                }
            }
    
            stage('檢測代碼質(zhì)量') {
                steps {
                    echo '檢測代碼質(zhì)量'
                }
            }
    
            stage('構(gòu)建代碼') {
                steps {
                    echo '構(gòu)建代碼'
                }
            }
    
            stage('制作自定義鏡像并發(fā)布Harbor') {
                steps {
                    echo '制作自定義鏡像并發(fā)布Harbor'
                }
            }
    
            stage('基于Harbor部署工程') {
                steps {
                    echo '基于Harbor部署工程'
                }
            }
        }
    }
    
    配置Grovvy腳本
  • 查看效果

    查看效果

Ps:涉及到特定腳本,Jenkins給予了充足的提示,可以自動生成命令

生成命令位置
2.3、 Jenkinsfile實現(xiàn)

Jenkinsfile方式需要將腳本內(nèi)容編寫到項目中的Jenkinsfile文件中,每次構(gòu)建會自動拉取項目并且獲取項目中Jenkinsfile文件對項目進(jìn)行構(gòu)建

  • 配置pipeline

    配置pipeline
  • 準(zhǔn)備Jenkinsfile

    準(zhǔn)備Jenkinsfile文件
  • 測試效果

    測試效果

3、 Jenkins流水線任務(wù)實現(xiàn)

3.1、 參數(shù)化構(gòu)建

添加參數(shù)化構(gòu)建,方便選擇不的項目版本

Git參數(shù)化構(gòu)建
3.2、 拉取Git代碼

通過流水線語法生成Checkout代碼的腳本

語法生成

將*/master更改為標(biāo)簽${tag}

pipeline {
    agent any
    stages {

        stage('拉取Git代碼') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
            }
        }
    }
}
3.3、 構(gòu)建代碼

通過腳本執(zhí)行mvn的構(gòu)建命令

pipeline {
    agent any

    stages {

        stage('拉取Git代碼') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
            }
        }

        stage('構(gòu)建代碼') {
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
            }
        }
    }
}
3.4、 代碼質(zhì)量檢測

通過腳本執(zhí)行sonar-scanner命令即可

pipeline {
    agent any

    stages {

        stage('拉取Git代碼') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
            }
        }

        stage('構(gòu)建代碼') {
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
            }
        }

        stage('檢測代碼質(zhì)量') {
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=31388be45653876c1f51ec02f0d478e2d9d0e1fa' 
            }
        }
    }
}

3.5、 制作自定義鏡像并發(fā)布
  • 生成自定義鏡像腳本
  pipeline {
      agent any
      environment{
          harborHost = '192.168.117.112:80'
          harborRepo = 'repo'
          harborUser = 'admin'
          harborPasswd = 'Harbor12345'
      }
  
      // 存放所有任務(wù)的合集
      stages {
  
          stage('拉取Git代碼') {
              steps {
                  checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
              }
          }
  
          stage('構(gòu)建代碼') {
              steps {
                  sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
              }
          }
  
          stage('檢測代碼質(zhì)量') {
              steps {
                  sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=31388be45653876c1f51ec02f0d478e2d9d0e1fa' 
              }
          }
  
          stage('制作自定義鏡像并發(fā)布Harbor') {
              steps {
                  sh '''cp ./target/*.jar ./docker/
                  cd ./docker
                  docker build -t ${JOB_NAME}:${tag} ./'''
  
                  sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}
                  docker tag ${JOB_NAME}:${tag} ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}
                  docker push ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}'''
              }
          }
      }
  }
  • 生成Publish Over SSH腳本
pipeline {
    agent any
    environment{
        harborHost = '192.168.117.112:80'
        harborRepo = 'repo'
        harborUser = 'admin'
        harborPasswd = 'Harbor12345'
    }
    stages {

        stage('拉取Git代碼') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
            }
        }

        stage('構(gòu)建代碼') {
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
            }
        }

        stage('檢測代碼質(zhì)量') {
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=dc4cbe2bca153ad1baf5adba7e02ddd2288ef53f' 
            }
        }
        

        stage('制作自定義鏡像并發(fā)布Harbor') {
            steps {
                sh '''cp ./target/*.jar ./docker/
                cd ./docker
                docker build -t ${JOB_NAME}:${tag} ./'''
  
                sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}
                docker tag ${JOB_NAME}:${tag} ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}
                docker push ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}'''
            }
        }

        stage('目標(biāo)服務(wù)器拉取鏡像并運行') {
              steps {
                  sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborHost $harborRepo $JOB_NAME $tag $container_port $host_port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
              }
          }
    }
}

Ps:由于采用變量,記得使用雙引號

4、 Jenkins流水線整合釘釘

在程序部署成功后,可以通過釘釘?shù)臋C器人及時向群眾發(fā)送部署的最終結(jié)果通知

  • 安裝插件

    安裝插件
  • 釘釘內(nèi)部創(chuàng)建群組并構(gòu)建機器人

    釘釘內(nèi)部創(chuàng)建群組并構(gòu)建機器人

    最終或獲取到Webhook信息

https://oapi.dingtalk.com/robot/send?access_token=bf92a9c16c58bf6244cedebca6175eb38b6aa47e833f0de830993d995ce080cb
  • 系統(tǒng)配置添加釘釘通知

    配置釘釘通知
  • 任務(wù)中追加流水線配置
pipeline {
    agent any
    environment{
        harborHost = '192.168.117.112:80'
        harborRepo = 'repo'
        harborUser = 'admin'
        harborPasswd = 'Harbor12345'
    }
    stages {

        stage('拉取Git代碼') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
            }
        }

        stage('構(gòu)建代碼') {
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
            }
        }

        stage('檢測代碼質(zhì)量') {
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=dc4cbe2bca153ad1baf5adba7e02ddd2288ef53f' 
            }
        }
        

        stage('制作自定義鏡像并發(fā)布Harbor') {
            steps {
                sh '''cp ./target/*.jar ./docker/
                cd ./docker
                docker build -t ${JOB_NAME}:${tag} ./'''
  
                sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}
                docker tag ${JOB_NAME}:${tag} ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}
                docker push ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}'''
            }
        }

        stage('目標(biāo)服務(wù)器拉取鏡像并運行') {
              steps {
                  sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborHost $harborRepo $JOB_NAME $tag $container_port $host_port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
              }
          }
    }
    post {
        success {
            dingtalk (
                robot: 'Jenkins-DingDing',
                type:'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 成功構(gòu)建:${JOB_NAME}項目!\n- 版本:${tag}\n- 持續(xù)時間:${currentBuild.durationString}\n- 任務(wù):#${JOB_NAME}"]
              )
          }
        failure {
            dingtalk (
                robot: 'Jenkins-DingDing',
                type:'MARKDOWN',
                title: "fail: ${JOB_NAME}",
                text: ["- 失敗構(gòu)建:${JOB_NAME}項目!\n- 版本:${tag}\n- 持續(xù)時間:${currentBuild.durationString}\n- 任務(wù):#${JOB_NAME}"]
              )
        }
    }
}
  • 查看效果

    釘釘通知效果

5、 Jenkins流水線從GitLab拉取腳本

5.1、流水線使用SCM
5.2、創(chuàng)建Jenkinsfile
5.3、編寫腳本
效果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容