上一篇文章只是介绍了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应用如下:
然后用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
,能够正常访问该应用的接口。
网友评论