如何进行GitLab实现端到端DevOps流水线实践

51次阅读
没有评论

共计 19270 个字符,预计需要花费 49 分钟才能阅读完成。

如何进行 GitLab 实现端到端 DevOps 流水线实践,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

基于 Gitlab 实现项目端到端交付实践,从需求开发开始到交付流水线实现应用发布。每个项目团队的工作流都是不一样的,本文档中的工作流是根据之前项目团队工作模式而配置的。重点参考技术的实现方式,工作流可以根据自身团队情况而定义。

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

1. 整体规划设计

创建 issue — 创建特性分支 — 特性分支提交流水线 — 合并分支流水线 — 发布分支流水线

鸿蒙官方战略合作共建——HarmonyOS 技术社区

创建 issues 关联特性分支 (特征以数字开头的分支为特性分支)

特性分支提交代码,触发提交流水线 (构建验证部署到特性环境)

特性环境验证完成,合并到 RELEASE 分支。(触发合并流水线进行代码扫描,流水线成功才能合并)

RELEASE 分支手动发布 (UAT,STAG,PROD)

生产发布完成后 RELEASE 分支合并到 Master 分支,并基于 master 分支创建 Release tag。

2. 需求部分准备工作

创建里程碑

创建 issue,关联里程碑

根据 issue 名称创建对应的特性分支

3. 流水线准备工作

还可以直接使用之前的 java 项目

github:https://github.com/zeyangli/gitlabci-cidevops-java-service

准备模板库

准备可用的 runner,根据之前内容安装部署 runner。

chart:https://github.com/zeyangli/gitlabci-runner-chart-k8s

配置项目 CI 文件

4. 提交流水线设计

开发人员在特性分支提交代码,触发提交流水线进行代码验证并发布到特性环境验证 (可手动控制发布)。

阶段:编译,测试,扫描,构建镜像,上传镜像,发布特性环境

特性环境:命名规范为项目名称 -ID- 分支名称,每个特性分支发布到对应的特性环境。

镜像名称:

registry.cn-beijing.aliyuncs.com/cidevops/cidevops-java-service:3-input-error-a486c590-834

ingress 域名:

http://${CI_COMMIT_REF_NAME}.${CI_PROJECT_NAMESPACE}.${CI_PROJECT_NAME}.devops.com

Build 阶段

定义 build 作业模板,参数化构建命令。

## build 相关作业  ## .build: stage: build script: - ${BUILD_SHELL}

在 template 中引入 build 作业模板,由于使用容器构建所以声明 MAVEN_IMAGE 变量定义镜像名称。由于之前对构建环境构建目录持久化,所以定义 GIT_CLONE_PATH 参数进入指定的构建目录操作。GIT_CHECKOUT 设置全局每个作业无需重复下载代码。BUILD_SHELL 定义构建所需要的命令。定义变量能够足够灵活,适合不同项目不同打包命令的场景下。

include: - project:  cidevops/cidevops-newci-service  ref: master file:  jobs/build.yml  variables: ##  全局配置  GIT_CLONE_PATH: $CI_BUILDS_DIR/builds/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/$CI_PIPELINE_ID GIT_CHECKOUT:  false  ##  依赖容器镜像  BUILD_IMAGE:  maven:3.6.3-jdk-8  ##  构建测试参数  MAVEN_OPTS:  -Dmaven.repo.local=/home/gitlab-runner/ci-build-cache/maven   BUILD_SHELL:  mvn clean package -DskipTests --settings=./settings.xml   ## 构建命令  ##  运行阶段  stages: - build cache: paths: - target/ ################# Jobs Configure ##################### ##  构建作业  build: variables: GIT_CHECKOUT:  true  image: ${BUILD_IMAGE} extends: .build

定义 build 作业,设置作业变量 GIT_CHECKOUT:   true 表示需要下载代码,默认 build 是我们流水线中的第一个作业所以必须设置为下载代码,否则构建失败。作业中的变量优先级高于全局。image 定义我们要使用的镜像,如果采用非容器模式运行可以删除 image 标签。剩下的配置全部集成模板作业.build。

Test 阶段

