学习实践下gitlab cicd,目前公司正在试用。
gitlab安装
1docker run --detach --privileged=true --hostname 192.168.110.128 --publish 8881:443 --publish 80:80 --publish 8883:22 --name gitlab --restart always --volume `pwd`/config:/etc/gitlab --volume `pwd`/logs:/var/log/gitlab --volume `pwd`/data:/var/opt/gitlab yrzr/gitlab-ce-arm64v8
gitlab-runner 安装
二进制安装
1# Download the binary for your system
2sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm64
3
4# Give it permission to execute
5sudo chmod +x /usr/local/bin/gitlab-runner
6
7# Create a GitLab Runner user
8sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
9
10# Install and run as a service
11sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
12# Runtime platform arch=arm64 os=linux pid=3745 revision=81ab07f6 version=16.10.0
13sudo gitlab-runner start
14
15# sudo gitlab-runner stop
docker方式安装
1docker run -d --name gitlab-runner --privileged=true --restart always -v `pwd`/config:/home/gitlab-runner/.gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock bitnami/gitlab-runner:latest
2
3# 注册runner
4 docker run --rm -v `pwd`/config:/home/gitlab-runner/.gitlab-runner bitnami/gitlab-runner:latest register --non-interactive --executor "docker" --docker-image alpine:latest --url "http://192.168.110.128/" --registration-token "9Z-84Qi21FkxvKmpkKjv\n" --description "test" --tag-list "docker,test" --run-untagged="true" --locked="false" --access-level="not_protected"
注册runner ,全局共享runner, project runner
1gitlab-runner register --url http://192.168.110.128 --token glrt-iVgXJFrDCxgtVJLaywdG
生成的config.toml,注意这里试用了虚拟机的ip, 不然用域名,docker那边dns解析有问题。
volumes : 增加了 /var/run/docker.sock:/var/run/docker.sock
以防万一
1concurrent = 1
2check_interval = 0
3connection_max_age = "15m0s"
4shutdown_timeout = 0
5
6[session_server]
7 session_timeout = 1800
8
9[[runners]]
10 name = "golang"
11 url = "http://192.168.110.128"
12 id = 1
13 token = "glrt-j7hZyxN8skmFn4ZLiKs8"
14 token_obtained_at = 2024-04-20T01:47:03Z
15 token_expires_at = 0001-01-01T00:00:00Z
16 executor = "docker"
17 [runners.docker]
18 tls_verify = false
19 image = "alpine:latest"
20 privileged = false
21 disable_entrypoint_overwrite = false
22 oom_kill_disable = false
23 disable_cache = false
24 volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
25 shm_size = 0
26 network_mtu = 0
27
28[[runners]]
29 name = "mom"
30 url = "http://192.168.110.128"
31 id = 2
32 token = "glrt-Zsow2xwszLieJ-i4uXWD"
33 token_obtained_at = 2024-04-20T03:19:23Z
34 token_expires_at = 0001-01-01T00:00:00Z
35 executor = "docker"
36 [runners.docker]
37 tls_verify = false
38 image = "alpine:latest"
39 privileged = false
40 disable_entrypoint_overwrite = false
41 oom_kill_disable = false
42 disable_cache = false
43 volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
44 allowed_pull_policies = ["always", "if-not-present"]
45 shm_size = 0
46 network_mtu = 0
47
48[[runners]]
49 name = "mom"
50 url = "http://192.168.110.128"
51 id = 3
52 token = "glrt-4wNTBXzS8QNiEAjSp-yK"
53 token_obtained_at = 2024-04-20T07:42:33Z
54 token_expires_at = 0001-01-01T00:00:00Z
55 executor = "docker"
56 [runners.cache]
57 MaxUploadedArchiveSize = 0
58 [runners.docker]
59 tls_verify = false
60 image = "alpine:latest"
61 pull_policy="if-not-present"
62 privileged = false
63 disable_entrypoint_overwrite = false
64 oom_kill_disable = false
65 disable_cache = false
66 volumes = ["/cache"]
67 shm_size = 0
68 network_mtu = 0
- concurrent : 限制runner能够同时执行多少个作业
初阶关键词
stages
stages 默认提供,如果不指定stages,可以试用这些stage。
- .pre
- build
- test
- deploy
- .post
script
1npm_inst:
2 script: npm install
1npm_inst:
2 image: node
3 script:
4 - npm isntall
5 - npm build
cache
用来缓存依赖包,避免重复执行下载。
全局配置的key
1default:
2 cache:
3 key: "$CI_COMMIT_PEF_SLUG"
4 paths:
5 - binaries/
key不变就会试用本地的缓存
key 可以执向一个文件列表,文件列表没变,key就是没变
1test-job:
2 stage: build
3 cache:
4 - key:
5 files:
6 - yarn.lock
7 paths:
8 - .yarn-cache/
9 - key:
10 files:
11 - Gemfile.lock
12 paths:
13 - vendor/ruby
14 script:
15 - bundle install --path=vendor
16 - yarn install --cache-folder .yarn-cache
17 - echo 'install done'
cache:policy
默认在开始执行的时候下载缓存,结束的时候上传缓存
policy: pull 跳过下载步骤 ,policy:push 跳过上传步骤
images
runner执行器是 docker的前提才有效
1use_image_job:
2 image: node:12.21.0
3 script: npm -v
tags
tags 用于指定用哪个runner来执行当前作业。
runner 配置了tag
1tags_example:
2 tags:
3 - laravel
4 script: echo "hello fizz"
variables
定义变量
1variables:
2 USER_NAME: 'FIZZ'
3
4test:
5 variables:
6 USER_NAME: 'ZK'
7 script: echo 'hello' $USER_NAME
8# 输出ZK ,局部变量
在ci/cd设置中定义变量
也可以针对 group 进行设置变量
预定义变量
- CI_COMMIT_BRANCH : 提交分支的名称
- CI_COMMIT_REF_NAME : 正在构建项目的分支或tag名
- CI_JOB_NAME: 作业名称
- CI_PROJECT_NAME: 项目名称
when
- on_sucess : 默认值, 在此前之前的阶段的在其他作业都成功执行后,才会触发当前的作业
- on_failure: 当之前的阶段有作业失败,才会触发当前的作业
- always : 不管之前的作业如何, 都被执行
- manual : 该作业只能被手动执行
- nerver: 不被执行
- deplayed: 延迟执行
- start_in 来定义延迟多久时间
手动执行
1manual_job:
2 script: echo 'I think therefor i am'
3 when: manual
1fail_job:
2 script: echo 'everything is going to be alright'
3 when: on_failure
artifacts
将构建出的文件保存起来,
cache 一般用于项目的依赖保,artifacts常用于输出的一些文件、文件夹。 如dist目录,jar包、测试报告。cache可以被手动清空,而artifacts是会过期的。
1upload:
2 script: npm install build
3 artifacts:
4 paths:
5 - /dist
6 - *.jar
7 exclude:
8 - binaries/**/*.0
9 expire_in: 1 week
10 name: "$CI_JOB_NAME"
before_script
before_script 必须是个数组,执行时机是 script之前,artifacts恢复之后。可以定义全局default 关键中定义全局before_script,定义后在每个作业中执行。
after_script
after_script是独立的执行环境,before_script、script中的变量是无权访问的。作业失败也会被执行。如果作业取消或超时,则不会被执行。
only与except
控制作业是否被执行,或当前作业的时机。 only满足条件的时候才会被执行作业。 except不常用,排除某个条件其他都会被执行。
如果没定义only,except或者rules修饰。那么作业将被默认被only修饰,值为tags或者branchs.
只有修改了test分支的代码 ,才会被执行。
1only_example:
2 script: deploy test
3 only:
4 - test
中阶关键词
dependencies
dependencies ,只能是上一阶段的值。 可以定义当前作业下载哪些前置的 artifacts.或者不下载的 artifacts.可以是一个数组,如果是空数组表示不下载任何artifacts,默认都会下载(这样很慢)
1stages:
2 - build
3 - deploy
4
5build_windows:
6 stage: build
7 script:
8 - echo "start build on windows"
9 artifacts:
10 paths:
11 - binaries
12
13build_mac:
14 stage: build
15 script:
16 - echo "start build on mac"
17 artifacts:
18 paths:
19 - binaries
20
21deploy_mac:
22 stage: deploy
23 dependencies:
24 - build_mac
25
26release_job:
27 stage: deploy
28 script: echo 'release version'
29 dependencies: []
allow_failure
设置当前作业失败流水线是否继续运行
默认false, 不允许,失败则停止流水线。
extends
可以用于继承一些配置模板
.开头的作业,是隐藏作业,任何时候不会被执行。
1.test:
2 script: npm lint
3 stage: test
4 only:
5 refs:
6 - branches
7test_job:
8 extends: .test
9 script: npm test
10 only:
11 variables:
12 - $USER_NAME
extends后的作业
1test_job:
2 stage: test
3 script: npm test
4 only:
5 refs:
6 - branches
7 variables:
8 - $USER_NAME
default 、inherit
全局关键词,不能定义在具体的作业中。
default 中设置的所有值自动合并到流水线所有的作业中.
可以使用 default 设置的属性有 after_script,artifacts,before_script,cache,image,interruptible,retry,services,tags,timeout
inherit: 不拿全局的,或者指定拿具体的
1vriables:
2 NAME: "this 1"
3 AGE: "2"
4 SEX: "MAN"
5
6# 整个都不用 default
7test:
8 script: echo 'hello'
9 inherit:
10 # 不会继承 default 的
11 default: false
12 # 全局变量不会被引入
13 variables: false
14
15deploy:
16 script: echo 'hello'
17 inherit:
18 # 指定合并 retry,image属性
19 default:
20 - retry
21 - image
22 # 指定拿 下面 2 个变量
23 variables:
24 - NAME
25 - AGE
interruptible
新流水线把老的流水线给取消掉。 只要有一个 job 不能被取消的 job 运行了。 那么新流水线是无法取消旧流水线的。
如果需要新的把旧的给取消掉,那么可以在 default 关键词下设置 interruptible: true
needs
一个作业使用 needs 设置依赖作业后,只要依赖的作业完成,它就会运行,不需要等上阶段作业完成。 减少总运行时间。
retry
retry 关键词用于设置作业运行失败时的重试次数。
1build:
2 script: npm build
3 retry:
4 max: 2
timeout
设置一个作业的超时时间,超过该时间,流水线旧会被标记失败。
3600seconds,60minutes,one hour,3h,30m等
1build:
2 script: npm build
3 timeout: 1h