概述

1. CI/CD

CI(持续集成)指开发人员一天内进行多次合并和提交代码操作,并通过自动化测试,完成构建

CD(持续部署)指每次代码更改都会自动部署到对应环境

CI/CD 结合在一起,可以加快开发团队交付成果的效率,减少时间成本

2. Gitlab-CI/CD

gitlab-ci 是 gitlab8.0 之后自带的一个持续集成系统,中心思想是每一次 push 到 gitlab 就会触发一次脚本执行,脚本内容包括测试、编译、部署等一系列内容

gitlab-ci 的脚本需要 gitlab-runner 来执行,代码 push 之后,webhook 检查到代码变化,就会触发 gitlab-ci,分配到各个 Runner 来运行相应的脚本

gitlab-ce

1. 安装 gitlab-ce

gitlab 有 ce 和 ee 两个版本,ce 是社区版,开源免费,ee 是企业版,需要付费

下面以 Ubuntu18.04.6 为例,安装 gitlab-ce

安装依赖软件

sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates tzdata perl

添加 gitlab 软件源镜像

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

安装 gitlab-ce

sudo apt-get install gitlab-ce

如果命令行能看到 Gitlab 的 Logo 打印,就说明安装成功了

打开 gitlab 配置文件

vim /etc/gitlab/gitlab.rb

为了能在浏览器访问 gitlab,还需要配置 gitlab 的访问地址和端口

# ip:port 改成自己的,也可以用域名
external_url 'http://192.168.66.100:82'

重载配置并重启

gitlab-ctl recofigure
gitlab-ctl restart

在浏览器输入 http://192.168.66.100:82 即可访问 gitlab,当然了,前提是你的端口要放开

初始用户名为 root,初始密码记录在 /etc/gitlab/initial_root_password 文件,密码有效期为 24 小时,建议登录后尽快修改密码

登录以后,就可以创建项目了,其余的基本的 git 操作这里就不赘述了

2. 其他问题

gitlab-ctl recofigure 过程,有可能出现卡在 ruby_block[wait for logrotate service socket] action run 的情况,解决办法如下:

  • ctrl + c 强行结束

  • 运行 systemctl restart gitlab-runsvdir

  • 再次运行 gitlab-ctl recofigure

安装结束以后,访问 web 端报 502,最可能的原因是端口被占用了,需要修改端口

vim /etc/gitlab/gitlab.rb
# 修改为没有被使用的端口即可
puma['port'] = 9091

gitlab-runner

1. 安装 gitlab-runner

下面以 Ubuntu18.04.6 为例,安装 gitlab-runner

添加 gitlab 软件源镜像

curl https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash

安装 gitlab-runner

sudo apt-get install gitlab-runner

2. gitlab-runner 注册

首先获取 gitlab-ci 的 token:项目主页->Setting->CI/CD->Runners Expand

使用命令注册 gitlab-runner

gitlab-runner register

按照步骤输入:

  1. GitLab instance URL:如上图所示 URL
  2. registration token:如上图所示 Token
  3. description:关于该 Runner 的描述
  4. tags:用于标记该 Runner,后续需要使用这个 tag 来指定 gitlab-runner
  5. optional maintenance note:没搞懂有啥用,随意写
  6. Enter an executor:选择执行器,gitlab-runner 提供了许多执行器,可用在不同场景中运行构建,这里选择 shell

完成以后,刷新页面,即可在 Runners Expand 看到新增了一个 Runner

3. 简单示例

下面我们简单测试一下 Runner 是否能正常运行,随意新建一个 SpringBoot 项目

在根目录下创建一个 .gitlab-ci.yml 文件,这里只是简单输出一段语句

stages:
- deploy deploy-job:
tags:
- prod
stage: deploy
script:
- echo "hello world!!!"

push 到 gitlab 后,会发现脚本已经自动执行了,绿勾代表执行成功

点击绿勾,在下方 Pipeline 点击 deploy-job 可以查看执行过程

pipeline 语法

1. job & script

.gitlab-ci.yml 文件中可以定义一个或多个作业(job),每个作业独立执行,必须有唯一的名称(不能使用关键字)以及包含一个 script,这里定义了三个作业 build、test、deploy,script 可以是 shell 命令