这里定义的是在运行编译后进行的单元测试。maven 项目一般是 mvn test,npm 项目一般是 npm run  test 等。不同的项目运行单元测试的指令不通,其他部分都差不多。这里以 maven 项目为例。开始设计 maven 项目单元测试。

编辑 jobs/test.yml 文件定义 test 作业模板。(后续自动化测试等测试相关作业放到此文件)

# 单元测试  .test: stage: test script: - $TEST_SHELL artifacts: reports: junit: ${JUNIT_REPORT_PATH}

编辑模板文件,添加导入 test 作业模板。

include: - project:  cidevops/cidevops-newci-service  ref: master file:  jobs/build.yml  - project:  cidevops/cidevops-newci-service  ref: master file:  jobs/test.yml

在模板文件中添加变量定义。

variables: TEST_SHELL :  mvn test --settings=./settings.xml   ## 测试命令  JUNIT_REPORT_PATH:  target/surefire-reports/TEST-*.xml  ## 单元测试报告  ##  测试作业  test: image: ${BUILD_IMAGE} extends: .test before_script: - ls - ls target/

 

代码扫描阶段

jobs/code_analysis.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} ${GLOBAL_MR_ARGS}  sonar-scanner ${GLOBAL_PROJECT_ARGS} ${GLOBAL_SERVER_ARGS} ${SONAR_SCAN_ARGS} ${GLOBAL_MR_ARGS} else echo  sonar-scanner ${GLOBAL_PROJECT_ARGS} ${GLOBAL_SERVER_ARGS} ${SONAR_SCAN_ARGS}  sonar-scanner ${GLOBAL_PROJECT_ARGS} ${GLOBAL_SERVER_ARGS} ${SONAR_SCAN_ARGS} ${MULTI_BRANCH_ARGS} fi .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  ee2bcb37deeb6dfe3a07fe08fb529559b00c1b7b :  ${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 break; else SONAR_SCAN_RESULT= ERROR  echo  第 $i 次获取结果信息,不是成功状态,睡眠 10 秒! cat sonar_result.txt sleep 10 fi done

流水线模板

templates/pipeline.yml

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  variables: ##  全局配置  GIT_CLONE_PATH: $CI_BUILDS_DIR/builds/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/$CI_PIPELINE_ID GIT_CHECKOUT:  false  ##  依赖容器镜像  BUILD_IMAGE:  maven:3.6.3-jdk-8  SONAR_IMAGE:  sonarsource/sonar-scanner-cli:latest  ##  构建测试参数  MAVEN_OPTS:  -Dmaven.repo.local=/home/gitlab-runner/ci-build-cache/maven   BUILD_SHELL:  mvn clean package -DskipTests --settings=./settings.xml   ## 构建命令  TEST_SHELL :  mvn test --settings=./settings.xml   ## 测试命令  JUNIT_REPORT_PATH:  target/surefire-reports/TEST-*.xml  ## 单元测试报告  ##  代码扫描  SONAR_PROJECT_LANG:  JAVA  SONAR_SOURCE_DIR :  src  SONAR_SERVER_URL:  http://192.168.1.200:30090  SONAR_SERVER_LOGIN:  ee2bcb37deeb6dfe3a07fe08fb529559b00c1b7b  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   ##  运行阶段  stages: - build - test - parallel01 cache: paths: - target/ ################# Jobs Configure ##################### ##  构建作业  build: variables: GIT_CHECKOUT:  true  image: ${BUILD_IMAGE} extends: .build ##  测试作业  test: image: ${BUILD_IMAGE} extends: .test before_script: - ls - ls target/ ##  代码扫描  code_analysis: stage: parallel01 image: ${SONAR_IMAGE} extends: .code_analysis

 

构建镜像阶段

jobs/build.yml

.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}

