介绍
首先,gitlab 是一个平台,不管使用 docker 来搭建 gitlab 还是直接的镜像,都只是搭建这个平台用. 可以在 Web 上访问.
gitlab-runner 是另一个平台,其用来运行 gitlab CI/CD。
因此使用 gitlab CI/CD 之前,需要先搭建好 gitlab-runner, 然后在 gitlab 的 project 上注册这个 runner (才找得到 runner 在哪里以及哪一个) 之后才能使用.
GitLab 分:
- 社区版,
gitlab-ce
, 免费
- 企业版,
gitlab-ee
, 收费
/etc/gitlab/gitlab.rb
文件
设置外部 url
:
1 2
| external_url 'http: # external_url 'http:
|
设置时区:
1
| gitlab_rails['time_zone'] = 'Asia/Shanghai'
|
设置数据存储地址:
1 2 3 4 5 6 7 8
| git_data_dirs({ "default" => { "path" => "/usr/local/gitlab/data" }, "alternative" => { "path" => "/usr/local/gitlab/data/backup" } })
|
设置 sidekiq
最大并发量:
1
| sidekiq['max_concurrency'] = 20
|
设置 postgresql
:
1 2
| postgresql['shared_buffers'] = "128MB" postgresql['max_worker_processes'] = 4
|
修改 nginx 默认端口:
1
| nginx['listen_port = 8989']
|
关闭 prometheus
监控:
1
| prometheus_monitoring['enable'] = false
|
重新加载 GitLab 配置:
重新启动 GitLab:
查看 GitLab 状态:
设置开机自启动:
1
| systemctl enable gitlab-runsvdir.service
|
开放访问端口:
1 2
| firewall-cmd --zone=public --add-port=8989/tcp --permanent firewall-cmd --reload
|
查看 GitLab 日志:
docker 搭建 gitlab (new)
什么是:
两者什么关系.
1 2 3 4 5 6 7 8 9
| sudo docker run --detach \ --hostname gitlab \ --publish 443:443 --publish 80:80 --publish 222:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest
|
查看启动状态:
若装在 arm 机器上:
1 2 3 4 5 6 7 8 9
| sudo docker run --detach \ --hostname gitlab \ --publish 443:443 --publish 80:80 --publish 222:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ zengxs/gitlab:latest
|
参考
修改 root 密码 (new)
1
| gitlab-rake "gitlab:password:reset[root]"
|
gitlab CI/CD (new)
- gitlab ci/cd
- gitlab runner
- pipeline, 由 stages 组成
- stage, 由 jobs 组成
- job, 执行的任务, 最小单元
.gitlab-ci.yml
, 一般放在项目根目录, 定义流水线内容, 具体脚本, 使用什么 runner 等
有一些钩子用于触发任务.
Gitlab 只是代码管理平台, 若要实现 ci/cd, 需要安装 gitlab runner (执行具体的 job).
安装 gitlab-runner:
1 2 3 4
| sudo docker run -d --name gitlab-runner --restart always \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:latest
|
(一般不对外开端口, 毕竟只是跑跑功能)
到这里为止, gitlab-runner 还没有同 gitlab 起联系. 此时就需要让 gitlab 注册一个 runner.
注册命令为:
1 2 3 4 5 6 7 8 9 10 11
| docker run --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \ --non-interactive \ --executor "docker" \ --docker-image alpine:latest \ --url "http://10.11.30.43/" \ --registration-token "xkv75oaLHDHyKGy3bYev" \ --description "first-register-runner" \ --tag-list "test-cicd, dockercicd" \ --run-untagged="true" \ --locked="false" \ --access-level="not_protected"
|
注意 --url
需要指定 gitlab 的地址, --registration-token
也需要在 gitlab 上查看.
利用 docker 搭建 gitlab
参考
如下:
1 2 3
| $ export GITLAB_HOME=/srv/gitlab $ mkdir -p /opt/docker-compose/gitlab $ vim /opt/docker-compose/gitlab/docker-compose.yml
|
在 docker-compose.yml 中添加:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| version: '3.8' services: gitlab: hostname: '' image: 'gitlab/gitlab-ce:14.2.4-ce.0' restart: always environment: GITLAB_OMNIBUS_CONFIG: | external_url 'http://:9080' gitlab_rails['gitlab_shell_ssh_port'] = 9022 gitlab_rails['time_zone'] = 'Asia/Shanghai' ports: - '9080:9080' - '9022:22' volumes: - '$GITLAB_HOME/config:/etc/gitlab' - '$GITLAB_HOME/logs:/var/log/gitlab' - '$GITLAB_HOME/data:/var/opt/gitlab'
|
注意这里的 hostname
和 external_url
部分要自己补全.
之后在含有 docker-compose.yml
的目录下执行 docker-compose up -d
即可.
初始密码在 $GITLAB_HOME/config/initial_root_password
文件中.
关于 gitlab runner
用容器运行 runner 的官方文档
runners 是用来运行 CI/CD jobs 的代理.
shared runners 意味着所有的 projects 都可以使用这个 runner 来运行服务.
Gitlab runner 的 docker 镜像基于 Ubuntu 或 Alpine.
以下两行命令等效:
在容器内执行:
1
| $ gitlab-runner <runner command and options...>
|
在容器外执行的版本:
1
| $ docker run <chosen docker options...> gitlab/gitlab-runner <runner command and options...>
|
其会创建一个容器,但似乎无法进入. 主要操作就是修改挂载的 volume 然后重新加载容器.
常见的用法如:
1
| $ docker run --rm -t -i gitlab/gitlab-runner --help
|
这里添加 --rm
参数表明用该容器执行命令后删除.
创建一个 gitlab runner
利用 docker:
1 2 3 4 5
| $ docker run -d --name gitlab-runner --restart always \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:latest
|
这里没什么需要修改的,直接用即可.
给某个 gitlab 注册 runner
runner 注册的官方文档
将 gitlab 容器和 gitlab runner 产生联系需利用 registration token:
这里只是获取 registration token 的内容,用来标识这个 gitlab.
注册过程需使用另一个镜像, 脚本如下:
1 2 3 4 5 6 7 8 9 10 11
| docker run --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \ --non-interactive \ --executor "docker" \ --docker-image alpine:latest \ --url "http://10.0.8.3:9080/" \ --registration-token "wknr7omKyoP7xXYQ9ncb" \ --description "second-register-runner" \ --tag-list "testGitlab" \ --run-untagged="true" \ --locked="false" \ --access-level="not_protected"
|
注意一些参数的修改. 如 --url
为 gitlab 所在的地址,--registration-token
为 gitlab 上的 token.
若 --excutor
为 docker, 注意在 /srv/gitlab-runner/config/config.toml
文件中添加 clone-url
:
不然可能会报错. 如:
因为执行环境为 docker, 这里仓库的地址又不是公网 ip, docker 使用 127.0.0.1
就会报错.
也可以手动交互式输入:
1
| $ docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
|
注册之前需要先有 runner 服务. 这里的注册操作其实就是通过修改 /srv/gitlab-runner/config/config.toml
来实现,只不过是先挂载到一个容器中,修改之后将这个容器删除,但是根据 volume 的性质,修改是保存了的. 因此注册实际上就是将 gitlab 服务器和 token 等信息写入 runner 的配置文件.
runner 配置文件官方文档
修改 config.toml
文件. 使用 TOML 的格式.
Gitlab Runner 每 3 秒检查一次配置修改,在必要情况下重新加载配置文件.
如果注册后将 runner 停止运行,pipline 在运行是就会一直 pending.
自动部署项目示例
参考
关于 CI/CD
gitlab CI 指 Continuous Integration.
gitlab CD 指 Continuous Delivery 和 Continuous Deployment.
pipline, 流水线的模式. 分阶段和任务. 任务是最小单元.
pipline -> stages -> jobs
.gitlab-ci.yml
文件是 CI 的配置文件,其放在仓库中.
该文件可能包含的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| stages: - build - test
build-code-job: stage: build script: - echo "Check the ruby version, then build some Ruby project files:" - ruby -v - rake
test-code-job1: stage: test script: - echo "If the files are built successfully, test some files with one command:" - rake test1
test-code-job2: stage: test script: - echo "If the files are built successfully, test other files with a different command:" - rake test2
|
首先定义了两个 stages, 之后定义的都是 jobs, 其中选定其属于哪一个 stage.
scripts
之下是脚本的内容.
所有的语法文档 参见
若某个 job 需要让一个 container 来运行,则在其中添加如:
每一个 job 板块都需要包含 stage
和 scripts
参考 B 站老哥
重要的关键词: stage, script, retry, image, tags, only/except, when, cache.
若没有自己定义 stage 数组,则默认的 stage 有:
.pre
build
test
deploy
.post
任务的执行是按照阶段 stage 定义的顺序执行,而不是你写 job 的顺序.
同一个 stage 中的 jobs 的并发执行数量在 runner 的配置文件中定义,默认为一.
retry
retry 关键词设置的范围是 0~2. 如:
或:
1 2 3 4 5
| retry: max: 2 when: - -
|
image
既可以定义全局,也可以指定某个任务.
指定 runner.
only/except
限定当前任务执行的条件.
cache
缓存当前工作环境目录中的一些文件,在某个任务初始化时恢复.
其下一般用到两个关键词:
前者标识这次缓存, 后者指明文件的路径.
检出缓存似乎不需要手动检出,而是在每个阶段开始时自动检出. 每次检出后又会缓存.
变量的使用
在 .gitlab-ci.yml
文件中定义变量.
使用 variable:
, 变量名最好都用大写如:
1 2 3 4 5 6 7 8
| variables: MT_VAR: "my name is ..." TEST: "The second var"
log_var: script: - echo $MT_VAR
|
两个 flag, Protect variable
, 表明只有在保护分支中才能使用该变量.
Mask variable
表明在 pipline 中不会直接显示.
pipline 中有预定义的变量.
使用 export
可以导出所有变量:
流水线类型
官方文档
DAG 流水线 (Directed Acyclic Graphs)
适用于多平台部署:
设置依赖关系. 用 needs
关键词, 如:
1 2 3 4 5
| test_a: stage: test needs: [build_a] script: - echo "..."
|
方括号里面为其他 job 的名称.
父子流水线
在同一个项目中子目录下也有 .gitlab-ci.yml
文件,也就是配置字流水线.
触发式. 使用 trigger
, include
和 rules
关键词.
如:
1 2 3 4 5 6 7
| trigger_a: stage: test trigger: include: a/.gitlab-ci.yml rules: - change: - a/*
|
这里 triger
和 include
就是指明子流水线的配置文件位置.
rules
就是指明什么时候执行 triger
下的流水线.
多项目流水线
触发另一个项目的流水线. 就是有多个 project.
示例:
1 2 3 4 5 6
| trigger_c: stage: triggers trigger: project: root/... # 指明 project 的位置 branch: master # 指明哪个分支 strategy: depend
|
这里没有指定触发条件.
合并流水线
合并的时候触发.
在一个 job 下添加:
流水线的触发
推送代码时,定时,url, 手动触发.
远程服务器部署
官方关于 ssh
主要原理就是利用 ssh 将文件上传到目标主机 (即要发布项目的主机).
现在 gitlab runner 所在主机生成 ssh 的密钥对,然后将公钥传给项目部署所在的主机:
1 2
| $ ssh-keygen -t rsa -b 2048 -C "email@example.com" $ scp -r id_rsa.pub root@1.2.3.4:/root/.ssh/authorized_keys
|
.gitlab-ci.yml
文件内容:
1 2 3 4 5 6 7 8 9 10 11 12 13
| job-deploy: stage: deploy before_script: - 'which ssh-agent || ( yum update -y && yum install openssh-client git -y )' - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - mkdir -p ~/.ssh - chmod 700 ~/.ssh - ssh-keyscan ... >> ~/.ssh/knon_hosts - chmod 644 ~/.ssh/known_hosts script: - echo 'start scp' - scp -r dist root@...
|
调试手段