build:
script:
- echo "build"
test:
script:
- echo "test"
deploy:
script:
- echo "deploy"
- echo "finish"

2. before_script & after_script

before_script 用于定义一个命令,在每个作业运行之前运行,before_script 失败将导致整个作业失败,其他作业不再执行,如果在作业中定义了 before_script,则该作业不会运行全局的 before_script

after_script 用于定义一个命令,在每个作业运行之后运行,作业失败不影响 after_script 的运行,如果在作业中定义了 after_script,则该作业不会运行全局的 after_script

before_script:
- echo "before script"
build:
before_script:
- echo "before script in buildjob"
script:
- echo "build"
after_script:
- echo "before script in buildjob"
test:
script:
- echo "test"
deploy:
script:
- echo "deploy"
- echo "finish" after_script:
- echo "after script"

3. stages & stage

用于定义作业可以使用的阶段,并且是全局定义的,同一阶段的作业并行运行,不同阶段按顺序执行

before_script:
- echo "before script" stages:
- build
- test
- deploy build:
before_script:
- echo "before script in buildjob"
stage: build
script:
- echo "build"
after_script:
- echo "before script in buildjob"
test:
stage: test
script:
- echo "test" deploy:
stage: deploy
script:
- echo "deploy"
- sleep 5 after_script:
- echo "after script"

4. .pre & .post

.pre 始终是整个 pipeline 的第一个运行阶段,.post 始终是整个 pipeline 的最后一个运行阶段,无法修改,用户自定义的 stage 则在这两者之间,如果一个 pipeline 仅包含 .pre 和 .post,则不会创建 pipeline

before_script:
- echo "before script" stages:
- build
- test
- deploy codescan:
stage: .pre
script:
- echo "codescan" build:
before_script:
- echo "before script in buildjob"
stage: build
script:
- echo "build"
after_script:
- echo "before script in buildjob"
test:
stage: test
script:
- echo "test" deploy:
stage: deploy
script:
- echo "deploy"
- sleep 5 after_script:
- echo "after script"

5. variables

定义变量,可以定义 pipeline 变量、job 变量,job 变量优先级最高

before_script:
- echo "before script" variables:
DOMAIN: example.com stages:
- build
- test
- deploy codescan:
stage: .pre
script:
- echo "codescan" build:
before_script:
- echo "before script in buildjob"
stage: build
script:
- echo "build"
- echo "$DOMAIN"
after_script:
- echo "before script in buildjob"
test:
stage: test
script:
- echo "test" deploy:
stage: deploy
script:
- echo "deploy"
- sleep 5 after_script:
- echo "after script"

6. tags

用于指定特定的 job 在特定的 runner 运行,如果 job 不指定 tags,则默认在共享的 runner 运行

windows_job:
stages:
- build
tags:
-windows
script:
- echo "windows job" linux_job:
stages:
- build
tags:
-linux
script:
- echo "linux job"

7. allow_failure

allow_failure 表示是否允许作业失败,默认值 false 不允许失败,改为 true 后,如果该作业失败也不会被阻塞

job1:
stage: test
script:
- "..."
allow_failure: true

8. when

when 用于控制作业运行:

  • on_success:前面阶段的所有作业成功才执行该作业,默认 on_success
  • on_failure:前面阶段出现失败时执行
  • always:总是执行作业
  • manual:手动执行作业
  • delayed:延迟执行作业
job1:
stage: test
script:
- "..."
when: delayed # 表示延迟30s执行
start_in: "30"

9. retry

配置作业失败后重试作业的次数

job1:
stage: test
script:
- "..."
retry: 2

也可以精确匹配到某一错误,即出现某一错误时才重试

job1:
stage: test
script:
- "..."
retry:
max: 2
when:
- script_failure # 脚本失败时重试

10. timeout

作业级别的超时可以超过项目级别的超时,但不能超过 Runner 特定的超时

job1:
stage: test
script:
- "..."
timeout: 3h

11. parallel

配置要并行运行的作业的实例数,此值必须大于等于 2 并小于等于 50,这将创建 N 个并行运行的同一作业实例

job1:
stage: test
script:
- "..."
parallel: 5

12. rules

