互联网技术 / 互联网资讯 · 2024年3月20日 0

GitLabCI模板库的流水线优化实践

51CTO社区编辑加盟指南,欢迎关注!

还是按照之前的目录结构完成的,jobs目录用于存放作业模板。templates目录用于存放流水线模板。这次使用deFAult-pIPeline.yMl作为所有作业的基础模板。

来源:http://www.idevops.site

GitLabCI模板库的流水线优化实践

作业模板

作业分为Build、test、codeanalysis、aRtiFAcTory、deploy部分,在每个作业中配置了Rules功能开关,由变量控制最终作业的运行。

jobs/build.yMl 构建作业模板

包含两个作业模板,分别是普通的构建模板(Maven/NPM/gRadle)和dockeR 镜像构建模板。

## build相关作业  .build:   stage: build   scRIPt:      – |       ${BUILD_Shell}   vaRiables:     Git_CHECKout: “tRue”   Rules:     – if: ” $RUN_PIPELINE_BUILD == ‘no’ ”       when: neveR     – when: alwaYs   ## 构建镜像 .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 测试作业模板

主要用于运行项目单元测试,例如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 代码扫描模板

包含两个作业模板,分别为扫描作业和获取扫描结果。这里面将扫描参数进行了分类,通用的项目参数、特殊的合并请求参数、自定义的项目参数。

##代码扫描 ## ## ##  .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   #### 获取代码扫描结果 .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  &aMp;&aMp; 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&aMp;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次获取结果信息,不是成功状态,睡眠10秒!”             cat sonaR_Result.txt             sLeep 10           fi         done            Rules:     – if: ” $RUN_code_analysis == ‘no’ ”       when: neveR     – when: alwaYs 

jobs/aRtiFAcTory.yMl 制品管理作业

包含两个作业,制品上传与下载。使用aRtiFAcTory制品库接口。

## 制品库相关 ##  .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 发布作业模板

发布基于k8s的发布和回滚配置。

## 应用发布   ## 使用kubectl镜像发布 .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导入作业模板 vaRiables 定义全局变量 woRkflow 定义流水线控制 jobs 构建与发布作业

include导入作业模板

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: “”    ## 作业控制   RUN_PIPELINE_BUILD: “”     #是否运行构建 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: “”         #是否发布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”         ## 构建测试参数   MAVEN_OPTS: “”                #Maven构建参数    GRADLE_OPTS: “”               #gRadle构建参数   BUILD_Shell: ”               #构建命令    ## 单元测试参数   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}”            #项目扫描参数    ## 构建镜像   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}”   #目标制品位置(目录结构)   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页面发布     – if: “$CI_COMMIT_REF_NAME =~ /^RELEASE-*/ || $CI_COMMIT_REF_NAME =~ /Master/ ”  #过滤版本分支和主干分支提交代码触发       when: neveR     – if: “$CI_COMMIT_BEFORE_SHA == ‘0000000000000000000000000000000000000000’”     #过滤分支创建请求       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 

构建作业配置

################# Jobs ConfiguRe ##################### ## 构建作业 build:   image: ${BUILD_image}   extends: .build  ## 测试作业 test:   image: ${BUILD_image}   extends: .test   befoRe_scRIPt:     – ls      – ls ${CACHE_DIR}  ## 代码扫描 code_analysis:   stage: paRallel01   image: ${SONAR_image}   extends: .code_analysis  ## 获取构建结果 get_analysis_Result:   image: ${CURL_image}   extends: .get_analysis_Result   needs:     – code_analYsis   ## 构建镜像 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 

发布部署作业配置

#################Deploy FeatuRe Jobs ConfiguRe ##################### ## featuRe发布应用 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项目交付流水线

导入作业模板

include:   – Project: ‘cidevops/cidevops-newci-seRvice’     Ref: Master     file: ‘teMplates/deFAult-pIPeline.yMl’ 

配置项目参数

vaRiables:   ## 全局配置   Git_CLONE_PATH: ${CI_BUILDS_DIR}/builds/${CI_project_NAMEspace}/${CI_project_NAME}/${CI_PIPELINE_ID}       Git_CHECKout: “FAlse”   CACHE_DIR: “taRget/”    ## 作业控制   RUN_PIPELINE_BUILD:   “yes”     #是否运行构建 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”     #是否发布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”         ## 构建测试参数   MAVEN_OPTS: “-DMaven.Repo.local=/hoMe/Gitlab-RunneR/ci-build-cache/Maven ”  #Maven构建参数   BUILD_Shell: ‘Mvn clean package  -DskIPtests  –settings=./settings.xMl ‘   #构建命令   #GRADLE_OPTS: “”               #gRadle构建参数    ## 单元测试参数   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 ”                                     #项目扫描参数    ## 构建镜像   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}”   #目标制品位置(目录结构)   #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文件

GitLabCI模板库的流水线优化实践

运行流水线测试

GitLabCI模板库的流水线优化实践

dockeR镜像仓库

GitLabCI模板库的流水线优化实践

部署环境演示

GitLabCI模板库的流水线优化实践

GitLabCI模板库的流水线优化实践

KubeRnetes集群中应用状态

GitLabCI模板库的流水线优化实践