通过Docker结合Gitlab和gitlab-runner实现前端自动化部署

1,175 阅读8分钟

1、安装 gitlab

GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。与 Github 类似,GitLab 能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。

本篇介绍如何通过docker安装部署 GitLab。

拉取 GitLab 镜像

$ docker pull gitlab/gitlab-ce:latest

创建并运行 GitLab 镜像

$ docker run -d -p 9443:443 -p 9080:80 -p 9022:22 --name gitlab --restart always -v /root/gitlab/config:/etc/gitlab -v /root/gitlab/logs:/var/log/gitlab -v /root/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce

# -d:后台运行
# -p:将容器内部端口向外映射
# --name:命名容器名称
# -v:将容器内数据文件夹或者日志、配置等文件夹挂载到宿主机指定目录

注意:容器的 22 端口是 SSH 端口,切记不要把容器的 22 端口映射到宿主机的 22,宿主机的该端口已经开启了 sshd 进程的监听,用于客户端的 ssh 远程登录。

创建成功后可以通过主机的 IP:9080 访问 gitlab 的站点了

通过 docker ps 命令可以看到刚刚启动的容器处于 starting 状态,这时候访问会出现 502,直到 status 变为 healthy,就可以正常访问了。

修改配置

GitLab 的配置文件为容器中的 /etc/gitlab/gitlab.rb 文件

# 配置http协议所使用的访问地址,不加端口号默认为80
$ external_url 'http://主机IP:9080'

# 配置ssh协议所使用的访问地址和端口
$ gitlab_rails['gitlab_ssh_host'] = '主机IP'
$ gitlab_rails['gitlab_shell_ssh_port'] = 9022

# 默认时区为 UTC,所以显示的用户活动时间会比中国时间早 8 个小时
$ gitlab_rails['time_zone'] = 'Asia/Shanghai'

修改 root 用户密码

进入容器

$ docker exec -it gitlab bash

在 root 用户下,执行

$ gitlab-rails console -e production

这个 -e 的参数一定不能少。命令比较慢,几十秒后,会进入控制台。执行如下操作:

获得用户数据,修改用户密码

# 查询用户
irb(main):001:0> user = User.where(id: 1).first
=> #<User id:1 @root>

# 修改密码
irb(main):002:0> user.password="12345678"
=> "12345678"

# 确认密码
irb(main):003:0> user.password_confirmation="12345678"
=> "12345678"

# 保存
irb(main):004:0> user.save!
=> true

# 退出
irb(main):005:0> quit

可以正常登录了 应户名 root 密码 刚刚设置的

优化配置

gitlab非常占内存,个人使用建议优化,减少内存使用

# 设置超时时间
puma['worker_timeout'] = 60
# 默认是被注释掉的,最小不能低于2 根据自己的服务器配置和使用情况自行更改
puma['worker_processes'] = 4
# 数据库缓存 默认为256MB
postgresql['shared_buffers'] = "256MB" 
# 数据库并发数 默认为8
postgresql['max_worker_processes'] = 8
# sidekiq并发数 默认是25
sidekiq['concurrency'] = 25

以上的配置信息都可以根据自己的实际情况修改配置

常用命令

gitlab-ctl help               #查看gitlab帮助信息
gitlab-ctl show-config        #查看gitlab配置信息
gitlab-ctl status            #查看gitlab状态
gitlab-ctl reconfigure       #重新加载Gitlab配置
gitlab-ctl restart           #重启Gitlab所有组件
gitlab-ctl stop              #停止Gitlab所有组件
gitlab-ctl tail postgresql   #查看postgresql的日志

2、安装注册 gitlan-runner

GitLab Runner 是一个与 GitLab CI/CD 一起使用以在管道中运行作业的应用程序。

您可以选择在您拥有或管理的基础设施上安装GitLab Runner 应用程序。如果这样做,出于安全和性能原因,您应该将 GitLab Runner 安装在与托管 GitLab 实例的机器不同的机器上。当您使用不同的机器时,您可以在每台机器上拥有不同的操作系统和工具,例如 Kubernetes 或 Docker。

GitLab Runner 是开源的,用Go编写。它可以作为单个二进制文件运行;不需要特定语言的要求。您可以在几个不同的受支持操作系统上安装 GitLab Runner。其他操作系统也可以工作,只要您可以在它们上编译 Go 二进制文件。GitLab Runner 也可以在 Docker 容器内运行或部署到 Kubernetes 集群中。

拉取 gitlab-runner 镜像

$ docker pull gitlab/gitlab-runner:latest

创建并运行 gitlab-runner 镜像

$ docker run -d --name runner --restart always \
 -v /root/gitlab-runner/config:/etc/gitlab-runner \
 -v /var/run/docker.sock:/var/run/docker.sock \
 gitlab/gitlab-runner:latest

# -d:后台运行
# --name:命名容器名称
# -v:将容器内数据文件夹或者日志、配置等文件夹挂载到宿主机指定目录

注册runner

进入容器

$ docker exec -it runner bash

注册runner

