部署

准备

  • 跳过 Docker Registry 的安全检查

    1. vim /etc/docker/daemon.json
    1. {
    2. "insecure-registries": ["192.168.1.27:5005"]
    3. }
  • 确认 GitLab 存放文件路径,新建 .env文件放到此目录,并配置变量名为此目录路径。

    1. 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:

    1. GITLAB_OMNIBUS_CONFIG: |
    2. external_url 'http://192.168.1.27'
    3. registry_external_url 'http://192.168.1.27:5005'
    4. gitlab_rails['gitlab_shell_ssh_port'] = 10080
    5. gitlab_rails['time_zone'] = 'Asia/Shanghai'
    6. gitlab_rails['smtp_enable'] = true
    7. gitlab_rails['smtp_address'] = "smtp.exmail.qq.com" # SMTP 地址,这里是腾讯企业邮箱SMTP的地址
    8. gitlab_rails['smtp_port'] = 465
    9. gitlab_rails['smtp_user_name'] = "xx@xxx.com" # 邮箱地址
    10. gitlab_rails['smtp_password'] = "xxx" # 邮箱密码
    11. gitlab_rails['smtp_authentication'] = "login"
    12. gitlab_rails['smtp_enable_starttls_auto'] = true
    13. gitlab_rails['smtp_tls'] = true
    14. gitlab_rails['gitlab_email_from'] = 'xx@xxn.com' # 邮箱地址,这里需要与smtp_user_name保持一致
    15. gitlab_rails['smtp_domain'] = "exmail.qq.com" # 腾讯企业邮箱的域名,保持不变
    16. gitlab_rails['smtp_pool'] = true

    ports:

    1. - '80:80'
    2. - '10080:22'
    3. - '5005:5005'

    volumes:

    1. - '$GITLAB_HOME/config:/etc/gitlab'
    2. - '$GITLAB_HOME/logs:/var/log/gitlab'
    3. - '$GITLAB_HOME/data:/var/opt/gitlab'

    shm_size: ‘256m’

  1. > 参数说明:
  2. > hostname: 设置容器的 hostname,如果是本地localhost ,否则使用服务器ip<br />ports: 端口转发规则(80Http 访问端口,443Https 访问端口,10080:主机的 ssh 访问端口,22Docker 容器中 ssh 访问端口,5000Container Registry 端口)<br />container_name:容器名称<br />restart: always:每次启动容器就重启GitLab<br />volumes: 共享目录挂载,即 docker 容器内外数据共享
  3. > external_url:外部访问链接,ports中指定了宿主机为80443URL可忽略端口
  4. > registry_external_url:容器Registry链接,ports 中需暴露端口,端口随意,url为部署IP+宿主机端口
  5. > gitlab_rails['smtp_*']:邮件SMTP 配置,查看注释说明即可
  6. >
  7. 此时,`/gitlab`目录下应当有两个文件 `.env` `docker-compose.yml`
  8. - docker compose 安装,docker compose 如何安装不再赘述

