【Docker】 搭配GitLab-Runner完成CI/CD 持续集成、持续交付和持续部署

好记性不如烂笔头,特将使用GitLab-Runner 记录在我的小仓库。

文章目录

    • 阅读须知
    • 一、名词解释
      • 1. CI/CD 是什么?
      • 2. GitLab-CI 是什么?
      • 3. gitlab-ci.yml 是什么?
      • 4. GitLab Runner 是什么?
    • 二、安装 GitLab-Runner
    • 三、注册 GitLab-Runner
    • 四、GitLab-Runner 环境配置
    • 五、浅试.gitlab-ci.yml
      • 须知
    • 六、个人理解
      • 1. shell 方式
      • 2. docker 方式
    • 存在的问题及解决

阅读须知

  1. 本文根据 GitLab-Runner 官方文档 完成安装部署以及问题解决。
  2. 安装 GitLab-Runner 之前,还需要至少安装 GitLab
  3. Docker的安装
  4. 了解掌握 Docker命令

一、名词解释

1. CI/CD 是什么?

  • CI (Continuous Integration) 持续集成 。
  • CD (Continuous Delivery) 持续交付 、 (Continuous Deployment) 持续部署。
  • 它是作为一个面向开发和运营团队的解决方案,开发人员在修复完善或添加新功能时线上的自动化测试,上传的项目测试失败则会通过账户邮箱反馈给开发者;若是上传的项目自动化测试通过,测试人员可以在指定路径找到jar包进行测试。

2. GitLab-CI 是什么?

  • Gitlab-CI ( Gitlab Continuous Integration ) 持续集成。
  • 开发人员每次上传本地项目到GitLab,都会执行一次脚本(也就是Gitlab-CI 会在每次push之后解析**.gitlab-ci.yml**文件并且通过 GitLab-Runner 执行 ), .gitlab-ci.yml脚本的内容包括了测试,编译,部署等一系列自定义的内容。本文主要讲解安装GitLab-Runner 的过程 ,Gitlab-CI 在安装完 GitLab就有了。

3. gitlab-ci.yml 是什么?

  • 该文件需要放在项目的根目录下,记录了一系列的阶段和执行规则。

4. GitLab Runner 是什么?

官方部分介绍:

  • GitLab Runner can be installed and used on GNU/Linux, macOS, FreeBSD, and Windows. You can install it:

    • In a container.
    • By downloading a binary manually.
    • By using a repository for rpm/deb packages.

    GitLab Runner officially supported binaries are available for the following architectures:

    • x86, AMD64, ARM64, ARM, s390x, ppc64le

    Official packages are available for the following Linux distributions:

    • CentOS, Debian, Ubuntu, RHEL, Fedora, Mint

    GitLab Runner officially supports the following operating systems:

    • Linux, Windows, macOS, FreeBSD

    You can find information on the different installation methods below. You can also view installation instructions in GitLab by going to your project’s Settings > CI / CD, expanding the Runners section, and clicking Show runner installation instructions.

    After you install GitLab Runner, you must register individual runners with your GitLab instance. This instance can be self-managed, or you can use GitLab.com.

    GitLab Runner runs the CI/CD jobs that are defined in GitLab.

实际上,GitLab-Runner是配合GitLab-CI进行使用的。简单来说,GitLab-Runner就是自动化测试所需要的环境,注意!该环境在安装过程中可以选择 Docker 镜像方式使用也可以通过 Shell 方式在 GitLab-Runner中直接使用,当然也有其它的方式,下文有一笔带过。


二、安装 GitLab-Runner

# 查找 gitlab-runner 镜像
docker search gitlab/gitlab-runner

# 拉取docker gitlab-runner 镜像
docker pull gitlab/gitlab-runner:latest

# 创建磁盘卷:(不知道为什么,一旦映射到windows上,gitlab就无法链接到我的gitlab-runner,因此只记录代码)
# 切记请勿在本文使用该命令
docker volume create gitlab-runner-config

