DevOps之GitLab CI/CD

DevOps是Development和Operations的组合,是一种方法论,是一组过程、方法与系统的统称,用于促进应用开发、应用运维和质量保障(QA)部门之间的沟通、协作与整合。以期打破传统开发和运营之间的壁垒和鸿沟。Git更是现在日常开发必不可少的​代码管理工具。本文主要介绍使用GitLab 来做项目CI/CD​。

Gitlab CI/CD 简介

传统的 CI/CD:搭建一个 Jenkins,在 Jenkins 配置好基本的环境,如 Java, Maven, Git 等等,接着开始配置任务,项目 A 的代码在哪里?怎么 Build?项目 B 的代码在哪里?怎么 Build?触发周期是多少?细节挺多的,通常需要专门的管理员去维护这个 Jenkins。

Travis CI/CD 颠覆了这种模式,在 Travis CI 的模式中,开发在源码根目录下放置 CI 的配置(通常是一个 yml 文件,描述了基本的 build 命令),Travis 会解析这个文件然后执行具体的 CI 任务。

GitLab CI/CD 实际上就是照搬了 Travis CI 的模式,它只需要开发者在自己需要 CI 的代码库中放一个 .gitlab-ci.yml 文件即可完成自己的CI任务配置

使用Gitlab CI/CD 的好处

代码提交到 GitLab 了,git push 之后直接触发 CI/CD。

使用 Gitlab CI/CD

GitLab CI/CD 运行示意图如下所示:

  1. 编写GitLab CI/CD 配置文件.gitlab-ci.yml。 代码开放完之后push 到GitLab服务器
  2. GitLab 会检测到代码变动,根据.gitlab-ci.yml的配置分发任务到GitLab Runner 来执行CI/CD任务
Gitlab CI/CD 示意图.png

下面分别简单介绍.gitlab-ci.yml 编写,以及GitLab Runner安装与运行

GitLab CI/CD Pipeline Configuration: .gitlab-ci.yml

.gitlab-ci.yml主要描述了CI/CD任务的执行顺序,主要包括以下两个方面:

  1. 使用GitLab Runner执行什么?
  2. 条件分支控制,如:当某个流程失败或成功时应该干啥

.gitlab-ci.yml 概览

一个 .gitlab-ci.yml 主要由default、variables、stages、 jobs 构成,示例如下:

default:
  image: ruby:2.5

variables:
  DATABASE_URL: "postgres://postgres@postgres/my_database"

stages:
  - build
  - test 
  - deploy

build_job:
  stage: build
  script: "execute-script-for-build_job"
  only:
    - develop
    - master

test_job:
  stage: test
  script: "execute-script-for-test_job"
  only:
    - develop
    - master

deploy_job:
  stage: deploy
  script: "execute-script-for-deploy_job"
  only:
    - master

Jobs

GitLab CI/CD任务由一个或多个Job构成。job 定义如下所示:

job1:
  script: "execute-script-for-job1"

job2:
  script: "execute-script-for-job2"

其中,job1、job2为job 名称,可以自定义,但必须保证唯一,且不能为保留关键字:default 、image、services、stages、types、before_script、after_script、variables、cache、include

default: 设置job 的全局参数

default 可设置的全局参数包括:

设置的全局参数可以被job 内的参数覆盖,示例如下:

default:
  image: ruby:2.5

# use default
rspec:
  script: bundle exec rspec

# use specified image ruby:2.6
rspec 2.6:
  image: ruby:2.6
  script: bundle exec rspec

services

用来指定job 依赖的service docker image

before_script 和 after_script

before_script 用来描述每个job 执行之前需要做的工作。
after_script 用来描述每个job执行完成之后需要做的工作。
before_script 和 after_script 都可以在job 参数里面进行重写。

default:
  before_script:
    - global before script

job:
  before_script:
    - execute this instead of global before script
  script:
    - my command
  after_script:
    - execute this after my script

stages

stages 是全局的, 用来描述由哪些stage(在job中引用)。stages 中元素的顺序指定了job的执行顺序, 如下所示。

