前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Git】GitLab CI/CD 的执行流程及实战

【Git】GitLab CI/CD 的执行流程及实战

作者头像
瑞新
发布2020-12-07 10:30:57
4.4K0
发布2020-12-07 10:30:57
举报

介绍

GitLab CI/CD 是一个简洁好用的的持续集成/持续交付的框架。通过为你的项目配置一个或者多个 GitLab Runner,然后撰写一个 .gitlab-ci.yml,你就可以很方便地利用 GitLab CI/CD 来为你的项目引入持续集成/交付的功能。

执行流程

Stage顺序执行(编译、测试、开发)

在这里插入图片描述
在这里插入图片描述

GitLab CI/CD 的执行过程中首先驱动的是 Stage。

每个 GitLab CI/CD 都必须包含至少一个 Stage。多个 Stage 是按照顺序执行的。如果其中任何一个 Stage 失败,则后续的 Stage 不会被执行,整个 CI 过程被认为失败。

例如,整个 CI 环节包含三个 Stage:build、test 和 deploy build 被首先执行。如果发生错误,本次 CI 立刻失败; test 在 build 成功执行完毕后执行。如果发生错误,本次 CI 立刻失败; deploy 在 test 成功执行完毕后执行。如果发生错误,本次 CI 失败。

Stage 在 .gitlab-ci.yml 中通过如下的方式定义:

代码语言:javascript
复制
stages:
  - build
  - test
  - deploy

如果文件中没有定义 stages,那么则默认包含 build、test 和 deploy 三个 stage。 Stage 中并不能直接配置任何具体的执行逻辑,具体的执行逻辑应该在 Job 中配置。

Job(执行逻辑配置)

在这里插入图片描述
在这里插入图片描述

Job 可以被关联到一个 Stage。当一个 Stage 执行的时候,与其关联的所有 Job 都会被执行。需要注意的是,Job 在设计上是可并行执行的。这样的好处是可以利用多个 Runner 来加速 CI/CD 的流程。

因此,如果 Job 之间有依赖关系的话,需要通过关联到不同的 Stage 来实现。 Job 在 .gitlab-ci.yml 中通过如下的方式来和 Stage 关联: 如果一个 Job 没有显式地关联某个 Stage,则会被默认关联到 test Stage

代码语言:javascript
复制
job_build_module_A:
  stage: build

Job 的执行(script shell脚本)

Job 包含了真正的执行逻辑,例如调用 mvn 或者 gcc 等命令。

代码语言:javascript
复制
job_build_module_A:
  script:
    - cd module_A
    - mvn clean compile

公共配置

随着项目越来越大,Job 越来越多,Job 中包含的重复逻辑可能会让配置文件臃肿不堪。.gitlab-ci.yml 中提供了 before_scriptafter_script 两个全局配置项。这两个配置项在所有 Job 的 script 执行前和执行后调用。

例如:

代码语言:javascript
复制
job_build_module_A:
  script:
    - export MAVEN_OPTS="-Xmx256m"
    - cd module_A
    - mvn clean compile

...

job_build_module_Z:
  script:
    - export MAVEN_OPTS="-Xmx256m"
    - cd module_Z
    - mvn clean compile

这其中 export MAVEN_OPTS="-Xmx256m" 显然是可以抽取公用的部分,在 before_script 的帮助下,配置文件可以优化成:

代码语言:javascript
复制
before_script:
  - export MAVEN_OPTS="-Xmx256m"

job_build_module_A:
  script:
    - cd module_A
    - mvn clean compile

...

job_build_module_Z:
  script:
    - cd module_Z
    - mvn clean compile

after_script 也可以起到类似的作用,不过是在每个 Job 执行完毕以后被调用。

公共数据Cache

Job 的执行过程中往往会产生一些数据,默认情况下 GitLab Runner 会保存 Job 生成的这些数据,然后在下一个 Job 执行之前(甚至不局限于当次 CI/CD)将这些数据恢复。这样即便是不同的 Job 运行在不同的 Runner 上,它也能看到彼此生成的数据。

不过这些行为可能会带来意料之外的问题,比如说上一次 CI/CD 执行的是 master 分支的 build,下一次 CI/CD 执行的却是 devel 分支的 build,而 build 脚本偏偏是增量执行的,那么有可能导致第二次 build 的过程错误地引用了 master 编译生成的中间结果。 这个情况下,我们需要配置 cache.key:

代码语言:javascript
复制
cache:
  key: "$CI_COMMIT_REF_NAME"

这个配置的意思是:所有的 Job 在恢复 cache 的时候,是根据当前的分支名称去选择对应的 cache。换句话说,前面例子中的两次 build 会选中不同的 cache,数据自然就隔离开了。

当然,上面的隔离粒度是分支级别的,你还可以配置成 分支+Job 级别的:

