jenkins使用demo小記

  • 新建構建任務,初步定命名規範:組名縮寫-環境-倉庫名(or 組名縮寫-環境-倉庫名-描述)
    在這裏插入圖片描述
  • 構建任務配置,啓用用戶安全添加用戶並授權,非LDAP需要先註冊用戶
    在這裏插入圖片描述
  • 參數化構建
    在這裏插入圖片描述
    run_env不同環境對應值,其它值無效,其對應數據庫字段,不同環境對應相應服務器
dev test alpha beta prod
  • 如果需要進行自動化提交構建則進行此步驟,配置webhook自動化構建,到gitlab的對應倉庫設置hook對應的url,secret,需要自動化測試的分支,保存並測試
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 添加pipeline流水線腳本
pipeline{
    //運行節點設置
    agent {label 'master'}
    options {
        timestamps()
        skipDefaultCheckout()
    }

    stages {
        stage('prepare') {
            steps {
                echo '初始化相關變量...'
               script {
                    //branch_or_tag爲參數化構建參數,git會拉取分支或者標籤,run_env爲參數化構建的發佈環境,mode爲參數化構建的子目錄

                    //********** 只需要配置倉庫目錄名和倉庫地址,倉庫名和倉庫地址需要在倉庫字典存在對應一條記錄 start ***********
                    main_dir = 'ToolReviewCode'
                    main_git = 'git@XXXXXXXXXXXXX/ToolReviewCode.git'
                    //********** end *****************

                    //以下不需要配置
                    //主倉庫絕對路徑
                    repo_path = "${WORKSPACE}"
                    //臨時倉庫項目目錄
                    temp_project_path = "${BUILD_SPACE}/${currentBuild.projectName}"
                    //主倉庫臨時目錄
                    temp_repo_path = "$temp_project_path/${main_dir}"
                    //創建臨時目錄
                    sh "mkdir -p ${temp_project_path}"
                    

                }
            }
        }

        stage('checkout') {
           steps{
                //這裏需要配置
                //主倉庫拉取,只需要配置分支或標籤${branchOrTag},git_url
                echo '開始拉取代碼...'
                checkout([$class: 'GitSCM', branches: [[name: "${branch_or_tag}"]], userRemoteConfigs: [[url: "${main_git}"]]])
            }
        }

        

        stage('build') {
            steps {
                //發佈前構建
                //先同步到臨時目錄,rsync 命令,-a -z爲壓縮,-t爲保留文件時間屬性,如果是量全量同步則是加 --delete-after,排除.git文件,可根據自己需要我改參數,後面兩個目錄參數可不動,注意第一個要加'/',第二個不用
                sh "rsync -azt --exclude=.git ${repo_path}/ ${temp_repo_path}"

                //寫入主倉庫發佈標籤識別文件,方便出故障確認發佈版本,這裏可不動
                sh "echo ${branch_or_tag} > ${temp_repo_path}/deploy-version"

                
            }
        }
        stage('Test') {
            steps{
                //自動化測試,日後做自動化測試
                echo 'This is a test step'

            }
        }

        stage('Sonar') {
            //根據條件判斷是進行sonar掃描代碼
            //when {
                //    expression { return params.run_env == ''}
                //}
            steps {
                //sonar檢測,需要在項目根目錄配置sonar-scanner.properties
                echo 'sonar檢測...'
                echo 'This is a sonar stop'
                
                script {
                     def sonarqubeScannerHome = tool name: 'SonarQubeScanner'
                     withSonarQubeEnv('SonarQube') {
                            sh "${sonarqubeScannerHome}/bin/sonar-scanner"
                    }
                }
            }
        }
        //確認機制,可根據自己情況是否添加,這裏判斷如果是生產環境則進行手動發佈確認
        stage('confirmed') {
             when {
                  expression { return params.run_env == 'prod'}
              }
              steps {
                  timeout(time: 1, unit: 'HOURS') {
                       input message:'Are you sure?', ok:'Yes'
                  }

              }
        }
        stage('Deploy') {

            steps{
                //調用python腳本發佈到服務器
                //參數 env 發佈環境可選默認test,
                //參數 mode 個人開發目錄或灰度目錄,默認爲空
                //參數 git_url 倉庫地址必須,必須存在倉庫字典
                //參數 source_dir 倉庫臨時目錄路徑,必須
                //參數 code_run_path 倉庫運行目錄,可選,默認空字符串,如果爲空則會獲取倉庫字典設置的發佈目錄,可帶'/'可不帶'/',最終發佈目錄會是連接mode
                //參數  is_sync_delete 同步方式,全量或增量,默認增量False,如果是全量則可傳值True或1
                //參數 exclude-file 文件路徑,默認爲空,內容爲同步時排除的文件名或目錄名
                sh "cd ${JENKINS_HOME}/python_script && python3 deploy.py --git_url=${main_git} --source_dir=${temp_repo_path} --env=${run_env} --mode=${mode}"
            }
        }
    }
}
  • 具有依賴倉庫pipeline腳本模板
