使用Gitlab Runner进行CICD实例
2025-04-06 00:00:58  阅读数 2589

上一篇文章只是介绍了Gitlab Runner的入门案例,并没有涉及到真正的CICD流程,本文主要通过如下案例来举例说明CICD的一个简单过程:

  • 案例一:通过nginx部署一个前端单页面应用;
  • 案例二:通过nginx部署一个前端Vue应用;
  • 案例三:通过tomcat部署一个后端Java应用;

建议阅读完上一篇文章后,再进行本文的实验,如果已经完全掌握Gitlab Runner,可以继续。

案例一:Nginx部署前端单页应用

1.1 案例目标

我们有一个cicd-test项目,里面只有一个html页面,我们使用windows gitlab runner将该页面部署到本地windows的nginx上,实现通过浏览器能访问到该页面的目标。

1.2 准备工作

  • 安装windows版本的gitlab runner;

    PS C:\Windows\system32> cd D:\gitlab-runner
    PS D:\gitlab-runner> .\gitlab-runner-windows-amd64.exe register
    Runtime platform                                    arch=amd64 os=windows pid=18096 revision=bbcb5aba version=15.3.0
    Enter the GitLab instance URL (for example, https://gitlab.com/):
    http://10.96.12.149/
    Enter the registration token:
    cXVdLXP2feFe8WYVA4c-
    Enter a description for the runner:
    [GLIC-IT-ZX02]: win-runner-01
    Enter tags for the runner (comma-separated):
    
    Enter optional maintenance note for the runner:
    
    Registering runner... succeeded                     runner=cXVdLXP2
    Enter an executor: virtualbox, docker+machine, kubernetes, custom, docker-windows, docker-ssh, ssh, docker-ssh+machine, docker, parallels, shell:
    shell
    Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
    
    Configuration (with the authentication token) was saved in "D:\\gitlab-runner\\config.toml"
    PS D:\gitlab-runner> .\gitlab-runner-windows-amd64.exe install
    Runtime platform                                    arch=amd64 os=windows pid=21068 revision=bbcb5aba version=15.3.0
    PS D:\gitlab-runner> .\gitlab-runner-windows-amd64.exe start
    Runtime platform                                    arch=amd64 os=windows pid=17352 revision=bbcb5aba version=15.3.0
    
  • 修改本地gitlab runner的shell启动命令;

    该步骤是必须的,不然部署任务在启动shell脚本时会报错:

    ERROR: Job failed (system failure): prepare environment: failed to start process: exec: "pwsh": executable file not found in %PATH%.
    

    这是因为gitlab runner默认会使用pwsh.exe来打开shell,但是win10默认没有安装这个工具,只有powershell.exe,因此我们需要修改gitlab runner的配置文件,地址为"D:\\gitlab-runner\\config.toml",在上一步gitlab runner注册成功的时候有显示。

    [[runners]]
      name = "win-runner-01"
      url = "http://10.96.12.149/"
      id = 6
      token = "-9aDynfbhK2Gr2v5jFJ7"
      token_obtained_at = 2022-09-16T08:19:42Z
      token_expires_at = 0001-01-01T00:00:00Z
      executor = "shell"
      #注释:将下行内容的pwsh修改为powershell 
      # shell = "pwsh"
      shell = "powershell"
      [runners.custom_build_dir]
      [runners.cache]
        [runners.cache.s3]
        [runners.cache.gcs]
        [runners.cache.azure]
    

    该问题的详细解释可以参考:gitlab-runner: prepare environment failed to start process pwsh in windows - Stack Overflow

  • 准备nginx环境;

    下载windows版本的nginx,并解压到自定义目录下,我这边是D:\nginx-1.20.2,nginx默认启动是80端口,如果80端口已被占用,可自行修改nginx.conf中的端口内容。

1.3 项目内容

  • 定义CICD流程;

    如下是项目中.gitlab-ci.yml的配置内容,我们当前案例比较简单,只有一个部署操作。

    # 定义pipeline的阶段
    stages:
      - deploy
    
    deploy-job:
      stage: deploy
      script:
        # 将当前代码库目录下的文件拷贝到nginx的默认html目录下
        - cp .\hello.html D:\nginx-1.20.2\html\
    
  • 提交推送代码触发流水线;

    准备html文件,内容如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>CICD测试</title>
    </head>
    <body>
    <h1>Gitlab CICD 测试!!!</h1>
    </body>
    </html>
    

    然后将本地代码内容推送到远程代码仓库上,会自动触发流水线的运行。

1.4 结果验证

此时可以查看流水线的运行情况,我这里显示运行成功:

Running with gitlab-runner 15.3.0 (bbcb5aba)
  on win-runner-01 -9aDynfb
Preparing the "shell" executor
00:00
Using Shell executor...
Preparing environment
00:01
Running on IT-ZX02...
Getting source from Git repository
00:15
Fetching changes with git depth set to 20...
Initialized empty Git repository in D:/gitlab-runner/builds/-9aDynfb/0/gitlab-instance-9a531526/cicd-test/.git/
Created fresh repository.
Checking out 337f4901 as main...
git-lfs/2.13.3 (GitHub; windows amd64; go 1.16.2; git a5e65851)
Skipping Git submodules setup
Executing "step_script" stage of the job script
00:01
$ cp .\hello.html D:\nginx-1.20.2\html\
Job succeeded

然后检查下nginx的目录下D:\nginx-1.20.2\html\确实多了hello.html,此时访问localhost:80/hello.html,就能访问到新的页面了。

至此,案例一CICD流程成功。

案例二:Nginx部署前端Vue应用

2.1 案例目标

我们按照Vue官方指引新建一个初始化应用,然后使用windows gitlab runner将该项目打包后部署到本地windows的nginx上,实现通过浏览器能访问到该页面的目标。

2.2 准备工作

需要安装最新版本的Node.js运行环境,这个可以参考Vue官方指引

然后其它步骤,比如gitlab runner的注册,nginx的安装同1.2中的内容。

2.3 项目内容

按照Vue的官方指引,在本地某个目录下生成一个初始化应用,确保如下命令成功后再往下继续。

npm install
npm run dev

访问改项目主页能成功后再往下继续。

然后,我们再定义我们的CICD流程,.gitlab-ci.yml内容如下:

stages:
  - install
  - build
  - deploy

# 定义需要缓存的目录
cache:
  paths:
    - node_modules
    - dist

install-job:
  stage: install
  script:
    - npm install

build-job:
  stage: build
  script:
    - npm run build
  # 可在流水线上下载本阶段作业的制品
  artifacts:
    name: "dist"
    paths:
      - dist 

deploy-job:
  stage: deploy
  script:
    - cp -r .\dist\* D:\nginx-1.20.2\html\

其中需要注意的是,我们使用了cache关键字,然后指定了需要缓存的路径,这是为什么呢?

因为gitlab每个作业在进行的时候,都会删除上一个作业新增的内容,比如install阶段,会新增node_modules目录资源,那么在接下来的build阶段,会删除该目录再执行作业,同理,在deploy阶段会删除build阶段新增的dist目录资源。因此,如果不配置缓存,那么build和deploy肯定就不能成功了,所以我们才需要将这两个目录缓存下来。

在执行build和deploy作业的时候,虽说还会删除上一个作业的新增目录资源,但是声明需要被缓存的目录会在下一个作业开始的时候被恢复的。如下是deploy阶段作业的执行记录:

Running with gitlab-runner 15.3.0 (bbcb5aba)
  on win-runner-01 imSTjF34
*******
# 删除上一步作业新增的目录
Removing dist/
Removing node_modules/
git-lfs/2.13.3 (GitHub; windows amd64; go 1.16.2; git a5e65851)
Skipping Git submodules setup
# 开始恢复缓存内容
Restoring cache
00:03
Version:      15.3.0
Git revision: bbcb5aba
Git branch:   15-3-stable
GO version:   go1.17.9
Built:        2022-08-19T22:41:07+0000
OS/Arch:      windows/amd64
Checking cache for default-protected...
Runtime platform                                    arch=amd64 os=windows pid=19504 revision=bbcb5aba version=15.3.0
No URL provided, cache will not be downloaded from shared cache server. Instead a local version of cache will be extracted. 
# 恢复缓存成功
Successfully extracted cache
# 执行脚本
Executing "step_script" stage of the job script
00:01
$ cp -r .\dist\* D:\nginx-1.20.2\html\
Saving cache for successful job
00:01
Version:      15.3.0
Git revision: bbcb5aba
Git branch:   15-3-stable
GO version:   go1.17.9
Built:        2022-08-19T22:41:07+0000
OS/Arch:      windows/amd64
Creating cache default-protected...
Runtime platform                                    arch=amd64 os=windows pid=19240 revision=bbcb5aba version=15.3.0
node_modules: found 673 matching files and directories 
dist: found 7 matching files and directories       
Archive is up to date!                             
Created cache

2.4 结果验证

推送如上项目内容到git仓库后,就会自动触发流水线执行上述CICD流程,可以看到本地nginx的目录下多了项目内容,并且启动nginx后可以访问到项目了。

案例三:Tomcat部署后端Java应用

3.1 案例目标

我们使用start.spring.io创建一个入门Spring Boot应用,然后使用windows gitlab runner将该项目打包后部署到本地windows的tomcat上,实现通过浏览器能访问到该应用接口的目标。

3.2 准备工作

需要下载并安装jdk运行环境环境,需要下载并安装maven工具,这两个的教程比较多,此处不再赘述。

然后其它步骤,比如gitlab runner的注册同1.2中的内容。

3.3 项目内容

start.spring.io创建一个SpringBoot应用如下:

java-cicd项目创建

然后用idea打开项目后,随意编写一个测试接口:

@Slf4j
@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String getHello(){
        return "hello!";
    }
}

本地启动项目,确保项目和如上接口能正常运行。

然后新增.gitlab-ci.yml文件内容如下:

stages:
  - build
  - deploy

# 定义需要缓存的目录
cache:
  paths:
    - target

build-job:
  stage: build
  script:
    - mvn -DskipTests=true clean package
  # 可在流水线上下载本阶段作业的制品
  artifacts:
    name: "jar"
    paths:
      - target\java-cicd-test-0.0.1-SNAPSHOT.jar

deploy-job:
  stage: deploy
  script:
    - cp target\java-cicd-test-0.0.1-SNAPSHOT.jar D:\java\
    - cd D:\java\
    - java -jar java-cicd-test-0.0.1-SNAPSHOT.jar

然后提交代码到gitlab仓库,就触发流水线运行。

3.4 结果验证

浏览器访问http://localhost:8080/hello,能够正常访问该应用的接口。