docker compose up -d

  1. - 查看运行日志
  2. ```shell
  3. docker logs -f gitlab
  • 部署时间大概需要1分钟,部署完成后即可访问,用户名是 root,密码存在日志中:
    1. 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 提示代表部署成功。
    image.png

    配置

    若要修改 GitLab 相关配置,需修改 gitlab.rb文件,如下为 SSH 示例:
  1. 修改 /etc/gitlab/gitlab.rb

    1. gitlab_rails['gitlab_shell_ssh_port'] = 10080
  2. 应用修改

    1. docker exec -it gitlab gitlab-ctl reconfigure

    Runner

    部署

    若在物理机上运行,则每台物理机只能运行一个 gitlab-runner,但可以注册多个 Runner,每个Runner 都需要指定一个 Executor 类型,如 Shell、Docker等。
    不建议在以 Docker 运行 gitlab-runner,因为这会造成 Docker-in-Docker 的情况。

步骤如下:

  1. 安装 gitlab-runner
  2. 运行 gitlab-runner register,输入 Gitlab 地址和从 GitLab 取得的 token,配置 Executor 类型为 Shell
  3. 重复第2步,我们就得到了多个 Runner,这里的 Runner可以理解为 gitlab-runner 的多个线程

image.png

说明

  1. 如果注册时指定了 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」中看到某一流水线的具体阶段和作业。
    image.png
    上图中就是某一流水线的具体内容,分为 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.keypaths不同,后者会覆盖前者。

    分布式缓存

    为了能够让 runner 之间共享缓存,需要部署缓存服务,配置 runner 缓存。

    缓存服务 MinIO

    1. docker run -d --restart always -p 9005:9000 \
    2. -v /.minio:/root/.minio -v /export:/export \
    3. -e "MINIO_ROOT_USER=root" \
    4. -e "MINIO_ROOT_PASSWORD=root" \
    5. --name minio \
    6. 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 无法识别。
    image.png

    镜像推送到 Container Registry

    $开头的是预定义变量,不确定其值可创建测试 CI 查看输出。 ```yaml test: stage: test tags:
    1. - shell
    script:
    1. - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin
    2. - docker image tag node:lts-alpine3.15 $CI_REGISTRY_IMAGE
    3. - docker push $CI_REGISTRY_IMAGE
  1. <a name="omFo5"></a>
  2. # 备份
  3. 参考 操作,Docker 配置和`Omnibus GitLab packages`相同,相关`backup-options`请参照 `Omnibus GitLab packages`配置。
  4. <a name="rttDd"></a>
  5. ## 备份数据库和代码仓库
  6. 默认全都备份,但只有数据库和代码仓库比较重要,其余可以移除。
  7. ```shell
  8. docker exec -t gitlab gitlab-backup create SKIP=uploads,builds,artifacts,lfs,terraform_state,registry,pages,packages

备份文件

执行上一步操作后,会有红色警告提醒备份两个配置文件,这两个配置文件没有被自动备份,需手动备份,文件在 部署 中的 $GITLAB_HOME/config目录下。
如果 gitlab.rb没有做任何修改,此文件无需备份。

  1. Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data
  2. and are not included in this backup. You will need these files to restore a backup.
  3. 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。其余与 部署 流程无区别。

恢复

  1. # 关闭连接数据库的进程
  2. # gitlab 是新的 GitLab 容器名称,部署参考上方步骤
  3. docker exec -it gitlab gitlab-ctl stop puma
  4. docker exec -it gitlab gitlab-ctl stop sidekiq
  5. # 确认上述进程是否已经关闭
  6. docker exec -it gitlab gitlab-ctl status
  7. # 恢复数据,省略备份文件后缀"_gitlab_backup.tar"
  8. docker exec -it gitlab gitlab-backup restore BACKUP=1655443520_2022_06_17_14.6.1
  9. docker restart gitlab
  10. # 等待容器重启完毕显示 healthy 后,检查 GitLab
  11. docker exec -it gitlab gitlab-rake gitlab:check SANITIZE=true

升级

  1. 备份
  2. 拉取最新镜像,更新 GitLab

    1. docker compose pull
    2. docker compose up -d

    最佳实践

  3. 镜像执行版本,如node:lts-alpine3.15,当前版本的流水线放到一年后也应该同样运转,不指定版本会因差异造成错误。

    常见问题

  4. Vite 项目生成单元测试报告出错

    1. $ npx vitest --run --reporter junit --outputFile rspec.xml
    2. node:internal/errors:464
    3. ErrorCaptureStackTrace(err);
    4. ^
    5. 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_watches

    1. echo fs.inotify.max_user_watches = 524288 | tee -a /etc/sysctl.conf && sysctl -p

    参考

  5. https://forum.gitlab.com/t/register-multiple-runners-on-same-host/38650/4

  6. 使用Docker部署GitLab
  7. https://stackoverflow.com/a/26935369/13430829
  8. https://dev.to/drakulavich/gitlab-ci-cache-and-artifacts-explained-by-example-2opi
  9. 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