使用Gitlab Runner进行CICD实例

上一篇文章只是介绍了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,能够正常访问该应用的接口。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容