stages:
  - build # all jobs of build are executed in parallel.
  - test # If all jobs of build succeed, the test jobs are executed in parallel.
  - deploy # all jobs of test succeed, the deploy jobs are executed in parallel.
# if all jobs of deploy succeed, the commit is marked as passed.
# If any of the previous jobs fails, the commit is marked as failed and no jobs of further stage are executed.

另外,需要注意以下两点:

  1. .gitlab-ci.yml中如果没有定义stages, 则在job中可以使用默认的 build、test 和 deploy stage
  2. 如果job 中没有指定stage,则默认使用test stage

only/except

only 指定job只在特定的branch 上执行,支持正则表达式。
except 指定job在指定branch之外的分支上执行,支持正则表达式。

job:
  # use regexp
  only:
    - /^issue-.*$/
  # use special keyword
  except:
    - branches

.gitlab-ci.yml 详细配置可以见 https://docs.gitlab.com/ce/ci/yaml/README.html

Gitlab Runner

GitLab Runner 是使用Go 编写的一个开源项目,主要用来执行GitLab CI/CD 任务并且返回结果至GitLab。

GitLab Runner 可以运行在物理机、Docker容器、以及Kubernets集群中。 下面主要介绍下使用binary在物理机(CentOS Linux)上安装的方法和使用Docker Image安装的方法。更多安装方法见:https://docs.gitlab.com/runner/install/

使用binary在物理机(CentOS Linux)上安装GitLab Runner
# 下载rpm 包
curl -LJO https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_amd64.rpm

# 安装
rpm -i gitlab-runner_amd64.rpm

# 注册至GitLab
# 使用Docker 来运行Integration-test: https://docs.gitlab.com/ce/ci/docker/using_docker_images.html
# The registered runner will use the ruby:2.1 docker image and will run two services, postgres:latest and mysql:latest, both of which will be accessible during the build process.
sudo gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.com/" \
  --registration-token "PROJECT_REGISTRATION_TOKEN" \
  --description "docker-ruby-2.1" \
  --executor "docker" \
  --docker-image ruby:2.1 \
  --docker-services postgres:latest  \
  --docker-services mysql:latest \
  --tag-list "docker,ruby2.1" 
使用Docker Image安装GitLab Runner
# 安装Docker
curl -sSL https://get.docker.com/ | sh

# 运行gitlab-runner 容器
docker run -d --name gitlab-runner --restart always \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest

# 注册runner
docker run --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \
  --non-interactive \
  --executor "docker" \
  --docker-image alpine:latest \
  --url "https://gitlab.com/" \
  --registration-token "PROJECT_REGISTRATION_TOKEN" \
  --description "docker-runner" \
  --tag-list "docker,aws" \
  --run-untagged="true" \
  --locked="false" \
  --access-level="not_protected"

查看Gitlab Runner

在每个 GitLab Project 的 Settings -> Runners 可以看到Runners 信息

runner.png

使用Gitlab CI/CD

只需要在自己需要 CI 的代码库中放一个 .gitlab-ci.yml 文件,push 之后就会自动触发GitLab CI/CD

更多干货,欢迎关注个人博客:http://mochi.website/

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

推荐阅读更多精彩内容

  • 这是阿里内网的一篇文章,感有用,故转载来了,自己实际搭建了,故记录一下: 背景在日常工作中,我们往往会搭建基于je...
    新强吖阅读 5,885评论 0 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,112评论 18 139
  • GitLab Continuous Integration(CI) If you add a .gitlab-ci...
    xiaojianxu阅读 1,431评论 0 0
  • 本文以Gitlab来讲解Git使用以及持续集成, 持续集成采用的是Gitlab CI. 其他代码托管网站,如Git...
    x1596357阅读 5,344评论 0 6
  • 我们毕设组的项目是冰箱智能小助手,但是没能过第一轮的BP,周末也开会反思了下,正好也在学习需求这一章,关于初心和产...
    就是要开心阅读 565评论 1 0