使用 Gitlib CI 进行项目自动部署

一、背景

最近接手一个 golang 的项目,存储于 gitlab 上,此次的项目想要使用 Gitlab 自带的 CI 持续集成工具进行自动编译打包部署,之前从未接触过此类东西,故在网上苦苦寻觅,浏览了无数资料,踩了无数的坑,东西虽然不多,但是网上资料没有较为全面的解释,导致过程中很多都会踩坑,现将主要过程以及一些坑整理分享出来,方便即将入坑的朋友。

参考文献:

二、相关解释

1. Gitlab

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

2. Gitlab-CI

Gitlab-CI是GitLab Continuous Integration(Gitlab持续集成)的简称。
从Gitlab的8.0版本开始,gitlab就全面集成了Gitlab-CI,并且对所有项目默认开启。
只要在项目仓库的根目录添加.gitlab-ci.yml文件,并且配置了Runner(运行器),那么每一次合并请求(MR)或者push都会触发CI pipeline

3. Gitlab-runner

Gitlab-runner 是 .gitlab-ci.yml 脚本的运行器,Gitlab-runner 是基于 Gitlab-CI 的 API 进行构建的相互隔离的机器(或虚拟机)。GitLab Runner 不需要和 Gitlab 安装在同一台机器上,但是考虑到 GitLab Runner 的资源消耗问题和安全问题,也不建议这两者安装在同一台机器上。
Gitlab Runner 分为两种,Shared runners 和 Specific runners。
Specific runners 只能被指定的项目使用,Shared runners 则可以运行所有开启 Allow shared runners 选项的项目。

4. Pipelines

Pipelines 是定义于 .gitlab-ci.yml 中的不同阶段的不同任务。
我把Pipelines 理解为流水线,流水线包含有多个阶段(stages),每个阶段包含有一个或多个工序(jobs),比如先购料、组装、测试、包装再上线销售,每一次push或者MR都要经过流水线之后才可以合格出厂。而 .gitlab-ci.yml 正是定义了这条流水线有哪些阶段,每个阶段要做什么事。

5. Badges

徽章,当 Pipelines 执行完成,会生成徽章,你可以将这些徽章加入到你的 README.md 文件或者你的网站。

三、安装 Gitlab-runner 并使用

1. Gitlab-runner 安装

为简化操作这里我们直接使用 清华大学开源软件镜像站 的资源来进行安装,先选择下载到对应版本的 rpm 安装包并执行安装

wget "https://mirrors.tuna.tsinghua.edu.cn/gitlab-runner/yum/el7/gitlab-runner-11.1.0-1.x86_64.rpm"
rpm -ivh gitlab-runner-11.1.0-1.x86_64.rpm

由于 gitlab 版本关系,需安装对应的 gitlab-runner 版本,版本不支持可能导致网络不通、通讯失败等一堆问题
注意:gitlab-runner 分为 gitlab-ci-multi-runner 以及 gitlab-runner 两个发行库, gitlab-ci-multi-runner 目前已停止维护,最后的版本为9.5.0,改为 gitlab-runner 继续更新,现网上大部分教程都是使用 gitlab-ci-multi-runner 请注意区分。
使用参考: gitlab 11.0.5 gitlab-runner 11.0

2. runner 注册

先进入 gitlab 对应项目 ->设置 -> CI/CD -> Runners 设置, 看见如下图红框所示内容

TIM图片20181017193548.png

然后我们使用 gitlab-runner register 来进行 runner 注册

gitlab-runner register

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/)
**此处输入你的 gitlab  url,上图红圈标识处可复制**
Please enter the gitlab-ci token for this runner
**此处输入你的 gitlab runner token, 上图红圈标识处可复制**
Please enter the gitlab-ci description for this runner
**描述**
Please enter the gitlab-ci tags for this runner (comma separated):
**tag, 用于.gitlab-ci.yml 中选择 执行 runner,既此处如输入 golang-runner yml文件中的tag需对应 **
Registering runner... succeeded                     runner=YFgkkzzx
Please enter the executor: shell, ssh, docker-ssh+machine, kubernetes, docker-ssh, parallels, docker+machine, docker, virtualbox:
**选择运行模式,这里我们选择 shell**
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

