学习实践下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