telmplate/pipeline.yml

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  variables: ##  全局配置  GIT_CLONE_PATH: $CI_BUILDS_DIR/builds/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/$CI_PIPELINE_ID GIT_CHECKOUT:  false  ##  依赖容器镜像  BUILD_IMAGE:  maven:3.6.3-jdk-8  SONAR_IMAGE:  sonarsource/sonar-scanner-cli:latest  ##  构建测试参数  MAVEN_OPTS:  -Dmaven.repo.local=/home/gitlab-runner/ci-build-cache/maven   BUILD_SHELL:  mvn clean package -DskipTests --settings=./settings.xml   ## 构建命令  TEST_SHELL :  mvn test --settings=./settings.xml   ## 测试命令  JUNIT_REPORT_PATH:  target/surefire-reports/TEST-*.xml  ## 单元测试报告  ##  代码扫描  SONAR_PROJECT_LANG:  JAVA  SONAR_SOURCE_DIR :  src  SONAR_SERVER_URL:  http://192.168.1.200:30090  SONAR_SERVER_LOGIN:  ee2bcb37deeb6dfe3a07fe08fb529559b00c1b7b  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:  xxxxx  #CI_REGISTRY_PASSWD:  xxxxxxxx.  IMAGE_NAME:  $CI_REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_REF_NAME-$CI_COMMIT_SHORT_SHA  DOCKER_FILE_PATH:  ./Dockerfile  ##  运行阶段  stages: - build - test - parallel01 cache: paths: - target/ ################# Jobs Configure ##################### ##  构建作业  build: variables: GIT_CHECKOUT:  true  image: ${BUILD_IMAGE} extends: .build ##  测试作业  test: image: ${BUILD_IMAGE} extends: .test before_script: - ls - ls target/ ##  代码扫描  code_analysis: stage: parallel01 image: ${SONAR_IMAGE} extends: .code_analysis ##  构建镜像  build_image: image: docker:latest services: - name: docker:dind stage: parallel01 extends: .build-docker

 

K8S 部署阶段

jobs/deploy.yml

##  应用发布  ##  使用 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  deployment.yaml - sed -i  s#__appname__#${APP_NAME}#g  deployment.yaml - sed -i  s#__containerport__#${CONTAINER_PORT}#g  deployment.yaml - sed -i  s#__nodeport__#${NODE_PORT}#g  deployment.yaml - sed -i  s#__imagename__#${IMAGE_NAME}#g  deployment.yaml - sed -i  s#__CI_ENVIRONMENT_SLUG__#${CI_ENVIRONMENT_SLUG}#g  deployment.yaml - sed -i  s#__CI_PROJECT_PATH_SLUG__#${CI_PROJECT_PATH_SLUG}#g  deployment.yaml - sed -i  s#__ingressdomain__#${ENV_URL}#g  deployment.yaml - cat deployment.yaml -  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 deployment.yaml environment: name:  ${CI_COMMIT_REF_NAME}  url: http://${CI_COMMIT_REF_NAME}.${CI_PROJECT_NAMESPACE}.${CI_PROJECT_NAME}.devops.com on_stop: rollout_k8s when: manual ##  回滚  .rollout_k8s: stage: rollout 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} when: manual environment: name:  ${CI_COMMIT_REF_NAME}  action: stop

templates/pipeline.yml

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  variables: ##  全局配置  GIT_CLONE_PATH: $CI_BUILDS_DIR/builds/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/$CI_PIPELINE_ID GIT_CHECKOUT:  false  ##  依赖容器镜像  BUILD_IMAGE:  maven:3.6.3-jdk-8  SONAR_IMAGE:  sonarsource/sonar-scanner-cli:latest  ##  构建测试参数  MAVEN_OPTS:  -Dmaven.repo.local=/home/gitlab-runner/ci-build-cache/maven   BUILD_SHELL:  mvn clean package -DskipTests --settings=./settings.xml   ## 构建命令  TEST_SHELL :  mvn test --settings=./settings.xml   ## 测试命令  JUNIT_REPORT_PATH:  target/surefire-reports/TEST-*.xml  ## 单元测试报告  ##  代码扫描  SONAR_PROJECT_LANG:  JAVA  SONAR_SOURCE_DIR :  src  SONAR_SERVER_URL:  http://192.168.1.200:30090  SONAR_SERVER_LOGIN:  ee2bcb37deeb6dfe3a07fe08fb529559b00c1b7b  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:  xxxxx  #CI_REGISTRY_PASSWD:  xxxxxxxx.  IMAGE_NAME:  $CI_REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_REF_NAME-$CI_COMMIT_SHORT_SHA  DOCKER_FILE_PATH:  ./Dockerfile  # 部署应用 k8s RUN_DEPLOY:  yes  APP_NAME:  $CI_PROJECT_NAME  CONTAINER_PORT: 8081 #NODE_PORT: 30185 NAMESPACE:  $CI_PROJECT_NAME-$CI_PROJECT_ID-$CI_ENVIRONMENT_SLUG  ##  运行阶段  stages: - build - test - parallel01 - deploy - rollout cache: paths: - target/ ################# Jobs Configure ##################### ##  构建作业  build: variables: GIT_CHECKOUT:  true  image: ${BUILD_IMAGE} extends: .build ##  测试作业  test: image: ${BUILD_IMAGE} extends: .test before_script: - ls - ls target/ ##  代码扫描  code_analysis: stage: parallel01 image: ${SONAR_IMAGE} extends: .code_analysis ##  构建镜像  build_image: image: docker:latest services: - name: docker:dind stage: parallel01 extends: .build-docker ##  发布应用  deploy_k8s: stage: deploy image: lucj/kubectl:1.17.2 extends: .deploy_k8s ##  应用回滚  rollout_k8s: stage: rollout image: lucj/kubectl:1.17.2 extends: .rollout_k8s