# 通过创建的卷启动 GitLab Runner 容器:( -v 相当于映射到本地磁盘,方便数据的存储转移等)
docker run -d --name gitlab-runner --restart always ^
    -v /var/run/docker.sock:/var/run/docker.sock ^
    -v gitlab-runner-config-image:/etc/gitlab-runner ^
    gitlab/gitlab-runner:latest
    
# register 
# 运行可不算完,还需要注册一下,不麻烦
docker run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:latest register

其中 register 这个步骤需要去 gitlab 中进行注册绑定

这里的runner可以分为两大类,分别是 Shared Runner(共享型)Specific Runner(指定型)

  • **Shared Runner:**这种Runner(docker)是所有工程都能够用的。只有系统管理员能够创建Shared Runner。
  • **Specific Runner:**这种Runner(docker)只能为指定的工程服务。拥有该工程访问权限的人都能够为该工程创建Shared Runner。

因此根据实际需求,如果只需要个人的电脑或者服务器上自动构建个人参与的某个工程

三、注册 GitLab-Runner

如图所示,步骤 1-3 可以获得需要的 url 以及 token(灰色的两个runner处于脱机状态–offline ,绿色表示正在运行–running

【Docker】 搭配GitLab-Runner完成CI/CD 持续集成、持续交付和持续部署_第1张图片
执行上面的 # register 的下行命令会出现六个选择:( 可以对应上面的 Runners activated for this project )

## 输入url
a、Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
 http://xxxx:2300/
## 输入token
b、Please enter the gitlab-ci token for this runner
 HJryfsps3N-G9KC-eqds
## 随便写个描述,后面也可以修改
c、Please enter the gitlab-ci description for this runner
 image
## 这个tag很重要,后面上传项目时,GitLab-CI 会根据 .gitlab-ci.yml 内的tag寻找Runner进行自动化测试
d、Please enter the gitlab-ci tags for this runner (comma separated)
 ir
## ci没有配置tags时是否执行这个runner?建议采用默认值。            
e、Whether to run untagged builds [true/false]
 (该选项后面可以在runner中编辑勾选)
## 选择一个执行器。我们接来下的方案是基于shell的,输入shell。    
g、Please enter the executor: virtualbox, docker+machine, kubernetes, parallels, docker-ssh, shell, ssh, docker-ssh+machine, docker:
 shell
############ 注意!注册完成后,会出现一个runner,我这里注册了两个,所以会有两个tag
 runner 左边会有一个小绿点,表示该runner是能正常执行的;图中的本地容器删除,处于脱机状态 offline
 我这因为映射的关系,runner总是处于offline,因此多写几遍,表达我的不解。

最好重启一下本地runner容器。
这里推荐 Docker命令


四、GitLab-Runner 环境配置

  • 因为上步骤我使用的是 Shell , 因此之后自动化测试会在GitLab-Runner中执行。
  • 可以通过 uname -a 看到当前linux版本
  • 根据当前版本使用对应的下载工具,这里我使用的是apt-get,其他下载命令可能是 npm 、yum 、wget ,curl 等等(有点晚了,如有错误,请指出,美好生活!)
  • 配置环境部分略,如需要编辑文件,vi/vim必备,既然是自动化,java、maven也是需要的等等。。。

五、浅试.gitlab-ci.yml

须知

  • 该文件需要放在项目的根目录
  • 若GitLab项目配置中使用Runner,那么每次项目更改提交之后 GitLab会根据该文件进行打包编译等操作
  • 内容中每个job必须至少包含一个script子句
  • 每个作业必须具有唯一的名称,但是有一些保留keywords名称不能用作作业名称:
    • image
    • services
    • stages
    • types
    • before_script
    • after_script
    • variables
    • cache
    • include

步骤:

  • 在项目的根目录创建一个 .gitlab-ci.yml文件
  • 接着写一个最简单的测试一下吧!
stages:
  - build

job1:
  stage: build
  script:
    - echo 'current step : build'
  tags:
    - ir

六、个人理解

在register的最后一步中我用过两种方法 :shell,docker。

1. shell 方式

​ shell方式是在runner容器内运行,因此需要安装对应的环境在runner容器中,然后使用以上命令。

2. docker 方式

​ docker方式会在选择之后提示需要使用哪个镜像,最后运行的时候如果没有该镜像,runner容器会自己寻找下载。这里需要注意的是,使用docker方式引入的镜像,在每一次执行自动化编译打包等命令的时候会根据指定的镜像生成容器,最后在容器中运行。

​ 因此如果该镜像没有必备的环境,可以选择寻找一个具备所有需求环境的镜像或者自定义镜像使用。自定义一个容器并且导出成镜像,最后配置.toml文件——用来允许使用自定义镜像( 见下文 )。

存在的问题及解决

  1. 自己制作的graalvm-ce镜像若无法被runner使用(解决办法:修改配置文件——config.toml

    docker执行器的pull policy默认设置pull_policy=“always”,意味着gitlab-runner每次都要去docker中央仓库拉image关键字指明的镜像,但是自定义的镜像怎么可能存在在docker中央仓库,因此解决思路很清晰。

       **制定pull policy,再重启gitlab-runner**
       																	
       config.toml 文件路径一般存放在 /home/gitlab-runner/config.toml
       																	
       部分版本的系统使用 root 注册会存放在/etc/gitlab-runner/config.toml 
       																	
       反之非 root 可能存放在 ~/.gitlab-runner/config.toml
    

    【Docker】 搭配GitLab-Runner完成CI/CD 持续集成、持续交付和持续部署_第2张图片

  2. 如果不运行 gitlab-runner register 命令,直接在配置文件里面添加Runner的配置信息可以吗?

    不可以。因为gitlab-ci-runner register的作用除了把Runner的信息保存到配置文件以外,还有一个很重要的作用,那就是向GitLab-CI发出请求,在GitLab-CI中登记这个Runner的信息并且获取后续通信所需要的token。

  3. 报错:$ImageGenerationFailureException: Image generation failed. Exit code: 1

    该问题关于native-image,暂时不做过多介绍,先记录。

    这里导致的原因是因为 quarkus与最新版本的graalvm 22.2不兼容导致,因此降低至22.1即可。2022年10月20日记录

    当然,也可能存在的原因有,容器内存不够,导致无法编译完成,这里有两个方法

    1. 在docker run的时候加一个参数,例如 -m 4G
    2. 修改该容器的配置文件,过于繁琐,此处略
    3. 若是Docker DeskTop 并且使用的是 Typer-V 则可以直接在设置中赋予参数
  4. 如果之后上传到gitlab编译时反馈权限问题,可能是使用 root 权限编译的target被 gitlab 用户使用被拒绝导致

    该问题存在工作遇到的小问题,特此记录。

    授予其执行权限( * )

    ​ chmod -R a+rwx /home/gitlab-runner

    创建一个GitLab CI用户

    ​ sudo useradd --comment ‘GitLab Runner’ --create-home gitlab-runner --shell /bin/bash

    1. 解决gitlab-runner执行docker命令提示权限不足的问题
      将gitlab-runner用户添加到docker组
      sudo usermod -aG docker gitlab-runner
      验证是否生效:
      sudo -u gitlab-runner -H docker info
    2. 给gitlab-runner sudo权限
      sudo vi /etc/sudoers
      在 root ALL=(ALL:ALL) ALL 下增加 gitlab-runner ALL=(ALL) NOPASSWD: ALL
  5. 当然,Runner容器可能还需要的内容例如Native Image 镜像、gcc等

    gu install native-image

    gcc,graalvm22.1 , maven , apt-get / apt , apm , vim / vi 等

最后 quarkus 我常用的以下几个命令:

mvn package -Pnative -Dmaven.test.skip=true
mvn install -Dnative -Dmaven.test.skip=true
mvn clean package -U -DskipTests -Dnative -Dquarkus.native.container-build=true

未完待续。。。—2022年11月7日23点20分

你可能感兴趣的:(Docker专栏,gitlab,ci/cd,docker,linux,java)