$ gitlab-runner register
$ Enter the GitLab instance URL (for example, https://gitlab.com/):   输入 GitLab 地址
$ Enter the registration token: 输入 GitLab Token

gitlab.png

$ Enter a description for the runner:  输入 runner 名称
$ Enter tags for the runner (comma-separated):  设置 tag 
$ Enter optional maintenance note for the runner:  输入可选维护说明
$ Please enter the executor:选择 runner 类型,这里我选择的是 **docker**

设置tag 是需要注意 这个在后面配置 .gitlab-ci.yml文件时候会使用到

修改配置

找到 /root/gitlab-runner/config/config.toml 的配置文件

  [runners.docker]
    tls_verify = false
    image = "docker:latest"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock", "/root/gitlab-runner/config/certs:/etc/gitlab-runner/certs"]
    shm_size = 0

配置成功

配置成功.png

3、在项目中编写 .gitlab-ci.yml文件

要查看.gitlab-ci.yml企业中使用的大文件,请.gitlab-ci.yml参阅gitlab.

编辑.gitlab-ci.yml文件时,可以使用 CI Lint工具对其进行验证。

全局配置关键字

  • default 工作关键字的自定义默认值。
  • stages 流水线阶段的名称和顺序。
  • variables 为管道中的所有作业定义 CI/CD 变量。
  • workflow 控制运行什么类型的管道。
  • before_script 覆盖在作业之前执行的一组命令。

使用作业关键字配置的作业:

  • before_script 覆盖在作业之前执行的一组命令。
  • cache 应在后续运行之间缓存的文件列表。
  • image 使用 Docker 镜像。
  • only 控制何时创建工作。
  • script 由运行程序执行的 Shell 脚本。
  • stage 定义作业阶段。
  • services 使用 Docker 服务镜像。
  • variables 在工作级别定义工作变量。
  • tags 用于选择跑步者的标签列表。 更多的详细配置

注意,这里的tags 需要在gitlab-runner注册时声明comma-separated

在项目的根目录下创建.gitlab-ci.yml文件

免密上传文件到服务器

无论是部署静态文件还是部署弄的服务都需要将打包好的文件上传到服务器上并且有相应的后续操作

第一步、在gitlab-runner容器中创建密钥对

# 创建密钥对
$ ssh-keygen -t rsa -C "your@email.com"
$ cd ~/.ssh/

# 查看公钥
$ cat id_rsa.pub

# 查看密钥
$ cat id_rsa

第二步、在上传文件的目标服务器上创建~/.ssh/known_hosts文件将上面的公钥复制到其中

第三步、通过密钥在gitlab对应的CI/CD(和gitlab-runner的token对应)中创建变量

创建密钥变量

部署静态文件 .gitlab-ci.yml编写

stages: # 所有阶段任务
  - build

before_script:
  - echo "这是执行 build_job 之前会执行的脚本"
  - 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
  - eval $(ssh-agent -s)
  - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - ssh-keyscan 服务器IP >> ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts

build_job:
  stage: build
  artifacts:
      - dist
    paths:
  image: node:16.13.1
  only:
    - main
  script:
    - echo "============ 开始构建 ============"
    - echo "============ 执行 install ============"
    - npm install
    - echo "============ install 已完成 ============"
    - echo "============ 执行 build ============"
    - npm run build
    - echo "============ build 已完成 ============"
    - echo "============ 开始上传文件 ============"
    - scp -r dist/* 服务器IP:文件夹目录
    - echo "============ 上传文件结束 ============"

  tags:
    - deploy-tag

主要操作是将build之后的文件上传到服务器的指定目录下

部署node服务 .gitlab-ci.yml编写

在根目录下创建DockerFile并将其一起复制到服务器的文件夹中

FROM node:16.13.1
RUN apt-get update && apt-get install git -y && apt-get install imagemagick -y

RUN chmod 775 ~/

WORKDIR /home

RUN npm install -g pm2

RUN mkdir logs
COPY /dist ./

RUN npm install
RUN chown -R node:root /home

ENV NODE_ENV=production
ENV ENV_ECS=true

EXPOSE 12345

CMD ["npm", "run", "start"]

将.gitlab-ci.yml的任务分为两部分,一部分是打包上传文件,如部署静态文件一样,另一部分是通过docker build命令创建一个docker image, 然后在杀死上一个版本的容器,根据新的image创建一个容器

stages: # 所有阶段任务
  - build
  - deploy

before_script:
  - echo "这是执行 build_job 之前会执行的脚本"
  - 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
  - eval $(ssh-agent -s)
  - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - ssh-keyscan 服务器IP >> ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts

build_job:
  stage: build
  artifacts:
    paths:
      - dist
  image: node:16.13.1
  only:
    - main
  script:
    - echo "============ 开始构建 ============"
    - echo "============ 执行 install ============"
    - npm install
    - echo "============ install 已完成 ============"
    - echo "============ 执行 build ============"
    - npm run build
    - echo "============ build 已完成 ============"
    - echo "============ 开始上传文件 ============"
    - scp -r dist/* 服务器IP:文件夹目录
    - echo "============ 上传文件结束 ============"

  tags:
    - deploy-tag

deploy_job:
  stage: deploy
  artifacts:
    paths:
      - dist
  image: docker:latest
  services:
    - docker:latest
  only:
    - main
  script:
    - echo "============ 创建docker image ============"
    - docker build -t client-home-image .
    - echo "============ 检测client-home是否存在 ============"
    - if [ $(docker ps -aq --filter name=client-home) ]; then docker rm -f client-home;fi
    - docker run -d -p 12345:12345 --name client-home client-home-image
    - echo "============ 构建完成 ============"

  tags:
    - deploy-tag

总结

如果之前使用过 docker,整个安装过程会十分顺利,一般不会有奇怪的问题。

以上就是自己总结的通过Docker结合Gitlab和gitlab-runner实现前端自动化部署的内容,希望对你有帮助,欢迎评论区交流讨论!