5. 流水线触发控制

使用 workflow:rules 进行流水线控制,我们会用到 Pipeline 的变量,通过变量限制条件。

预定义变量参考文档:https://docs.gitlab.com//12.9/ee/ci/variables/predefined_variables.html

变量匹配语法: https://docs.gitlab.com//12.9/ee/ci/variables/README.html#supported-syntax

re2 语法:https://github.com/google/re2/wiki/Syntax

排除新建分支的流水线

运行流水线您会发现,所有新创建的分支的 CI_COMMIT_BEFORE_SHA 为 40 个 0。

$ export 

 

declare -x CI_BUILD_BEFORE_SHA= 0000000000000000000000000000000000000000  

declare -x CI_COMMIT_BEFORE_SHA= 0000000000000000000000000000000000000000  


##  流水线控制  workflow: rules: - if: $CI_COMMIT_BEFORE_SHA ==  0000000000000000000000000000000000000000  when: never - when: always

如何匹配特性分支和版本分支呢?

#$CI_COMMIT_REF_NAME =~ /\d-*/ #$CI_COMMIT_REF_NAME =~ /^RELEASE-*/ ||

合并流水线再进行构建验证

大家可以想像一下,如果是一个刚刚开始关注代码质量的团队,避免不了出现代码质量阈失败。  改进初期出现错误很正常,如果在初期就把质量阈配置的很严格,这会导致每次提交代码都会产生错误。所以我们可以适当的放开流水线的代码扫描 (也就是流水线暂时不进行质量阈检查)。

如果不扫描就无法知道代码的准确质量,所以我们准备流水线仅扫描但不检查质量阈,而合并流水线会将代码质量展示在评论区。类似于这种情况我们可以设置流水线成功后才能合并。

默认是提交触发流水线运行,而设置了 流水线成功后合并 会检查原分支的最后一次提交的状态是否为 success,如果是 success 则运行合并。  我们配置流水线在出现合并请求的时候,进行代码验证。

##  流水线控制  workflow: rules: - if: $CI_MERGE_REQUEST_ID

6. 部署流水线实践

我们将应用的部署文件也存储在代码库中管理,可能每个应用在各个环境中的配置文件不一致。所有分为三个配置文件 deployment-uat.yml、 deployment-stag.yml、deployment-prod.yml

jobs/deploy.yml

##  应用发布  ##  使用 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} environment: name:  ${ENV_NAME}  url:  http://${ENV_NAME}.${CI_PROJECT_NAMESPACE}.${CI_PROJECT_NAME}.devops.com  on_stop:  ${ROLL_NAME}  ##  回滚  .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} environment: name:  ${ENV_NAME}  action: stop

