gitlab-搭建

介绍

首先,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://gitlab.example.com'
# external_url 'http://192.168.1.100:8989'

设置时区:

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 配置:

1
gitlab-ctl reconfigure

重新启动 GitLab:

1
gitlab-ctl restart

查看 GitLab 状态:

1
gitlab-ctl status

设置开机自启动:

1
systemctl enable gitlab-runsvdir.service

开放访问端口:

1
2
firewall-cmd --zone=public --add-port=8989/tcp --permanent
firewall-cmd --reload

查看 GitLab 日志:

1
gitlab-ctl tail

docker 搭建 gitlab (new)

什么是:

  • GitLab
  • GitLab Runner

两者什么关系.

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

查看启动状态:

1
docker logs -f gitlab

若装在 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'

注意这里的 hostnameexternal_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.

自动部署项目示例

参考

参考 B 站系列视频

关于 CI/CD

gitlab CI 指 Continuous Integration.

gitlab CD 指 Continuous Delivery 和 Continuous Deployment.

pipline, 流水线的模式. 分阶段和任务. 任务是最小单元.

pipline -> stages -> jobs

.gitlab-ci.yml 文件是 CI 的配置文件,其放在仓库中.

参考官方文档编写 .gitlab-ci.yml 文件

该文件可能包含的内容:

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 来运行,则在其中添加如:

1
image: ruby:2.7.5

每一个 job 板块都需要包含 stagescripts

参考 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
retry: 2

或:

1
2
3
4
5
retry:
max: 2
when:
-
-

image

既可以定义全局,也可以指定某个任务.

tags

指定 runner.

only/except

限定当前任务执行的条件.

cache

缓存当前工作环境目录中的一些文件,在某个任务初始化时恢复.

其下一般用到两个关键词:

  • key
  • paths

前者标识这次缓存, 后者指明文件的路径.

检出缓存似乎不需要手动检出,而是在每个阶段开始时自动检出. 每次检出后又会缓存.

变量的使用

.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 可以导出所有变量:

1
2
script:
- 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, includerules 关键词.

如:

1
2
3
4
5
6
7
trigger_a:
stage: test
trigger:
include: a/.gitlab-ci.yml
rules:
- change:
- a/*

这里 trigerinclude 就是指明子流水线的配置文件位置.

rules 就是指明什么时候执行 triger 下的流水线.

多项目流水线

触发另一个项目的流水线. 就是有多个 project.

示例:

1
2
3
4
5
6
trigger_c:
stage: triggers
trigger:
project: root/... # 指明 project 的位置
branch: master # 指明哪个分支
strategy: depend

这里没有指定触发条件.

合并流水线

合并的时候触发.

在一个 job 下添加:

1
2
only:
- merge_requests

流水线的触发

推送代码时,定时,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 # 这一部分在将私钥放在 runner 所在的服务器
- ssh-keyscan ... >> ~/.ssh/knon_hosts
- chmod 644 ~/.ssh/known_hosts
script:
- echo 'start scp'
- scp -r dist root@...

调试手段


gitlab-搭建
http://example.com/2022/11/05/gitlab-搭建/
作者
Jie
发布于
2022年11月5日
许可协议