代码语言:javascript
复制
cache:
  key: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"

上面两个例子中的 CI_COMMIT_REF_NAMECI_JOB_NAME 是 GitLab CI/CD 的预定义变量。除了它们以外,还有许多预定义变量可以供我们选择,详情可以参阅

总结

在了解了 Job 配置的 script、before_script、after_script 和 cache 以后,我们便可以将整个 Job 的执行流程用一张图概括下来了:

在这里插入图片描述
在这里插入图片描述

GitLab CI/CD 是通过 GitLab Runner 来执行的 GitLab CI/CD 将按照 Stage 定义的顺序来执行,任何一个 Stage 失败,整个 CI/CD 将失败 每一个 Stage 可以被若干个 Job 关联。Stage 在执行的时候,关联到这个 Stage 的所有 Job 都将被执行,不过不同的 Job 可能是并行执行的。 每个 Job 在执行的时候,会先按照缓存策略加载缓存数据,然后按照顺序依次运行 before_script、script 和 after_script 中配置的脚本,运行完毕以后,会将生成的数据保存到缓存中。

配置服务器

weget

安装服务器下载 yum -y install wget

maven

官网下载 apache-maven-3.6.3-bin.tar.gz 下载maven https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz 解压文件 tar -zxf 文件 -C 指定目录

配置环境变量

代码语言:javascript
复制
# Maven
export MAVEN_HOME=/opt/software/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin

阿里云镜像配置

参考过往项目github vim apache-maven-3.6.3/conf/settings.xml

代码语言:javascript
复制
<mirror>
   <id>alimaven</id>
   <name>aliyun maven</name>
   <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
   <mirrorOf>central</mirrorOf>    
</mirror>

配置Gitlab

配置.gitlab-ci.yml

165机器做测试,未做输出版

代码语言:javascript
复制
# shipper
stages:
  - test
  - build

test:
  stage: test
  script:
    - echo "test stage"
  only:
    - develop
  tags:
    - dev-165

build:
  stage: build
  script:
    - echo "build stage"
  when: manual
  only:
    - develop
  tags:
      - dev-165

添加maven到script中ci测试

代码语言:javascript
复制
  script:
    - echo "test stage"
    # Maven
    - export MAVEN_HOME=/opt/software/apache-maven-3.6.3
    - export PATH=$PATH:$MAVEN_HOME/bin
    - mvn clean package  -DskipTests=true

服务端注册gitlab gitlab-runner register 对应生成指令 添加描述 shell

在这里插入图片描述
在这里插入图片描述

备份时间片

代码语言:javascript
复制
stages:
  - build
  - test
  - deploy

build-dev:
  stage: build
  script:
    - echo "dev build stage"
    # Maven
    - export MAVEN_HOME=/opt/software/apache-maven-3.6.3
    - export PATH=$PATH:$MAVEN_HOME/bin
    - mvn clean package -DskipTests=true
    - backuptime=$(date "+%Y%m%d%H%M%S")
    - mv /home/gitlab-runner/odeon/shipper/shipper-0.0.1-alpha0.jar /home/gitlab-runner/odeon/shipper/shipper-0.0.1-alpha0.jar.bak.${backuptime}
    - cp target/shipper-0.0.1-alpha0.jar /home/gitlab-runner/odeon/shipper
  only:
    - develop
  tags:
    - dev-165

build-test:
  stage: build
  script:
    - echo "build stage"
  only:
    - test
  tags:
    - dev_161

  # dev deploy
deploy-dev:
  stage: deploy
  script:
    - echo "deploy dev"
    - pwd
    - ls -al
    - PID=$(cat /home/gitlab-runner/odeon/shipper/process.pid)
    - kill $PID
    - nohup java -jar /home/gitlab-runner/odeon/shipper/shipper-0.0.1-alpha0.jar >> shipper.log 2>&1 & echo $! > process.pid
  only:
    - develop
  when: manual
  tags:
    - dev-165

管道验证

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-11-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 执行流程
    • Stage顺序执行(编译、测试、开发)
      • Job(执行逻辑配置)
        • Job 的执行(script shell脚本)
          • 公共配置
            • 公共数据Cache
              • 总结
              • 配置服务器
                • weget
                  • maven
                    • 阿里云镜像配置
                    • 配置Gitlab
                      • 配置.gitlab-ci.yml
                        • 添加maven到script中ci测试
                          • 备份时间片
                            • 管道验证
                            相关产品与服务
                            持续集成
                            CODING 持续集成(CODING Continuous Integration,CODING-CI)全面兼容 Jenkins 的持续集成服务,支持 Java、Python、NodeJS 等所有主流语言,并且支持 Docker 镜像的构建。图形化编排,高配集群多 Job 并行构建全面提速您的构建任务。支持主流的 Git 代码仓库,包括 CODING 代码托管、GitHub、GitLab 等。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档