pipeline{
    agent any
    options {
        timestamps()
        skipDefaultCheckout()
    }

    stages {
        stage('prepare') {
            steps {
               script {
                    //branch_or_tag爲參數化構建參數,git會拉取分支或者標籤,run_env爲參數化構建的發佈環境,mode爲參數化構建的子目錄

                    //********** 只需要配置倉庫目錄名和倉庫地址,倉庫名和倉庫地址需要在倉庫字典存在對應一條記錄 start ***********
                    main_dir = 'XXX'
                    main_git = 'git@XXX:cloudserver/XXX'
                    //********** end *****************
                    //以下不需要配置
                    //主倉庫絕對路徑
                    repo_path = "${WORKSPACE}"
                    //臨時倉庫項目目錄
                    temp_project_path = "${BUILD_SPACE}/${currentBuild.projectName}"
                    //主倉庫臨時目錄
                    temp_repo_path = "$temp_project_path/${main_dir}"
                    //創建臨時目錄
                    sh "mkdir -p ${temp_project_path}"


                    //如果有依賴則定義每個依賴倉庫的目錄和分支或標籤,依賴的分支或標籤很少變動,可以寫死在這裏,也可以進行參數化構建,添加默認值
                    sdk_dir = 'sdk'
                    framework_dir = 'framework'
                    tsdk_dir = 'tSDK'
                    

                }
            }
        }

        stage('checkout') {
           steps{
               echo '拉取代碼...'
                //主倉庫拉取,只需要配置分支或標籤${branchOrTag},git_url
                checkout([$class: 'GitSCM', branches: [[name: "${branch_or_tag}"]],  userRemoteConfigs: [[url: "${main_git}"]]])
            }
        }

        stage('checkout rely') {
            //這裏是拉取依賴倉庫,可以並行執行,配置跟主倉庫類似
            parallel {
                stage('sdk') {
                    when {
                        expression { return params.sdk_branch_or_tag}
                    }
                    steps {
                        checkout([$class: 'GitSCM', branches: [[name: "${sdk_branch_or_tag}"]],  extensions: [[$class: "RelativeTargetDirectory", relativeTargetDir: "rely_temp/${sdk_dir}"]], userRemoteConfigs: [[url: 'git@XXXXXX/sdk.git']]])
                    }
                }

                stage('framework') {
                    when {
                        expression { return params.framework_branch_or_tag}
                    }
                    steps {
                        checkout([$class: 'GitSCM', branches: [[name: "${framework_branch_or_tag}"]],  extensions: [[$class: "RelativeTargetDirectory", relativeTargetDir: "rely_temp/${framework_dir}"]], userRemoteConfigs: [[url: 'git@XXXXXX/framework.git']]])
                    }
                }

                stage('tSDK') {
                    when {
                        expression { return params.tsdk_branch_or_tag}
                    }
                    steps {
                        checkout([$class: 'GitSCM', branches: [[name: "${tsdk_branch_or_tag}"]],  extensions: [[$class: "RelativeTargetDirectory", relativeTargetDir: "rely_temp/${tsdk_dir}"]], userRemoteConfigs: [[url: 'git@XXXXXX/tSDK.git']]])
                    }
                }

               

            }
        }

        stage('build') {
            steps {
                echo '構建代碼...'
                //發佈前構建
                //先同步到臨時目錄,rsync 命令,-a -z爲壓縮,-t爲保留文件時間屬性,如果是量同步則是加 --delete-after, 排除.git和依賴存放臨時目錄rely_temp,可根據自己需要我改參數,後面兩個目錄參數可不動,注意第一個要加'/',第二個不用
                sh "rsync -azt --exclude=.git --exclude=rely_temp ${repo_path}/ ${temp_repo_path}"

                //寫入主倉庫發佈標籤識別文件,方便出故障確認發佈版本
                sh "echo ${branch_or_tag} > ${temp_repo_path}/deploy-version"

                //如果有依賴,則進行依賴的同步,如果沒有,則下面省略
                
                script {
                    exclude_file = "${temp_repo_path}/exclude.list"
                    sh "echo '' > ${exclude_file}"

                    if (sdk_branch_or_tag) {
                        
                        sh "rsync -azt --exclude=.git ${WORKSPACE}/rely_temp/${sdk_dir}/ ${temp_repo_path}/protected/${sdk_dir}"
                        sh "echo ${sdk_branch_or_tag} > $temp_repo_path/protected/${sdk_dir}/deploy-version"
                    } else {
                        sh "echo 'protected/sdk' >> ${exclude_file}"
                        echo 'no sync sdk'
                    }

                    if (framework_branch_or_tag) {
                        
                        sh "rsync -azt --exclude=.git ${WORKSPACE}/rely_temp/${framework_dir}/ ${temp_repo_path}/protected/${framework_dir}"
                        sh "echo ${framework_branch_or_tag} > $temp_repo_path/protected/${framework_dir}/deploy-version"
                    } else {
                        sh "echo 'protected/framework' >> ${exclude_file}"
                        echo 'no sync framework'
                    }
                    if (tsdk_branch_or_tag) {
                        
                        sh "rsync -azt --exclude=.git ${WORKSPACE}/rely_temp/${tsdk_dir}/ ${temp_repo_path}/protected/${tsdk_dir}"
                        sh "echo ${tsdk_branch_or_tag} > $temp_repo_path/protected/${tsdk_dir}/deploy-version"
                    } else {
                        sh "echo 'protected/tSDK' >> ${exclude_file}"
                        echo 'no sync tSDK'
                    }

                }
            }
        }
        stage('Test') {
            steps{
                //自動化測試
                echo 'This is a test step'

            }
        }

        stage('Sonar') {
            //根據條件判斷是進行sonar掃描代碼
            //when {
                //    expression { return params.run_env == ''}
                //}
            steps {
                //sonar檢測,需要在項目根目錄配置sonar-scanner.properties
                echo 'sonar檢測...'
                echo 'This is a sonar stop'
                
                // script {
                //      def sonarqubeScannerHome = tool name: 'SonarQubeScanner'
                //      withSonarQubeEnv('SonarQube') {
                //             sh "${sonarqubeScannerHome}/bin/sonar-scanner"
                //     }
                // }
            }
        }
        //確認機制,可根據自己情況是否添加
        stage('confirmed') {
             when {
                  expression { return params.run_env == 'prod'}
              }
              steps {
                  timeout(time: 1, unit: 'HOURS') {
                       input message:'Are you sure?', ok:'Yes'
                  }

              }
        }
        stage('Deploy') {

            steps{
                //調用python腳本發佈到服務器
                //參數 env 發佈環境可選默認test,
                //參數 mode 個人開發目錄或灰度目錄,默認爲空
                //參數 git_url 倉庫地址必須,必須存在倉庫字典
                //參數 source_dir 倉庫臨時目錄路徑,必須
                //參數 code_run_path 倉庫運行目錄,可選,默認空字符串,如果爲空則會獲取倉庫字典設置的發佈目錄,可帶'/'可不帶'/',最終發佈目錄會是連接mode
                //參數  is_sync_delete 同步方式,全量或增量,默認增量False,如果是全量則可傳值True或1
                //參數 exclude-file 文件路徑,默認爲空,內容爲同步時排除的文件名或目錄名
                sh "cd ${JENKINS_HOME}/python_script && python3 deploy.py --git_url=${main_git} --source_dir=${temp_repo_path} --env=${run_env} --mode=${mode} --exclude_file=${exclude_file} --is_sync_delete=1"
            }
        }
    }
}
  • 參數化構建的時候第一次執行時可能會出現以下問題,無法拉取代碼的分支或標籤,可嘗試在腳本中先寫死branch_or_tag的值,去掉branch_or_tag參數 ,執行構建一次,再加上branch_or_tag參數就可以了,目前還無法定位到這個問題的原因,或者如果嫌麻煩可心把branch_or_tag定義爲字符串參數,手動輸入分支或標籤
    在這裏插入圖片描述
  • 如果需要做sonar檢測,需要在項目根目錄添加 sonar-project.properties 文件
# unique project identifier (required)

sonar.projectKey = ToolReviewCode:1.1

# project metadata (used to be required, optional since SonarQube 6.1)
sonar.projectName=ToolReviewCode
sonar.projectVersion=1.6

# path to source directories (required)

sonar.sources = backend,frontend,common

#sonar.exclusions=
# path to test source directories (optional)
#sonar.tests=testDir1,testDir2

# path to Java project compiled classes (optional)
#sonar.java.binaries=bin

# comma-separated list of paths to libraries (optional)
#sonar.java.libraries=path/to/library.jar,path/to/classes/dir

# Additional parameters
###sonar.my.property=value
#########
#####
sonar.sourceEncoding=UTF-8
#sonar.java.source=1.8
#sonar.java.target=1.8
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章