作者:姜总

GitLab CI/CD 是一个内置在GitLab中的工具,用于通过持续方法进行软件开发:

  • Continuous Integration (CI) 持续集成
  • Continuous Delivery (CD) 持续交付
  • Continuous Deployment (CD) 持续部署

持续集成的工作原理:将小的代码块推送到如GitLab代码仓库中托管,并且每次推送后都要运行一系列脚本来构建、测试和验证代码更改,然后再将其合并到主分支中。

持续交付和部署相当于更进一步的CI,可以在每次推送到仓库默认分支的同时将应用程序部署到生产环境。

1、GitLab CI/CD是如何工作的?


使用GitLab CI/CD,前提需要有一个托管在GitLab仓库上的代码仓库,并且在该项目代码仓库的根目录下存在一个名为:.gitlab-ci.yml 的文件。该文件中指定代码扫描、构建、测试、部署等几个步骤的一系列的命令或者脚本。在该文件中,你可以定义要运行的脚本,定义包含的依赖项,选择要按顺序运行的命令和要并行运行的命令,定义要在何处部署应用程序,以及指定是否 要自动运行脚本或手动触发脚本。当项目根目录中存在已经定义好的 .gitlab-ci.yml 文件时,这时候开发人员将代码提交到代码仓库中,GitLab就会检测到并使用GitLab Runner根据 .gitlab-ci.yml 中定义的步骤来运行pipeline流水线(有可能需要符合workflow规则)。

2、创建一个 .gitlab-ci.yml 文件


说了这么多,这里用一个简单的例子来介绍。如下:

假设目前我们的Gitlab Runner已经注册并且可用。

假设我们在GitLab代码仓库中存在两个project项目:gitlab-ci-templatedemo-java

gitlab-ci-template就是我们存放gitlab-ci-template.yml的模板文件,demo-java是我们开发人员的java代码仓库。

2.1、 开发人员的代码仓库下的 .gitlab-ci.yml的文件:
variables:
  DOCKER_IMAGE_NAME: $DOCKER_REGISTRY_URL/${CI_PROJECT_NAMESPACE}/$CI_PROJECT_NAME:$CI_PIPELINE_IID-$CI_COMMIT_SHORT_SHA

stages:
  - maven
  - build
  - deploy

maven:
  stage: maven
  image: www.ayunw.cn/allenjol_containes/build-maven:v1
  tags:
    - default
  script: 
    - mvn deploy -B -Dmaven.test.skip=true
  artifacts:
    name: maven_build_package
    paths:
      - target/*.jar
    expire_in: 1 week

Build-java:
  stage: build
  image: www.ayunw.cn/allenjol_containes/build-java:v1
  tags:
    - default
  script:
    - echo "java build..."

Deploy:
  stage: deploy
  image: www.ayunw.cn/allenjol_containes/deploy:v1
  tags:
    - default
  script:
    - echo "deploy..."
2.2、 推送 .gitlab-ci.yml 文件到代码根目录

git add .gitlab-ci.yml
git commit -m "add .gitlab-ci.yml"
git push origin master

接下来当开发提交代码以后就会触发Gitlab Runner,根据该 .gitlab-ci.yml 文件运行pipeline。

3、以上.gitlab-ci.yml 存在的问题


以上的步骤相对比较简单,一般也不会有什么问题。但是存在两种情况会比较麻烦。

问题一:开发人员随便乱改这个文件。

问题二:篇幅过长看着很乱。

问题三:不易于统一更新维护。

4、解决步骤三中存在的问题


步骤三存在的问题比较麻烦。这时候我们想到一个方法就是利用模板拆分优化.gitlab-ci.yml

这时候开发代码根目录下的 .gitlab-ci.yml文件如下:

variables:
  BUILD_TYPE: JAVA

include:
  - project: 'Group1/gitlab-ci-template'
    ref: 'master'
    file: 'src/.gitlab-ci-template.yml'

我们模板仓库在:Group1这个组下的gitlab-ci-template目录,其中包含一个src目录,src目录下包含一个 .gitlab-ci-template.yml文件,内容如下:

variables:
  DOCKER_IMAGE_NAME: $DOCKER_REGISTRY_URL/${CI_PROJECT_NAMESPACE}/$CI_PROJECT_NAME:$CI_PIPELINE_IID-$CI_COMMIT_SHORT_SHA

stages:
  - maven
  - build
  - deploy

maven:
  stage: maven
  image: www.ayunw.cn/allenjol_containes/build-maven:v1
  tags:
    - default
  script: 
    - mvn deploy -B -Dmaven.test.skip=true
  artifacts:
    name: maven_build_package
    paths:
      - target/*.jar
    expire_in: 1 week

Build-java:
  stage: build
  image: www.ayunw.cn/allenjol_containes/build-java:v1
  tags:
    - default
  script:
    - echo "java build..."

Deploy:
  stage: deploy
  image: www.ayunw.cn/allenjol_containes/deploy:v1
  tags:
    - default
  script:
    - echo "deploy..."

上面的方法简化了开发人员代码仓库下的 .gitlab-ci.yml 文件篇幅过长的问题。并且还很有效的控制了开发人员会随便更改该文件。并且也利于运维人员统一更新。节约时间方便管理维护。