templates/pipeline.yml

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  variables: ##  全局配置  GIT_CLONE_PATH: $CI_BUILDS_DIR/builds/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/$CI_PIPELINE_ID GIT_CHECKOUT:  false  ##  依赖容器镜像  BUILD_IMAGE:  maven:3.6.3-jdk-8  SONAR_IMAGE:  sonarsource/sonar-scanner-cli:latest  ##  构建测试参数  MAVEN_OPTS:  -Dmaven.repo.local=/home/gitlab-runner/ci-build-cache/maven   BUILD_SHELL:  mvn clean package -DskipTests --settings=./settings.xml   ## 构建命令  TEST_SHELL :  mvn test --settings=./settings.xml   ## 测试命令  JUNIT_REPORT_PATH:  target/surefire-reports/TEST-*.xml  ## 单元测试报告  ##  代码扫描  SONAR_PROJECT_LANG:  JAVA  SONAR_SOURCE_DIR :  src  SONAR_SERVER_URL:  http://192.168.1.200:30090  SONAR_SERVER_LOGIN:  ee2bcb37deeb6dfe3a07fe08fb529559b00c1b7b  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  # 部署应用 k8s RUN_DEPLOY:  yes  APP_NAME:  $CI_PROJECT_NAME  CONTAINER_PORT: 8081 #NODE_PORT: 30185 NAMESPACE:  $CI_PROJECT_NAME-$CI_PROJECT_ID-$CI_ENVIRONMENT_SLUG  ##  流水线控制  workflow: rules: - if: $CI_MERGE_REQUEST_ID - if: $CI_PIPELINE_SOURCE ==  web  - if: $CI_COMMIT_BEFORE_SHA ==  0000000000000000000000000000000000000000  when: never ##  运行阶段  stages: - build - test - parallel01 - get_analysis_result - deploy - rollout cache: paths: - target/ before_script: - export ################# Jobs Configure ##################### ##  构建作业  build: variables: GIT_CHECKOUT:  true  image: ${BUILD_IMAGE} extends: .build ##  测试作业  test: image: ${BUILD_IMAGE} extends: .test before_script: - ls - ls target/ ##  代码扫描  code_analysis: stage: parallel01 image: ${SONAR_IMAGE} extends: .code_analysis ##  获取构建结果  get_analysis_result: image: curlimages/curl:7.70.0 extends: .get_analysis_result needs: - code_analysis ##  构建镜像  build_image: image: docker:latest services: - name: docker:dind stage: parallel01 extends: .build-docker ## feature 发布应用  deploy_feature: variables: DEPLOY_FILE:  deployment.yaml  ENV_NAME:  feature  stage: deploy image: lucj/kubectl:1.17.2 extends: .deploy_k8s rules: - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ when: never - if: $CI_COMMIT_REF_NAME =~ /\d-*/ when: manual - when: never ##  应用回滚  rollout_feature: stage: rollout image: lucj/kubectl:1.17.2 extends: .rollout_k8s rules: - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ when: never - if: $CI_COMMIT_REF_NAME =~ /\d-*/ when: manual - when: never ## UAT deploy_uat: variables: DEPLOY_FILE:  config/deployment-uat.yaml  ENV_NAME:  uat  stage: deploy image: lucj/kubectl:1.17.2 extends: .deploy_k8s rules: - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ when: manual - when: never ## UAT 应用回滚  rollout_uat: stage: rollout image: lucj/kubectl:1.17.2 extends: .rollout_k8s rules: - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ when: manual - when: never ## STAG deploy_stag: variables: DEPLOY_FILE:  config/deployment-stag.yaml  ENV_NAME:  stag  stage: deploy image: lucj/kubectl:1.17.2 extends: .deploy_k8s rules: - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ when: manual - when: never ## STAG 应用回滚  rollout_stag: stage: rollout image: lucj/kubectl:1.17.2 extends: .rollout_k8s rules: - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ when: manual - when: never ## PROD deploy_prod: variables: DEPLOY_FILE:  config/deployment-prod.yaml  ENV_NAME:  prod  stage: deploy image: lucj/kubectl:1.17.2 extends: .deploy_k8s rules: - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ when: manual - when: never ## PROD 应用回滚  rollout_prod: stage: rollout image: lucj/kubectl:1.17.2 extends: .rollout_k8s rules: - if: $CI_COMMIT_REF_NAME =~ /^RELEASE-*/ when: manual - when: never

7. 发布完成后 1. 将版本分支合并到 master 分支

2. 基于 master 分支创建版本标签

3. 关闭 issues 和里程碑

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计19270字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)