GitLabCI模板庫的流水線優(yōu)化實踐
還是按照之前的目錄結(jié)構(gòu)完成的,jobs目錄用于存放作業(yè)模板。templates目錄用于存放流水線模板。這次使用default-pipeline.yml作為所有作業(yè)的基礎模板。
作業(yè)模板
作業(yè)分為Build、test、codeanalysis、artifactory、deploy部分,在每個作業(yè)中配置了rules功能開關(guān),由變量控制最終作業(yè)的運行。
jobs/build.yml 構(gòu)建作業(yè)模板
包含兩個作業(yè)模板,分別是普通的構(gòu)建模板(maven/npm/gradle)和docker 鏡像構(gòu)建模板。
- ## build相關(guān)作業(yè)
- .build:
- stage: build
- script:
- - |
- ${BUILD_SHELL}
- variables:
- GIT_CHECKOUT: "true"
- rules:
- - if: " $RUN_PIPELINE_BUILD == 'no' "
- when: never
- - when: always
- ## 構(gòu)建鏡像
- .build-docker:
- stage: buildimage
- script:
- - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWD $CI_REGISTRY
- - docker build -t ${IMAGE_NAME} -f ${DOCKER_FILE_PATH} .
- - docker push ${IMAGE_NAME}
- - docker rmi ${IMAGE_NAME}
- rules:
- - if: " $RUN_BUILD_IMAGE == 'no' "
- when: never
- - when: always
jobs/test.yml 測試作業(yè)模板
主要用于運行項目單元測試,例如maven、gradle、npm單元測試。
- #單元測試
- .test:
- stage: test
- script:
- - $TEST_SHELL
- artifacts:
- reports:
- junit: ${JUNIT_REPORT_PATH}
- rules:
- - if: " $RUN_PIPELINE_TEST == 'no' "
- when: never
- - when: always
jobs/codeanalysis.yml 代碼掃描模板
包含兩個作業(yè)模板,分別為掃描作業(yè)和獲取掃描結(jié)果。這里面將掃描參數(shù)進行了分類,通用的項目參數(shù)、特殊的合并請求參數(shù)、自定義的項目參數(shù)。
- ##代碼掃描
- ##
- ##
- ##
- .code_analysis:
- variables:
- GLOBAL_PROJECT_ARGS: "-Dsonar.projectKey=${CI_PROJECT_NAME}
- -Dsonar.projectName=${CI_PROJECT_NAME}
- -Dsonar.projectVersion=${CI_COMMIT_REF_NAME}
- -Dsonar.projectDescription=${CI_PROJECT_TITLE}"
- GLOBAL_SERVER_ARGS: "-Dsonar.ws.timeout=30
- -Dsonar.links.homepage=${CI_PROJECT_URL}
- -Dsonar.host.url=${SONAR_SERVER_URL}
- -Dsonar.login=${SONAR_SERVER_LOGIN}
- -Dsonar.sourceEncoding=UTF-8 "
- GLOBAL_MR_ARGS: " -Dsonar.pullrequest.key=${CI_MERGE_REQUEST_IID}
- -Dsonar.pullrequest.branch=${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}
- -Dsonar.pullrequest.base=${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
- -Dsonar.gitlab.ref_name=${CI_COMMIT_REF_NAME}
- -Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA}
- -Dsonar.gitlab.project_id=${CI_PROJECT_PATH}
- -Dsonar.pullrequest.gitlab.repositorySlug=${CI_PROJECT_ID} "
- MULTI_BRANCH_ARGS: "-Dsonar.branch.name=${CI_COMMIT_REF_NAME}"
- stage: code_analysis
- script:
- - echo ${GLOBAL_PROJECT_ARGS} ${GLOBAL_SERVER_ARGS} ${SONAR_SCAN_ARGS} ${GLOBAL_MR_ARGS}
- #sonar-scanner $GLOBAL_PROJECT_ARGS $GLOBAL_SERVER_ARGS $SCAN_JAVA_ARGS
- - |
- if [ $CI_PIPELINE_SOURCE == 'merge_request_event' ]
- then
- echo "sonar-scanner ${GLOBAL_PROJECT_ARGS} ${GLOBAL_SERVER_ARGS} ${SONAR_SCAN_ARGS} "
- sonar-scanner ${GLOBAL_PROJECT_ARGS} ${GLOBAL_SERVER_ARGS} ${SONAR_SCAN_ARGS}
- else
- echo "sonar-scanner ${GLOBAL_PROJECT_ARGS} ${GLOBAL_SERVER_ARGS} ${SONAR_SCAN_ARGS} ${MULTI_BRANCH_ARGS}"
- sonar-scanner ${GLOBAL_PROJECT_ARGS} ${GLOBAL_SERVER_ARGS} ${SONAR_SCAN_ARGS} ${MULTI_BRANCH_ARGS}
- fi
- rules:
- - if: " $RUN_CODE_ANALYSIS == 'no' "
- when: never
- - when: always
- #### 獲取代碼掃描結(jié)果
- .get_analysis_result:
- stage: get_analysis_result
- script:
- - |
- SONAR_REPORT_URL=$(grep "ceTaskUrl" .scannerwork/report-task.txt | awk -F = '{OFS="=";print $2,$3}')
- echo ${SONAR_REPORT_URL}
- for i in {1..10}
- do
- curl -k -u "${SONAR_SERVER_LOGIN}":"" ${SONAR_REPORT_URL} -o sonar_result.txt -s
- grep '"status":"SUCCESS"' sonar_result.txt && SONAR_SCAN_RESULT='SUCCESS'
- if [ ${SONAR_SCAN_RESULT} == 'SUCCESS' ]
- then
- echo "${SONAR_SCAN_RESULT}"
- SONAR_SCAN_RESULT=SUCCESS
- curl -k -u "${SONAR_SERVER_LOGIN}":"" "${SONAR_SERVER_URL}/api/qualitygates/project_status?projectKey=$CI_PROJECT_NAME&branch=$CI_COMMIT_REF_NAME" -o result.txt -s
- echo "result info ---->>>>>"
- cat result.txt
- result=`cat result.txt | awk -F ':' '{print $3}' | awk -F '"' '{print$2}'`
- echo $result
- if [ $result == 'ERROR' ]
- then
- echo "${result}"
- exit 122
- break;
- else
- echo "success!"
- break;
- fi
- else
- SONAR_SCAN_RESULT='ERROR'
- echo "第$i次獲取結(jié)果信息,不是成功狀態(tài),睡眠10秒!"
- cat sonar_result.txt
- sleep 10
- fi
- done
- rules:
- - if: " $RUN_CODE_ANALYSIS == 'no' "
- when: never
- - when: always
jobs/artifactory.yml 制品管理作業(yè)
包含兩個作業(yè),制品上傳與下載。使用artifactory制品庫接口。
- ## 制品庫相關(guān)
- ##
- .deploy-artifact:
- stage: deploy-artifact
- script:
- - echo "curl -u${ARTIFACT_USER}:${ARTIFACT_PASSWD} -T ${ARTIFACT_PATH} $ARTIFACTORY_URL/$ARTIFACTORY_NAME/$TARGET_FILE_PATH/$TARGET_ARTIFACT_NAME"
- - curl -u${ARTIFACT_USER}:${ARTIFACT_PASSWD} -T ${ARTIFACT_PATH} "$ARTIFACTORY_URL/$ARTIFACTORY_NAME/$TARGET_FILE_PATH/$TARGET_ARTIFACT_NAME"
- rules:
- - if: " $RUN_DEPLOY_ARTIFACTS == 'no' "
- when: never
- - when: always
- .down-artifact:
- stage: down-artifact
- script:
- - curl -u${ARTIFACT_USER}:${ARTIFACT_PASSWD} -O "$ARTIFACTORY_URL/$ARTIFACTORY_NAME/$TARGET_FILE_PATH/$TARGET_ARTIFACT_NAME"
- - ls
jobs/deploy.yml 發(fā)布作業(yè)模板
發(fā)布基于k8s的發(fā)布和回滾配置。
- ## 應用發(fā)布
- ## 使用kubectl鏡像發(fā)布
- .deploy_k8s:
- stage: deploy
- script:
- - echo $KUBE_TOKEN
- - kubectl config set-cluster my-cluster --server=${KUBE_URL} --certificate-authority="${KUBE_CA_PEM_FILE}"
- - kubectl config set-credentials admin --token=${KUBE_TOKEN}
- - ls -a
- - sed -i "s#__namespace__#${NAMESPACE}#g" ${DEPLOY_FILE}
- - sed -i "s#__appname__#${APP_NAME}#g" ${DEPLOY_FILE}
- - sed -i "s#__containerport__#${CONTAINER_PORT}#g" ${DEPLOY_FILE}
- - sed -i "s#__nodeport__#${NODE_PORT}#g" ${DEPLOY_FILE}
- - sed -i "s#__imagename__#${IMAGE_NAME}#g" ${DEPLOY_FILE}
- - sed -i "s#__CI_ENVIRONMENT_SLUG__#${CI_ENVIRONMENT_SLUG}#g" ${DEPLOY_FILE}
- - sed -i "s#__CI_PROJECT_PATH_SLUG__#${CI_PROJECT_PATH_SLUG}#g" ${DEPLOY_FILE}
- - sed -i "s#__ingressdomain__#${ENV_URL}#g" ${DEPLOY_FILE}
- - cat ${DEPLOY_FILE}
- - "kubectl create secret docker-registry ${APP_NAME} \
- --docker-server=${CI_REGISTRY} \
- --docker-username=$CI_REGISTRY_USER \
- --docker-password=${CI_REGISTRY_PASSWD} \
- --docker-email=test@test.com -n ${NAMESPACE} || echo 'secrets already exists'"
- - kubectl apply -f ${DEPLOY_FILE}
- rules:
- - if: " $RUN_DEPLOY_K8S == 'no'"
- when: never
- - when: manual
- environment:
- name: "${ENV_NAME}"
- url: "http://${ENV_NAME}.${CI_PROJECT_NAMESPACE}.${CI_PROJECT_NAME}.devops.com"
- ## 回滾
- .rollout_k8s:
- stage: deploy
- script:
- - rm -rf $HOME/.kube
- - kubectl config set-cluster my-cluster --server=${KUBE_URL} --certificate-authority="${KUBE_CA_PEM_FILE}"
- - kubectl config set-credentials admin --token=${KUBE_TOKEN}
- - kubectl rollout history deployment ${APP_NAME} -n ${NAMESPACE}
- - kubectl rollout undo deployment ${APP_NAME} -n ${NAMESPACE}
- rules:
- - if: " $RUN_DEPLOY_K8S == 'no' "
- when: never
- - when: manual
- environment:
- name: "${ENV_NAME}"
- action: stop
default流水線模板
templates/default-pipeline.yml 模板分成個部分:
- include導入作業(yè)模板
- variables 定義全局變量
- workflow 定義流水線控制
- jobs 構(gòu)建與發(fā)布作業(yè)
include導入作業(yè)模板
- include:
- - project: 'cidevops/cidevops-newci-service'
- ref: master
- file: 'jobs/build.yml'
- - project: 'cidevops/cidevops-newci-service'
- ref: master
- file: 'jobs/test.yml'
- - project: 'cidevops/cidevops-newci-service'
- ref: master
- file: 'jobs/codeanalysis.yml'
- - project: 'cidevops/cidevops-newci-service'
- ref: master
- file: 'jobs/deploy.yml'
- - project: 'cidevops/cidevops-newci-service'
- ref: master
- file: 'jobs/artifactory.yml'
variables 定義全局變量
- variables:
- ## 全局配置
- GIT_CLONE_PATH: ${CI_BUILDS_DIR}/builds/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}/${CI_PIPELINE_ID}
- GIT_CHECKOUT: "false"
- CACHE_DIR: ""
- ## 作業(yè)控制
- RUN_PIPELINE_BUILD: "" #是否運行構(gòu)建 yes/no
- RUN_PIPELINE_TEST: "" #是否運行測試 yes/no
- RUN_CODE_ANALYSIS: "" #是否代碼掃描 yes/no
- RUN_BUILD_IMAGE: "" #是否生成鏡像 yes/no
- RUN_DEPLOY_ARTIFACTS: "" #是否上傳制品 yes/no
- RUN_DEPLOY_K8S: "" #是否發(fā)布K8S yes/no
- ## 依賴容器鏡像
- BUILD_IMAGE: ""
- CURL_IMAGE: "curlimages/curl:7.70.0"
- SONAR_IMAGE: "sonarsource/sonar-scanner-cli:latest"
- KUBECTL_IMAGE: "lucj/kubectl:1.17.2"
- ## 構(gòu)建測試參數(shù)
- MAVEN_OPTS: "" #maven構(gòu)建參數(shù)
- GRADLE_OPTS: "" #gradle構(gòu)建參數(shù)
- BUILD_SHELL: '' #構(gòu)建命令
- ## 單元測試參數(shù)
- TEST_SHELL : 'mvn test --settings=./settings.xml ' #測試命令
- JUNIT_REPORT_PATH: 'target/surefire-reports/TEST-*.xml' #單元測試報告
- ## 代碼掃描
- SONAR_SOURCE_DIR : "src" #項目源碼目錄
- SONAR_SERVER_URL: "http://192.168.1.200:30090" #SonarQube服務器信息
- SONAR_SERVER_LOGIN: "ee2bcb37deeb6dfe3a07fe08fb529559b00c1b7b" #Sonar Token最好在項目中定義。
- SONAR_SCAN_ARGS: "-Dsonar.sources=${SONAR_SOURCE_DIR}" #項目掃描參數(shù)
- ## 構(gòu)建鏡像
- CI_REGISTRY: 'registry.cn-beijing.aliyuncs.com' #鏡像倉庫地址
- CI_REGISTRY_USER: 'xxxxxx' #倉庫用戶信息
- #CI_REGISTRY_PASSWD: 'xxxxxxxx.' #倉庫用戶密碼
- IMAGE_NAME: "${CI_REGISTRY}/${CI_PROJECT_PATH}:${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}" #鏡像名稱
- DOCKER_FILE_PATH: "./Dockerfile" #Dockerfile位置
- ## 上傳制品庫(artifactory)
- ARTIFACTORY_URL: "http://192.168.1.200:30082/artifactory" #制品庫地址
- ARTIFACTORY_NAME: "${CI_PROJECT_NAMESPACE}" #制品庫名稱
- ARTIFACT_PACKAGE: "jar" #制品類型
- ARTIFACT_PATH: "target/*.${ARTIFACT_PACKAGE}" #制品位置
- TARGET_FILE_PATH: "${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}/${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}" #目標制品位置(目錄結(jié)構(gòu))
- TARGET_ARTIFACT_NAME: "${CI_PROJECT_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}.${ARTIFACT_PACKAGE}" #目標制品名稱
- ## 部署應用k8s
- APP_NAME: "$CI_PROJECT_NAME" #應用名稱 <--> deploymentName
- CONTAINER_PORT: "8081" #服務端口 <--> servicesPort
- NAMESPACE: "$CI_PROJECT_NAME-$CI_PROJECT_ID-$CI_ENVIRONMENT_SLUG" #名稱空間
- ENV_URL: "${ENV_NAME}.${CI_PROJECT_NAMESPACE}.${CI_PROJECT_NAME}.devops.com" #IngressHosts
流水線設置
- ## 流水線控制
- workflow:
- rules:
- - if: "$CI_MERGE_REQUEST_ID" #過濾合并請求
- when: never
- - if: "$CI_PIPELINE_SOURCE == 'web'" #允許在web頁面發(fā)布
- - if: "$CI_COMMIT_REF_NAME =~ /^RELEASE-*/ || $CI_COMMIT_REF_NAME =~ /master/ " #過濾版本分支和主干分支提交代碼觸發(fā)
- when: never
- - if: "$CI_COMMIT_BEFORE_SHA == '0000000000000000000000000000000000000000'" #過濾分支創(chuàng)建請求
- when: never
- ### 默認策略
- - when: always
- ## 運行階段
- stages:
- - build
- - test
- - parallel01
- - get_analysis_result
- - deploy-artifact
- - deploy-feature
- - rollout-feature
- - deploy-uat
- - rollout-uat
- - deploy-stag
- - rollout-stag
- - deploy-prod
- - rollout-prod
- cache:
- paths:
- - ${CACHE_DIR}
- before_script:
- - export
構(gòu)建作業(yè)配置
- ################# Jobs Configure #####################
- ## 構(gòu)建作業(yè)
- build:
- image: ${BUILD_IMAGE}
- extends: .build
- ## 測試作業(yè)
- test:
- image: ${BUILD_IMAGE}
- extends: .test
- before_script:
- - ls
- - ls ${CACHE_DIR}
- ## 代碼掃描
- code_analysis:
- stage: parallel01
- image: ${SONAR_IMAGE}
- extends: .code_analysis
- ## 獲取構(gòu)建結(jié)果
- get_analysis_result:
- image: ${CURL_IMAGE}
- extends: .get_analysis_result
- needs:
- - code_analysis
- ## 構(gòu)建鏡像
- build_image:
- image: docker:latest
- services:
- - name: docker:dind
- stage: parallel01
- extends: .build-docker
- ## 上傳制品
- deploy_artifact:
- image: ${CURL_IMAGE}
- stage: deploy-artifact
- extends: .deploy-artifact
- ## 下載制品
- #down_artifact:
- # image: ${CURL_IMAGE}
- # stage: down_artifact
- # extends: .down-artifact
發(fā)布部署作業(yè)配置
- #################Deploy Feature Jobs Configure #####################
- ## feature發(fā)布應用
- deploy_feature:
- variables:
- DEPLOY_FILE: 'deployment.yaml'
- ENV_NAME: 'feature'
- stage: deploy-feature
- image: ${KUBECTL_IMAGE}
- extends: .deploy_k8s
- environment:
- on_stop: "rollout_feature"
- rules:
- - if: $RUN_DEPLOY_K8S == 'no'
- when: never
- - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ || $CI_COMMIT_REF_NAME =~ /master/ || $CI_COMMIT_TAG
- when: never
- - when: manual
- ## 應用回滾
- rollout_feature:
- variables:
- DEPLOY_FILE: 'deployment.yaml'
- ENV_NAME: 'feature'
- stage: rollout-feature
- image: ${KUBECTL_IMAGE}
- extends: .rollout_k8s
- needs:
- - deploy_feature
- rules:
- - if: $RUN_DEPLOY_K8S == 'no'
- when: never
- - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ || $CI_COMMIT_REF_NAME =~ /master/ || $CI_COMMIT_TAG
- when: never
- - when: on_failure
- #################Deploy UAT Jobs Configure #####################
- ## UAT
- deploy_uat:
- variables:
- DEPLOY_FILE: 'config/deployment-uat.yaml'
- ENV_NAME: 'uat'
- stage: deploy-uat
- image: ${KUBECTL_IMAGE}
- extends: .deploy_k8s
- environment:
- on_stop: "rollout_uat"
- rules:
- - if: $RUN_DEPLOY_K8S == 'no'
- when: never
- - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ || $CI_COMMIT_REF_NAME =~ /master/ || $CI_COMMIT_TAG
- when: manual
- - when: never
- ## UAT應用回滾
- rollout_uat:
- variables:
- DEPLOY_FILE: 'config/deployment-uat.yaml'
- ENV_NAME: 'uat'
- stage: rollout-uat
- image: ${KUBECTL_IMAGE}
- extends: .rollout_k8s
- needs:
- - deploy_uat
- rules:
- - if: $RUN_DEPLOY_K8S == 'no'
- when: never
- - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ || $CI_COMMIT_REF_NAME =~ /master/ || $CI_COMMIT_TAG
- when: on_failure
- - when: never
- #################Deploy STAG Jobs Configure #####################
- ## STAG
- deploy_stag:
- variables:
- DEPLOY_FILE: 'config/deployment-stag.yaml'
- ENV_NAME: 'stag'
- stage: deploy-stag
- image: ${KUBECTL_IMAGE}
- extends: .deploy_k8s
- environment:
- on_stop: "rollout_stag"
- needs:
- - deploy_uat
- rules:
- - if: $RUN_DEPLOY_K8S == 'no'
- when: never
- - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ || $CI_COMMIT_REF_NAME =~ /master/ || $CI_COMMIT_TAG
- when: manual
- - when: never
- ## STAG應用回滾
- rollout_stag:
- variables:
- DEPLOY_FILE: 'config/deployment-stag.yaml'
- ENV_NAME: 'stag'
- stage: rollout-stag
- image: ${KUBECTL_IMAGE}
- extends: .rollout_k8s
- needs:
- - deploy_stag
- rules:
- - if: $RUN_DEPLOY_K8S == 'no'
- when: never
- - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ || $CI_COMMIT_REF_NAME =~ /master/ || $CI_COMMIT_TAG
- when: on_failure
- - when: never
- #################Deploy PROD Jobs Configure #####################
- ## PROD
- deploy_prod:
- variables:
- DEPLOY_FILE: 'config/deployment-prod.yaml'
- ENV_NAME: 'prod'
- stage: deploy-prod
- image: ${KUBECTL_IMAGE}
- extends: .deploy_k8s
- environment:
- on_stop: "rollout_prod"
- needs:
- - deploy_stag
- rules:
- - if: $RUN_DEPLOY_K8S == 'no'
- when: never
- - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ || $CI_COMMIT_REF_NAME =~ /master/ || $CI_COMMIT_TAG
- when: manual
- - when: never
- ## PROD應用回滾
- rollout_prod:
- variables:
- DEPLOY_FILE: 'config/deployment-prod.yaml'
- ENV_NAME: 'prod'
- stage: rollout-prod
- image: ${KUBECTL_IMAGE}
- extends: .rollout_k8s
- needs:
- - deploy_prod
- rules:
- - if: $RUN_DEPLOY_K8S == 'no'
- when: never
- - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ || $CI_COMMIT_REF_NAME =~ /master/ || $CI_COMMIT_TAG
- when: on_failure
- - when: never
JAVA項目交付流水線
導入作業(yè)模板
- include:
- - project: 'cidevops/cidevops-newci-service'
- ref: master
- file: 'templates/default-pipeline.yml'
配置項目參數(shù)
- variables:
- ## 全局配置
- GIT_CLONE_PATH: ${CI_BUILDS_DIR}/builds/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}/${CI_PIPELINE_ID}
- GIT_CHECKOUT: "false"
- CACHE_DIR: "target/"
- ## 作業(yè)控制
- RUN_PIPELINE_BUILD: "yes" #是否運行構(gòu)建 yes/no
- RUN_PIPELINE_TEST: "yes" #是否運行測試 yes/no
- RUN_CODE_ANALYSIS: "yes" #是否代碼掃描 yes/no
- RUN_BUILD_IMAGE: "yes" #是否生成鏡像 yes/no
- RUN_DEPLOY_ARTIFACTS: "no" #是否上傳制品 yes/no
- RUN_DEPLOY_K8S: "yes" #是否發(fā)布K8S yes/no
- ## 依賴容器鏡像
- BUILD_IMAGE: "maven:3.6.3-jdk-8"
- CURL_IMAGE: "curlimages/curl:7.70.0"
- SONAR_IMAGE: "sonarsource/sonar-scanner-cli:latest"
- KUBECTL_IMAGE: "lucj/kubectl:1.17.2"
- ## 構(gòu)建測試參數(shù)
- MAVEN_OPTS: "-Dmaven.repo.local=/home/gitlab-runner/ci-build-cache/maven " #maven構(gòu)建參數(shù)
- BUILD_SHELL: 'mvn clean package -DskipTests --settings=./settings.xml ' #構(gòu)建命令
- #GRADLE_OPTS: "" #gradle構(gòu)建參數(shù)
- ## 單元測試參數(shù)
- TEST_SHELL : 'mvn test --settings=./settings.xml ' #測試命令
- JUNIT_REPORT_PATH: 'target/surefire-reports/TEST-*.xml' #單元測試報告
- ## 代碼掃描
- SONAR_SOURCE_DIR : "src" #項目源碼目錄
- SONAR_SERVER_URL: "http://192.168.1.200:30090" #SonarQube服務器信息
- SONAR_SERVER_LOGIN: "ee2bcb37deeb6dfe3a07fe08fb529559b00c1b7b" #Sonar Token最好在項目中定義。
- SONAR_SCAN_ARGS: "-Dsonar.sources=${SONAR_SOURCE_DIR}
- -Dsonar.java.binaries=target/classes
- -Dsonar.java.test.binaries=target/test-classes
- -Dsonar.java.surefire.report=target/surefire-reports " #項目掃描參數(shù)
- ## 構(gòu)建鏡像
- CI_REGISTRY: 'registry.cn-beijing.aliyuncs.com' #鏡像倉庫地址
- CI_REGISTRY_USER: 'xxxxxx' #倉庫用戶信息
- #CI_REGISTRY_PASSWD: 'xxxxxxxx.' #倉庫用戶密碼
- IMAGE_NAME: "${CI_REGISTRY}/${CI_PROJECT_PATH}:${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}" #鏡像名稱
- DOCKER_FILE_PATH: "./Dockerfile" #Dockerfile位置
- ## 上傳制品庫(artifactory)
- #ARTIFACTORY_URL: "http://192.168.1.200:30082/artifactory" #制品庫地址
- #ARTIFACTORY_NAME: "${CI_PROJECT_NAMESPACE}" #制品庫名稱
- #ARTIFACT_PACKAGE: "jar" #制品類型
- #ARTIFACT_PATH: "target/*.${ARTIFACT_PACKAGE}" #制品位置
- #TARGET_FILE_PATH: "${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}/${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}" #目標制品位置(目錄結(jié)構(gòu))
- #TARGET_ARTIFACT_NAME: "${CI_PROJECT_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}.${ARTIFACT_PACKAGE}" #目標制品名稱
- ## 部署應用k8s
- APP_NAME: "$CI_PROJECT_NAME" #應用名稱 <-->deploymentName
- CONTAINER_PORT: "8081" #服務端口 <--> servicesPort
- NAMESPACE: "$CI_PROJECT_NAME-$CI_PROJECT_ID-$CI_ENVIRONMENT_SLUG" #名稱空間
- ENV_URL: "${ENV_NAME}.${CI_PROJECT_NAMESPACE}.${CI_PROJECT_NAME}.devops.com" #IngressHosts
指定CI文件
運行流水線測試
docker鏡像倉庫
部署環(huán)境演示
Kubernetes集群中應用狀態(tài)