部署
准备
跳过 Docker Registry 的安全检查
vim /etc/docker/daemon.json
{"insecure-registries": ["192.168.1.27:5005"]}
确认 GitLab 存放文件路径,新建
.env文件放到此目录,并配置变量名为此目录路径。GITLAB_HOME=/gitlab
Docker Compose
采用官方文档的 Docker 方式部署,注意将文档中的 ee 镜像替换为 ce,GitLab 提供的官方镜像中封装了Nginx、PostgreSQL、Redis等,需要分离请使用 sameersbn/docker-gitlab,该镜像与官方区别较大,不建议使用。 ```yaml version: ‘3.5’ services: gitlab: image: ‘gitlab/gitlab-ce:latest’ container_name: gitlab restart: always hostname: ‘192.168.1.27’ environment:
GITLAB_OMNIBUS_CONFIG: |external_url 'http://192.168.1.27'registry_external_url 'http://192.168.1.27:5005'gitlab_rails['gitlab_shell_ssh_port'] = 10080gitlab_rails['time_zone'] = 'Asia/Shanghai'gitlab_rails['smtp_enable'] = truegitlab_rails['smtp_address'] = "smtp.exmail.qq.com" # SMTP 地址,这里是腾讯企业邮箱SMTP的地址gitlab_rails['smtp_port'] = 465gitlab_rails['smtp_user_name'] = "xx@xxx.com" # 邮箱地址gitlab_rails['smtp_password'] = "xxx" # 邮箱密码gitlab_rails['smtp_authentication'] = "login"gitlab_rails['smtp_enable_starttls_auto'] = truegitlab_rails['smtp_tls'] = truegitlab_rails['gitlab_email_from'] = 'xx@xxn.com' # 邮箱地址,这里需要与smtp_user_name保持一致gitlab_rails['smtp_domain'] = "exmail.qq.com" # 腾讯企业邮箱的域名,保持不变gitlab_rails['smtp_pool'] = true
ports:
- '80:80'- '10080:22'- '5005:5005'
volumes:
- '$GITLAB_HOME/config:/etc/gitlab'- '$GITLAB_HOME/logs:/var/log/gitlab'- '$GITLAB_HOME/data:/var/opt/gitlab'
shm_size: ‘256m’
> 参数说明:> hostname: 设置容器的 hostname,如果是本地localhost ,否则使用服务器ip<br />ports: 端口转发规则(80:Http 访问端口,443:Https 访问端口,10080:主机的 ssh 访问端口,22:Docker 容器中 ssh 访问端口,5000:Container Registry 端口)<br />container_name:容器名称<br />restart: always:每次启动容器就重启GitLab<br />volumes: 共享目录挂载,即 docker 容器内外数据共享> external_url:外部访问链接,ports中指定了宿主机为80或443则URL可忽略端口> registry_external_url:容器Registry链接,ports 中需暴露端口,端口随意,url为部署IP+宿主机端口> gitlab_rails['smtp_*']:邮件SMTP 配置,查看注释说明即可>此时,`/gitlab`目录下应当有两个文件 `.env`和 `docker-compose.yml`。- docker compose 安装,docker compose 如何安装不再赘述
docker compose up -d
- 查看运行日志```shelldocker logs -f gitlab
- 部署时间大概需要1分钟,部署完成后即可访问,用户名是
root,密码存在日志中:docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
Container Registry
启用 Container Registry 只需指定配置registry_external_url 'http://192.168.1.27:5005'即可,记得需暴露端口。
按照 部署 执行,登录 GitLab 网页端,进入默认项目,查看左侧「Packages & Registries」——「Container Registry」,若出现 CLI Commands 提示代表部署成功。
配置
若要修改 GitLab 相关配置,需修改gitlab.rb文件,如下为 SSH 示例:
修改
/etc/gitlab/gitlab.rbgitlab_rails['gitlab_shell_ssh_port'] = 10080
应用修改
docker exec -it gitlab gitlab-ctl reconfigure
Runner
部署
若在物理机上运行,则每台物理机只能运行一个 gitlab-runner,但可以注册多个 Runner,每个Runner 都需要指定一个 Executor 类型,如 Shell、Docker等。
不建议在以 Docker 运行 gitlab-runner,因为这会造成 Docker-in-Docker 的情况。
步骤如下:
- 安装 gitlab-runner
- 运行
gitlab-runner register,输入 Gitlab 地址和从 GitLab 取得的 token,配置 Executor 类型为 Shell - 重复第2步,我们就得到了多个 Runner,这里的 Runner可以理解为 gitlab-runner 的多个线程
说明
- 如果注册时指定了 tag,CI 文件中也必须指定 tag,否则执行时找不到 runner 运行。
使用Docker构建镜像
推荐使用shell executor来构建镜像,参考https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#use-the-shell-executor,使用docker executor则是在docker镜像里面构建新的镜像(Docker-in-Docker),不推荐。CI/CD
在 GitLab 中,一条流水线(Pipeline)由多个阶段(Stage)组成,每一个阶段又可以由多个作业(Job)组成,作业又可以被上面提到的 Runner 执行(一个作业仅能被一个 Runner 执行)。
我们构建一条流水线后,能在项目的「CI/CD——Pipelines」中看到某一流水线的具体阶段和作业。
上图中就是某一流水线的具体内容,分为 Build 和 Test 两个阶段,Build 阶段只有一个名为 Build 的作业,而 Test 则含有 code_quality、eslint-sast等作业。Cache
指定 job 运行中的缓存相关文件,以减少每次运行job时需重新生成相关文件的时间。
通过cache.key辨别不同分支、作业是否使用同一缓存。保存地址
| Shell | Locally, under the gitlab-runner user’s home directory: /home/gitlab-runner/cache// / /cache.zip. | | —- | —- | | Docker | Locally, under Docker volumes: /var/lib/docker/volumes/ /_data/ / / /cache.zip. |
- CI/CD 时,缓存无法在runner间共享,必须启用分布式缓存才能共享。
- 不同 job 拥有相同
cache.key但paths不同,后者会覆盖前者。分布式缓存
为了能够让 runner 之间共享缓存,需要部署缓存服务,配置 runner 缓存。缓存服务 MinIO
docker run -d --restart always -p 9005:9000 \-v /.minio:/root/.minio -v /export:/export \-e "MINIO_ROOT_USER=root" \-e "MINIO_ROOT_PASSWORD=root" \--name minio \minio/minio:latest server /export
Artifacts
构建的产物,可以被下载,如 jar 文件、Docker 镜像等单元测试
执行单元测试时,通过[artifacts:reports:junit](https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportsjunit)指定生成的测试文件,GitLab 能自动识别并作为 artifacts 上传,然后在 pipeline 中显示单元测试结果。注意,该文件必须是 xml 格式,否则 GitLab 无法识别。
镜像推送到 Container Registry
$开头的是预定义变量,不确定其值可创建测试 CI 查看输出。 ```yaml test: stage: test tags:
script:- shell
- echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin- docker image tag node:lts-alpine3.15 $CI_REGISTRY_IMAGE- docker push $CI_REGISTRY_IMAGE
<a name="omFo5"></a># 备份参考 操作,Docker 配置和`Omnibus GitLab packages`相同,相关`backup-options`请参照 `Omnibus GitLab packages`配置。<a name="rttDd"></a>## 备份数据库和代码仓库默认全都备份,但只有数据库和代码仓库比较重要,其余可以移除。```shelldocker exec -t gitlab gitlab-backup create SKIP=uploads,builds,artifacts,lfs,terraform_state,registry,pages,packages
备份文件
执行上一步操作后,会有红色警告提醒备份两个配置文件,这两个配置文件没有被自动备份,需手动备份,文件在 部署 中的 $GITLAB_HOME/config目录下。
如果 gitlab.rb没有做任何修改,此文件无需备份。
Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive dataand are not included in this backup. You will need these files to restore a backup.Please back them up manually.
恢复数据
恢复数据必须和原来的 GitLab 是同一个版本,否则无法恢复。
部署
在部署之前需要先将之前备份的配置文件移到 GitLab 配置文件目录 $GITLAB_HOME/config,将生成的备份数据文件移到 $GITLAB_HOME/data/backups,并配置权限chmod 755 1655443520_2022_06_17_14.6.1_gitlab_backup.tar。其余与 部署 流程无区别。
恢复
# 关闭连接数据库的进程# gitlab 是新的 GitLab 容器名称,部署参考上方步骤docker exec -it gitlab gitlab-ctl stop pumadocker exec -it gitlab gitlab-ctl stop sidekiq# 确认上述进程是否已经关闭docker exec -it gitlab gitlab-ctl status# 恢复数据,省略备份文件后缀"_gitlab_backup.tar"docker exec -it gitlab gitlab-backup restore BACKUP=1655443520_2022_06_17_14.6.1docker restart gitlab# 等待容器重启完毕显示 healthy 后,检查 GitLabdocker exec -it gitlab gitlab-rake gitlab:check SANITIZE=true
升级
- 备份
拉取最新镜像,更新 GitLab
docker compose pulldocker compose up -d
最佳实践
镜像执行版本,如
node:lts-alpine3.15,当前版本的流水线放到一年后也应该同样运转,不指定版本会因差异造成错误。常见问题
Vite 项目生成单元测试报告出错
$ npx vitest --run --reporter junit --outputFile rspec.xmlnode:internal/errors:464ErrorCaptureStackTrace(err);^Error: ENOSPC: System limit for number of file watchers reached, watch '/builds/gitlab-instance-01abb638/Monitoring/.pnpm-store/v3/files/4f/9c9c0fe6d5674cbbb4ced4a1c7612b883e60cfb2ee2e83189c6f5af77da817293ce36ab542b945ef6869e4af5763cb2dee92d9c654072c137849b22b301f0a'
在 gitlab-runner 所处宿主机设置
fs.inotify.max_user_watchesecho fs.inotify.max_user_watches = 524288 | tee -a /etc/sysctl.conf && sysctl -p
参考
https://forum.gitlab.com/t/register-multiple-runners-on-same-host/38650/4
- 使用Docker部署GitLab
- https://stackoverflow.com/a/26935369/13430829
- https://dev.to/drakulavich/gitlab-ci-cache-and-artifacts-explained-by-example-2opi
- https://medium.com/devops-with-valentine/how-to-build-a-docker-image-and-push-it-to-the-gitlab-container-registry-from-a-gitlab-ci-pipeline-acac0d1f26df
