- 新建構建任務,初步定命名規範:組名縮寫-環境-倉庫名(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{
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