关于ci-cd:Linux下使用GitLab的runner来自动部署Go项目

23次阅读

共计 4359 个字符,预计需要花费 11 分钟才能阅读完成。

Linux 下应用 GitLab 的 runner 来主动部署 Go 我的项目

在我的项目开发过程中,咱们常常会应用 GitLab 的 CI/CD 来主动部署我的项目,明天就让咱们来实现一个在 Linux 下启用 GItLab 的 CI/CD 来实现 Go 我的项目的主动部署。

咱们须要在 GitLab 上有一个我的项目,这里就不做演示了,咱们间接开始先装置 runners。

1 装置 runners

GitLab 有三种 Runner,别离是:

  • Shared runners are available to all groups and projects in a GitLab instance.
  • Group runners are available to all projects and subgroups in a group.
  • Specific runners are associated with specific projects. Typically, specific runners are used for one project at a time.

了解来说的话,就是:

  • Shared runners 是所有组和我的项目都能够应用共享流道,管理员来操作,通常只用在小团队中,GitLab 中,默认是没有的。
  • Group runners 比拟罕用,能够反对团队内多个我的项目共享。可复用的 Runner,能够同时反对一类我的项目的 CI,进步资源复用率。
  • Specific runners 则是与特定的我的项目关联,不能共享。而且,对集体我的项目来说,没有 Group 这一层,应用 Specific runners 是比拟适合的。

Runner 是由运行在服务器上的守护过程来治理,一个守护过程能够治理多个 runner,多个 runner 之间是依据 token 和 url,注册到指定的 GitLab 上。

上面的教程也是基于 Specific runners 来做演示,首先咱们先下载 GitLab 的 runner,咱们先进入 GitLab 的 runner 下载页面:https://docs.gitlab.com/runne…,能够看到官网的装置教程。

我当初应用的机器是一台腾讯云的 Linux 服务器,因而我须要抉择 Install on GNU/Linux,如下图所示:

如果大家应用的是别的零碎,能够抉择对应的下载方式即可。

而后能够依据提醒进入下载页面,也可间接看上面的例子,下载对应的安装包,演示的机器应用的是 Centos,抉择上面的例子即可。

这时候会发现,这个命令里有一个 ${arch} 的参数,咱们看正文:

# Replace ${arch} with any of the supported architectures, e.g. amd64, arm, arm64
# A full list of architectures can be found here https://gitlab-runner-downloads.s3.amazonaws.com/latest/index.html
curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_${arch}.rpm"

${arch} 能够替换为任何反对的体系架构,也就是咱们须要改成这个样子:

curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_amd64.rpm"
curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_arm64.rpm"
curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_arm.rpm"

这个也要依据本人理论的机器的状况来做抉择,我以后应用的是 amd64。咱们也能够应用 uname -m 命令来查看机器的架构,如:

我的服务器是 x86 架构的,用 m1 的 Mac 查问,返回如下:

而后咱们也能够应用本人的电脑间接应用浏览器拜访 curl 的地址,查看链接是否失常,是否失常下载。

测试过后,间接在服务器上的终端里应用下面列出的 curl 命令来下载对应的 rpm 包。

因为服务器上下载较慢,我间接应用浏览器下载的,截图里做个示范。

而后应用 rpm 命令装置即可

rpm -ivh gitlab-runner_<arch>.rpm

装置 gitlab-runner 须要有 git 的环境,如果没有须要自行装置一下,Centos 能够间接应用 yum 装置。

装置实现后,应用命令

gitlab-runner -v

查看版本,显示如下,阐明装置胜利。

2 在 GitLab 里获取 token

在 runner 装置实现之后,咱们回到 GitLab 的我的项目的 Settings 页面,进入 CI/CD 后,点开 Runners 里的 Expand 按钮,如图所示:

点开后会看到 Specific runners 用来注册的 URL 和 token,这个咱们在注册 runners 的时候须要填写。

持续回到服务器里,应用 gitlab-runner 开始注册

[root@centos software]# gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=2502549 revision=e0218c92 version=14.3.2
Running in system-mode.                            
                                                   
Enter the GitLab instance URL (for example, https://gitlab.com/):
https://gitlab.com/
Enter the registration token:
NzE3jDif-xxxxxxx
Enter a description for the runner:
[centos]: runner1
Enter tags for the runner (comma-separated):

Registering runner... succeeded                     runner=NzE3jDif
Enter an executor: custom, docker, parallels, docker+machine, docker-ssh+machine, kubernetes, docker-ssh, shell, ssh, virtualbox:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 

几个参数阐明:

  • GitLab instance URL:写下面截图里 CI/CD 里注册用的那个地址;
  • token:写下面截图里 CI/CD 里注册用的那个 token
  • description:填写相干形容
  • tags:选填,也可在 GitLab 的网页上批改,和 gitlab 的.gitlab-ci.yml 文件里配置的 tags 无关;比方对一个 runner 设置了某个标签后,对应的 Job 必须要设置这个标签,能力在这个 runner 上执行。
  • executor:间接就选 shell 吧,应用 shell 命令,简略无效。

当咱们注册胜利后,就能够在 GitLab 的界面看到这个 runner。

这样,一个 runner 就注册胜利了。

3 写.gitlab-ci.yml 文件,实现主动部署

到目前为止,咱们曾经胜利装置了 runner 和实现了 runner 的注册,接写来,模仿一个简略的.gitlab-ci.yml 文件,来实现 Go 我的项目的主动部署。

在 job 运行时,咱们从新打包的过程,须要重启,这时候咱们能够思考应用守护过程来启动我的项目,须要如何操作呢,首先在 /etc/systemd/system 目录下新建一个配置文件,

vim /etc/systemd/system/runner1.service

而后粘贴如下代码

[Unit]
After=network.target
[Service]
User=root
Group=root
ExecStart=/opt/project/runner1/runner1
Type=simple
[Install]
WantedBy=multi-user.target
  • User 和 Group 要填写对应的用户和组;
  • ExecStart,是打包后的可执行文件的目录

.gitlab-ci.yml 文件我给出了一个示例,具体的语法能够去参考 GitLab 的官网文档。

image: golang

stages:
  - main

main:
  stage: main
  script:
    - echo "Start to deploy!"
    - echo ${CI_PROJECT_DIR}
    - cd ${CI_PROJECT_DIR}
    # 设置 go 代理
    - go env -w GO111MODULE=on
    - go env -w GOPROXY=https://goproxy.cn,direct
    # 打包到指定目录
    - go build -o /opt/project/runner1/runner1 main.go
    # 重启过程
    - systemctl restart runner1.service
  tags:
    - master

  only:
    - main

yml 文件里的 tags 就是在注册 runner 的时候填写的 tags,方才咱们留空了,是因为能够在 GitLab 的网页端进行批改,在网页端对应的 runner 处,点击编辑,进去后就能够批改了。

而后批改成在 yml 文件里配置的就能够了。

4 补充:gitlab-runner 权限的问题

其实咱们应用了 systemctl 来守护过程,也会遇到一个问题就是,gitlab-runner 在执行的时候,应用的是 gitlab-runner 用户,因而会导致权限有余,而们能够批改 gitlab-runner 的默认用户来解决这个问题,

vim /etc/systemd/system/gitlab-runner.service

而后将 –user 的参数从 gitlab-runner 改成 root 即可。

/usr/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-runner" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--user" "root"

最初代码 push 下来之后,就能够在 GitLab 网页端的 CI/CD 里的 jobs 里看到 job 的状态了。

这样就实现了一个根底的 CI/CD 的流水线部署了。

如有问题,欢送留言,祝大家工作顺利~

正文完
 0