Gitlab CI实践-以Node.js应用结合Docker为例

原文地址: https://www.jianshu.com/p/86411a27f02a

想象一下,传统的开发流程中,从开发到部署的流程都要手动操作,如果开发流程包含很多部分或要分布部署,频繁的人为操纵会带来许多弊端,如:

  1. 工作量大(几乎都是重复工作量)
  2. 易遗漏某一环节
  3. 易出错
  4. 不易协同开发
  5. 等等

而使用CI/CD,则开发人员在前期完成相关配置之后,后期只需关注业务开发即可,其他的CI/CD会帮忙实现。Gitlab CI/CD流程如下:

image

1. Gitlab CI/CD 工作原理

  1. push一个commit到Gitlab项目仓库(该项目需要有.gitlab-ci.yml文件)。
  2. Runner会执行Pipelines中的jobs。

相关概念介绍

  • .gitlab-ci.yml: 配置文件,定义需要CI/CD做到工作。
  • Runner: 运行在其他独立机器或虚拟机或Docker中到程序,通过Gitlab CI到coordinator API来进行通行
  • Pipelines: 在配置文件中定义的各stage中执行的jobs

所以,实现Gitlab CI/CD的步骤可以总结为:

  1. 在项目的根目录添加一个.gitlab-ci.yml文件。
  2. 给项目配置一个Runner。

下面介绍.gitlab-ci.yml和Runner的配置

1.1 .gitlab-ci.yml配置说明

Gitlab CI使用的是YAML格式的文件(.gitlab-ci.yml)来作为配置文件,并且要放置在项目的根目录,否则不能识别。

先看一个配置实例:

before_script: # 定义在job执行之前的执行脚本(就一次)
  - echo "hello gitlab ci"

stages: # 定义Pipeline的阶段,可以多个
  - build
  - test
  - deploy

build_job: # 定义一个job
  stage: build # 设置job所属的stage,默认是test
  tags:  # 定义tags,用来匹配相应的Runner来执行
    - my-tag
  script: # 定义后面Runner来执行的具体脚本
    - cd /root/test
    - git pull
    - npm install

test_job:
  stage: test
  tags:
    - my-tag
  script:
    - cd /root/test
    - npm test

deploy_job:
  stage: deploy
  tags:
    - my-tag
  script:
    - cd /root/test
    - npm start &

上述配置中定义了一个before_script,一个stages和三个job,其中,stages中的执行流程是按定义的流程执行的,在该示例中的执行顺序即:build->test->deploy,也就是stage为build的job最先执行,成功之后执行下一个stage的job。如果多个job属于同一个stage,则会并行执行。

.gitignore中的文件在每个job启动时都会被删除,可以使用cache或artifacts来实现文件重用。

1.2 Runner配置说明

在Gitlab CI中,Runners是用来执行配置文件中定义的脚本的,它可以只服务于特定的项目,也可以服务于所有项目(称为Shared Runner)。

最好不要跟Runner与应用部署在同一台服务器上,因为Runner可能会占用很高的内存

Runner分类:

  • Shared Runners:适用相似的项目的执行,job的pick算法为fair usage,可以避免因某个项目堵死而导致整个Runner停滞。
  • Specific Runners:适用于有特定需求的项目,使用FIFO来执行job。
  • Group Runners:给同个Group的项目使用的。

Runner需要注册才能使用。

2. Gitlab CI/CD 实践

2.1 数据准备

Docker镜像准备:

REPOSITORY              TAG         IMAGE ID            CREATED             SIZE
gitlab/gitlab-runner    latest      886bc7da4e1a        8 days ago          371MB
gitlab/gitlab-ce        latest      a6cd10f85c07        3 weeks ago         1.47GB
centos                  latest      e934aafc2206        2 months ago        199MB

其中:

Node.js项目准备:

.
├── README.md
├── index.js # 主文件
├── node_modules
├── package-lock.json
├── package.json
└── test # 测试目录
    └── test.js # 测试文件

其中:

"scripts": {
    "test": "./node_modules/mocha/bin/mocha",
    "start": "node index.js"
  }

2.2 实践

  1. 启动Gitlab
sudo docker run --detach 
    --publish 443:443 --publish 80:80 --publish 22:22 \
    --name gitlab \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

Gitlab启动会比较慢,稍等几分钟在浏览器中输入localhost即可看到要求输入管理员的密码(具体的这里不详细展开),登录后会进入项目管理页面,如下:

gitlab.png

添加一个项目test到仓库,将本地的Node.js项目与该仓库绑定:

kk$ git remote -v
origin  git@127.0.0.1:root/test.git (fetch)
origin  git@127.0.0.1:root/test.git (push)
  1. 注册Gitlab Runner
    启动Gitlab Runner:
docker run -d --name gitlab-runner
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest

进入gitlab-runner镜像中输入gitlab-runner register进行注册:

kk$ docker exec -it gitlab-runner /bin/bash
root@01f8889472f7:/# gitlab-runner register
Running in system-mode.                            
                                                   
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
xxx
Please enter the gitlab-ci token for this runner
xxx
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
ssh
  • 这个token在项目的Settings-CI/CD-General pipelines Settings-Runner token, 完整的可以参考:Registering Runners
  • 这里的executor选的是ssh,所以需要在Node.js应用部署的环境中开启ssh服务,同时也要事先安装下Node.js环境(这个只是针对本例子,也可以在脚本中安装)

注册完之后在项目中的Settings-CI/CD-Runners settings可以看到:

gitlab runner.png

对于centos,需要添加下/etc/hosts

172.17.0.2  gitlab.example.com

具体的ip以实际容器分配ip为准。

  1. 验证结果

现在push一个commit到gitlab上,可以类似如下的结果:


pipeline.png

这样就完成了Gitlab CI的集成.

Reference

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

推荐阅读更多精彩内容