Linux下使用GitLab的runner来自动部署Go项目

热榜客
• 阅读 3220

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,如下图所示:

Linux下使用GitLab的runner来自动部署Go项目

如果大家使用的是别的系统,可以选择对应的下载方式即可。

然后可以根据提示进入下载页面,也可直接看下面的例子,下载对应的安装包,演示的机器使用的是Centos,选择下面的例子即可。

Linux下使用GitLab的runner来自动部署Go项目

这时候会发现,这个命令里有一个${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 命令来查看机器的架构,如:

Linux下使用GitLab的runner来自动部署Go项目

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

Linux下使用GitLab的runner来自动部署Go项目

然后我们也可以使用自己的电脑直接使用浏览器访问curl的地址,查看链接是否正常,能否正常下载。

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

Linux下使用GitLab的runner来自动部署Go项目

由于服务器上下载较慢,我直接使用浏览器下载的,截图里做个示范。

然后使用rpm命令安装即可

rpm -ivh gitlab-runner_<arch>.rpm

安装gitlab-runner需要有git的环境,如果没有需要自行安装一下,Centos可以直接使用yum安装。

安装完成后,使用命令

gitlab-runner -v

查看版本,显示如下,说明安装成功。

Linux下使用GitLab的runner来自动部署Go项目

2 在GitLab里获取token

在runner安装完成之后,我们回到GitLab的项目的Settings页面,进入CI/CD后,点开Runners里的Expand按钮,如图所示:
Linux下使用GitLab的runner来自动部署Go项目

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

Linux下使用GitLab的runner来自动部署Go项目

继续回到服务器里,使用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。

Linux下使用GitLab的runner来自动部署Go项目

这样,一个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处,点击编辑,进去后就可以修改了。

Linux下使用GitLab的runner来自动部署Go项目

然后修改成在yml文件里配置的就可以了。

Linux下使用GitLab的runner来自动部署Go项目

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的状态了。

Linux下使用GitLab的runner来自动部署Go项目

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

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

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Tommy744 Tommy744
4年前
针对开发人员的21个Jenkins替代方案
当谈到CI/CD工具时,我们都会提到Jenkins。它是构建和测试项目的超级有效工具,从而使持续不断的轻松集成成为可能。但是,Jenkins并不是唯一的CI/CD工具。我们还有其他很多选择!1.GitLab它是一个开源的Web系统,可用于将持续集成,持续部署应用到你的项目中,而无需任何第三方应用程序。它提供了友好的用户界面以及分布式版本控制
Stella981 Stella981
4年前
Rancher2.x流水线自动化部署
1、概述  由于一些项目使用了rancher进行部署发布,所以使用Rancher的流水线自动部署功能实现CICD,从gitlab、harbor安装,到流水线配置和中间的一些问题一一进行详细介绍解答。2、准备工作  前期的Docker和Rancher安装就不在描述,直接进入正题  2.1gitlab安装
Stella981 Stella981
4年前
Jenkins 自动化部署上线
转载于互联网jenkins自动化部署项目,通过jenkins部署来节省运维时间,不需要手动cp上线及版本发布!(https://oscimg.oschina.net/oscnet/fd0711489bde0b14dde0599acc4b202de78.jpg)Jenkins自动化部署上线
Stella981 Stella981
4年前
Git WebHook:用于迅速搭建并使用 WebHook 进行自动化部署和运维系统( Python)
一个使用PythonFlaskSQLAchemyCeleryRedisReact开发的用于迅速搭建并使用WebHook进行自动化部署和运维系统,支持:Github/GitLab/GitOsc。1.技术栈简单,部署容易;2.代码简洁易懂,二次开发毫无压力;3.支持Github/GitLab
Easter79 Easter79
4年前
TurnipBit开发板DIY呼吸的吃豆人教程实例
  转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇)  0x00前言  吃豆人是耳熟能详的可爱形象,如今我们的TurnipBit也集成了这可爱的图形,我们这就让他来呼吸了~。  0x01效果展示  先一起看下最终的成品演示视频:  http:/
Stella981 Stella981
4年前
PHP通过exec执行git pull
目标项目没有使用Jenkins部署,使用的是GitlabECS,要实现代码的自动部署想法使用Gitlab的钩子,当某个分支的代码提交之后,访问一个URL,实现代码的自动部署。这里使用PHP的exec方法,执行“gitpull”操作Tips:这种方法不是百分百靠谱,万一代码冲突就......实现目的:访问h
Stella981 Stella981
4年前
Linux日志安全分析技巧
0x00前言我正在整理一个项目,收集和汇总了一些应急响应案例(不断更新中)。GitHub地址:https://github.com/Bypass007/EmergencyResponseNotes本文主要介绍Linux日志分析的技巧,更多详细信息请访问Github地址,欢迎Star。0x01日志简介Lin
Stella981 Stella981
4年前
C语言Linix服务器网络爬虫项目(一)项目初衷和网络爬虫概述
一、项目初衷和爬虫概述1.项目初衷  本人的大学毕设就是linux上用c写的一个爬虫,现在我想把它完善起来,让他像一个企业级别的项目。为了重复发明轮子来学习轮子的原理,我们不使用第三方框架(这里是说的是指通常的linux系统编程教材以外的库和接口0,当初我也是在虚拟机上跑的ubuntuputtyvim来开发)来实现。  然而我们造轮