这里的 shell 是 指脚本直接执行的是本机的资源,还有其余形式 例如 docker, ssh 等, docker 可以指定脚本将程序打包为一个 docker 镜像并运行。

注册完使用 gitlab-runner start 来启动
gitlab-runner run 也可以使用,但这个是类似监听模式,不能关命令行
gitlab-runner status 可查看 runner 运行状态

启动之后可前往 gitlab 对应项目-> 设置 -> CI/CD -> Runners 设置


TIM图片20181017202239.png

如上图所示 查看 runner 是否成功运行, 图中第一个为通讯失败,必须为图2所示的绿色原点状态才为成功,如不成功请检查网络、runner 版本等情况

3. Git 部署设置

进入 gitlab 对应项目-> 设置 -> 仓库 -> 部署密钥, 看见如下图红框所示位置

TIM图片20181017200658.png

添加当前机器生成的 id_rsa.pub 公钥 (请不要在 Gitlab 账号设置处配置)
此处设置完后续的 .gitlab-ci.yml 脚本执行时会直接 pull 代码

4. .gitlab-ci.yml 文件配置

更多的 .gitlab-ci.yml 配置规则 详见

stages:
  - test
  - build
before_script:
  - PROJECT_NAME=rpc-comment.myzaker.com
  - DEPLOY_PATH=$GOPATH/src/$PROJECT_NAME
  - echo "copy file to $DEPLOY_PATH"
  - mkdir -p $DEPLOY_PATH
  - cp -R * $DEPLOY_PATH/
  - cd $DEPLOY_PATH
test:
    stage: test
    script:
      - go test
    only:
      - master
    tags:
      - golang-runner
build:
    stage: build
    script:
      - go build
      - go install
    only:
      - master
    tags:
      - golang-runner

上述 .gitlab-ci.yml 文件实现了 [复制最新代码至指定目录] -> [进入程序目录] -> [执行 go test 进行代码测试] -> [执行 go build 编译代码] -> [执行 go install 将二进制可执行文件打包至 $GOPATH/bin 中]

由于设置了 Gitlab 的部署密钥,此处执行脚本时会自动将仓库代码 pull 到当前目录,我们不需要主动去 pull 代码,只需将当前目录下所有文件 cp 到你的项目目录下即可

5. 运行 runner

上一步 .gitlab-ci.yml 指定了 only: - master 表示仅 master 分支代码发生变更时才触发 stage
我们尝试将代码合并到 master 分支 并观察 对应项目 -> CI/CD -> 流水线

TIM图片20181017201728.png

如上图所示 显示已通过既整个流程配置完成!如出现错误可点击进入查看错误详情,根据报错进行调整。
此时成功就可以前往服务器查看代码是否成功部署啦!

由于 gitlab-runner 非采用 root 用户 执行命令 也无法是用 sudo 等,故需要将 第三方程序命令设置到系统环境变量中如下:

vim /etc/profile

export PATH=/usr/local/go/bin:$PATH
export export GOPATH=/go

source /etc/profile

如遇权限问题请手动给予对应目录赋权 chmod 755 xxx

祝各位顺利安装!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • vim的插件配置 一般用户可能只会在~/.vimrc中配置, 本人操作系统为ubuntu, 而我不一般呐,我是ro...
    11的雾阅读 1,289评论 2 0
  • 中午下班回来,单薪达坐在课桌上写着练字,从单位给带的鸡米花,写完后,擦完桌子准备吃饭,午饭后自己喝了点水,录完视频...
    单鹏_7f01阅读 113评论 0 0
  • 我最幸运的事儿,大概就是遇到了你们,真的很开心,很幸福。我想大概在这个社会再不会遇到这么美好的,单纯的感情了...
    ywy521阅读 169评论 0 0
  • 走到生命的哪一个阶段,都该喜欢那一段时光,完成那一阶段该完成的职责,顺生而行,不沉迷过去,不狂热地期待着未来,生命...
    笃学青衿阅读 239评论 0 0
  • 文/雪诺 微信公众号:迷茫人生路 【第一:折腾;第二:死命的折腾。】 当你今天喜欢的东西正好就是...
    Snow凤阅读 218评论 0 0