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
$ 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
配置成功
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实现前端自动化部署的内容,希望对你有帮助,欢迎评论区交流讨论!