51CTO社区编辑加盟指南,欢迎关注!
还是按照之前的目录结构完成的,jobs目录用于存放作业模板。templates目录用于存放流水线模板。这次使用deFAult-pIPeline.yMl作为所有作业的基础模板。
来源:http://www.idevops.site

作业模板
作业分为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文件

运行流水线测试

dockeR镜像仓库

部署环境演示


KubeRnetes集群中应用状态