rules 允许按顺序评估单个规则,直到匹配为止:

  • if:如果条件匹配,多条件匹配可以使用 && ||

    variables:
    DOMAIN: example.com job1:
    stage: test
    script:
    - "..."
    rules: # DOMAIN值匹配,则手动运行,否则
    - if: '$DOMAIN == "example.com"'
    when: manual
    - if: '$DOMAIN == "example2.com"'
    when: delayed
    start_in: '5'
    - when: on_success
  • changes:指定文件发生变化

    job1:
    stage: test
    script:
    - "..."
    rules:
    - changes:
    - fimeName # 文件名
    when: manual
    - when: on_success
  • exists:指定文件存在

    job1:
    stage: test
    script:
    - "..."
    rules:
    - exists:
    - fimeName # 文件名
    when: manual
    - when: on_success

13. workflow-rules

workfolw 关键字适用于整个管道,并确定是否创建管道

variables:
DOMAIN: example.com workflow:
rules:
- if: '$DOMAIN == "example.com"'
when: always # 默认always,可以设置never
- when: never

14. cache

存储编译项目时所需的运行时依赖项,指定项目工作空间中需要在 job 之间缓存的文件或目录

全局 cache 定义在 job 之外,针对所有 job 生效,job 中的 cache 优于全局

cache:
paths: # 在全局定义缓存
- my/files job:
script: "..."
cache:
key: job # 为缓存设置唯一key,会为该job分配一个独立的cache
paths: # 在job中定义缓存,缓存target目录下的所有.jar文件,该缓存将覆盖全局缓存
- target/*.jar
# policy: pull # pull:不下载缓存,push不上传缓存,默认会在job执行之前下载缓存,并在结束之后上传缓存

15. artifacts

用于指定作业成功或失败时应附加到作业的文件或目录的列表,可在 Gitlab UI 中下载

build:
script:
- mvn package
artifacts:
name: "$ARTIFACTS_NAME" # 指定所创建的制品名称,默认为artifacts,下载为artifacts.zip
paths:
- target/*.jar
when: always # 制品创建条件,on_success:作业成功时创造制品,on_failure:作业失败时创建制品,always:总是创建制品
expire_in: 1 week # 制品有效期,从存储到gitlab开始算起,默认30天

16. dependencies

获取当前阶段之前的制品

build:
stage: build
script:
- mvn package
artifacts:
name "$ARTIFACTS_NAME"
paths:
- target/*.jar deploy:
dependencies:
- build
stage: deploy
script:
- ... # 部署制品

17. needs

可以让作业无需按照阶段顺序运行,下述的例子表示:deploy-a 在 build-a 完成之后就可以执行,deploy-b 在 build-b 完成之后就可以执行

stages:
- build
- deploy build-a:
stage: build
script:
- ... build-b:
stage: build
script:
- ... deploy-a:
stage: deploy
script:
- ...
needs: ["build-a"] deploy-b:
stage: deploy
script:
- ...
needs: ["build-b"]

18. include

可以引入外部 yaml 文件,使用合并功能可以自定义和覆盖本地定义的 CI/CD 配置

local

引入同一存储库的文件,使用相对于根目录的完整路径进行引用,必须保证走到同一分支

假设有 ci/localci.yml 文件

stages:
- deploy deploy-job:
stage: deploy
script: ...

在 .gitlab-ci.yml 引入 ci/localci.yml 文件,如果存在相同名称的作业,它们的配置会进行合并,并且原文件 .gitlab-ci.yml 的配置优先生效

include:
local: "ci/localci.yaml" stages:
- build
- test
- deploy build-job:
stage: build
script: ... test-job:
stage: test
script: ...

file

引入其他项目的 yaml 配置

include:
project: demo/demo-java-service
ref: master
file: .gitlab-ci.yml

template

引入官方提供的模板,可以访问 https://gitlab.com/gitlab-org/gitlab/tree/master/lib/gitlab/ci/templates 查看有哪些模板

include:
template: Auto-DevOps.gitlab-ci.yml

remote

引入远程文件

include:
remote: "https://gitlab.com/awesome-project/raw/master/.gitlab-ci-template.yml"

19. extends

继承作业配置,相同配置覆盖,不同则继承

.tests:
script: mvn test
stage: test
only:
refs:
- tags test-job:
extends: .tests
script: mvn clean test
only:
variables:
- $RSPEC

最终得到的作业配置如下

test-job:
stage: test
script: mvn clean test
only:
variables:
- $RSPEC
refs:
- tags

20. trigger

当 gitlab 从 trigger 定义创建的作业启动时,将创建一个下游管道,允许创建多项目管道和子管道:

  • 多项目管道:跨多个项目设置流水线,以便一个项目的管道可以触发另一个项目的管道

    stagging:
    variables:
    ENVIROMENT: stagging # 该变量会传递给下游管道,如果上下游定义了相同名称的变量,上游变量将优先
    stage: deploy
    trigger:
    project: demo/demo-java-service # 指定下游项目的完整路径
    branch: master # 指定项目的分支名称
    strategy: depend # 将自身状态从触发的管道合并到源作业
  • 父子管道:同一项目的管道可以触发一组同时运行的子管道

    子管道 ci/child.yml

    stages:
    - build child-build-job:
    stage: build
    script: ...

    父管道

    stages:
    - deploy stagging:
    stage: deploy
    trigger:
    include: ci/child.yml
    strategy: depend21

21. image

首先注册一个工作类型为 docker 的 runner,只要使用该类型的 runner,所有运行操作都会在容器中运行

gitlab-runner register \
--non-interactive \
--executor "docker" \
--docker-image alpine:latest \ # 默认使用该镜像
--url "http://192.168.1.200:30088/" \
--registration-token "JRzzw2j1Ji6aBjwvkxAv" \
--description "docker-runner" \
--tag-list "docker" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected"

默认注册 runner 会指定一个基础镜像,如果全局指定 image 则所有作业使用该镜像创建容器并运行,如果全局未指定 image,则查看 job 中是否有指定,有则按照 job 指定的镜像创建容器并运行,否则使用默认镜像

image: maven:3.6.3-jdk-8	# 全局定义

...

deploy-job:
stage: deploy
tags:
- docker
script: ...
image: maven:3.6.3-jdk-8 # 局部定义

22. services

工作期间运行的另一个 Docker 服务镜像,将其 link 到 image 定义的 Docker 镜像,这样可以在构建期间访问该服务镜像

...

services:
- name: mysql:latest
alias: mysql build-job:
stage: build
tags:
- docker
script: ...
image: maven:3.6.3-jdk-8 # 局部定义

23. environment

可用于在 gitlab ui 追踪作业运行情况,

deploy-job:
stage: deploy
tags:
- docker
script: ...
environment:
name: production # 应用名称
url: http://www.baidu.com # 应用地址

GitLab CI-CD 学习笔记的更多相关文章

  1. GitLab CI/CD的官译【原】

    CI / CD方法简介 软件开发的持续集成基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性.从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预. 它涉及在每次小迭代中不断 ...

  2. 实践分享!GitLab CI/CD 快速入门

    用过 GitLab 的同学肯定也对 GitLab CI/CD 不陌生,GitLab CI/CD 是一个内置在 GitLab 中的工具,它可以帮助我们在每次代码推送时运行一系列脚本来构建.测试和验证代码 ...

  3. [转]GitLab Continuous Integration (GitLab CI/CD)

    本文转自:https://docs.gitlab.com/ee/ci/README.html GitLab Continuous Integration (GitLab CI/CD) The bene ...

  4. 使用 Gitlab CI/CD 实现自动化发布站点到 IIS

    说明 这里先介绍下两个东西 CI/CD.GitLab Runner,当然在此之前你需要对 git 有所了解,关于 git 这里不做说明,可以自行百度. 首先介绍 CI/CD :随着我们开发方式的转变, ...

  5. 前端初探 Gitlab CI/CD

    前言 纵观人类历史的发展以及三次工业革命,你会发现利用机器来替代部分人力劳动,将重复的工作自动化从而解放生产力都是发展的必然趋势,在软件工程领域也不例外,其中 CI/CD 就是其中一项,那么什么是 C ...

  6. .Net Core自动化部署系列(三):使用GitLab CI/CD 自动部署Api到Docker

    之前写过使用Jenkins实现自动化部署,最近正好没事研究了下GitLab的自动化部署,顺便记录一下. 使用GitLab部署我们需要准备两件事,第一个起码你得有个GitLab,自己搭建或者使用官方的都 ...

  7. GitLab CI/CD持续集成设置

    GitLab CI/CD持续设置 官方文档地址(https://docs.gitlab.com/ee/ci/README.html) GitLab CI.CD功能非常完善,只需要简单几步,就可以完成项 ...

  8. Gitlab CI/CD

    Gitlab CI/CD 前言 纵观人类历史的发展以及三次工业革命,你会发现利用机器来替代部分人力劳动,将重复的工作自动化从而解放生产力都是发展的必然趋势,在软件工程领域也不例外,其中 CI/CD 就 ...

  9. .NetCore 配合 Gitlab CI&CD 实践 - 开篇

    引言 这是一个系列的文章,讲述的是一个中小型开发团队如何从零开始使用搭建基建 GitLab 代码托管平台,以及使用 GitLab Runner 实现 CI/CD 的故事.本系列通过部署一个完整的 .n ...

  10. .NetCore 配合 Gitlab CI&CD 实践 - 单体项目

    前言 上一篇博文 .NetCore 配合 Gitlab CI&CD 实践 - 开篇,主要简单的介绍了一下 GitLab CI 的持续集成以及持续部署,这篇将通过 GitLab CI 发布一个 ...

随机推荐

  1. ClickHouse(10)ClickHouse合并树MergeTree家族表引擎之ReplacingMergeTree详细解析

    目录 建表语法 数据处理策略 资料分享 参考文章 MergeTree拥有主键,但是它的主键却没有唯一键的约束.这意味着即便多行数据的主键相同,它们还是能够被正常写入.在某些使用场合,用户并不希望数据表 ...

  2. 带你了解S12直播中的“黑科技”

    摘要:让精彩更流畅.让较量更清晰.让参与更沉浸.让体验更有趣,幕后的舞台,从来都是技术的战场,S12背后的名场面同样场场高能. 本文分享自华为云社区<用硬核方式打开S12名场面>,作者:华 ...

  3. 5种GaussDB ETCD服务异常实例分析处理

    摘要:一文带你细数几种ETCD服务异常实例状态. 本文分享自华为云社区<[实例状态]GaussDB ETCD服务异常>,作者:酷哥 . 首先确认是否是虚拟机.网络故障 虚拟机故障导致ETC ...

  4. PHP 正在“杀死”Python

    最近,我突然发现自己好像又在逆潮流而动.可能我的想法与很多朋友不同,我认为 PHP 这个编程语言界的"混蛋"比以往任何时候都更受欢迎. 或许你会质疑--PHP 不是已经完蛋了吗?市 ...

  5. toB应用私有化交付发展历程、技术对比和选型

    由于数据隐私和网络安全的考虑,大多数toB场景的客户需要私有化应用交付,也就是需要交付到客户的环境里,这样的客户有政府.金融.军工.公安.大型企业.特色行业等,这些私有化场景限制很多,如何提高私有化应 ...

  6. 包管理器pacman常用方法

    详见[pacman(简体中文) - ArchWiki]:https://wiki.archlinux.org/title/Pacman_(简体中文) 更新系统: pacman -Syu 对整个系统进行 ...

  7. 学生管理系统Python

    student1=[ {1:'lucy','age':17,'sex':'n','Pnum':1111111}, {2:'tom','age':17,'sex':'m','Pnum':2222222} ...

  8. 医疗在线OLAP场景下基于Apache Hudi 模式演变的改造与应用

    背景 在 Apache Hudi支持完整的Schema演变的方案中(https://mp.weixin.qq.com/s/rSW864o2YEbHw6oQ4Lsq0Q), 读取方面,只完成了SQL o ...

  9. MySQL 性能压测工具-sysbench,从入门到自定义测试项

    sysbench是一个开源的.基于LuaJIT(LuaJIT 是 Lua 的即时编译器,可将代码直接翻译成机器码,性能比原生 lua 要高) 的.可自定义脚本的多线程基准测试工具,也是目前用得最多的 ...

  10. 天坑,这样一个lambda随机取数据也有Bug

    前几天,一位网友跟我说他编写的一段很简单的代码遇到了奇怪的Bug,他要达到的效果是从一个List中随机取出来一条数据,代码如下: 1 var random = new Random(); 2 var ...