前端gitlab-ci.yml 入门

说起来使用gitlab也有大半年了,每天都在跑pipeline,但是却没有好好研究过这个叫gitlab-ci.yml的文件。这次借着发布流程升级的机会,好好入门了一下。
主要分以下内容:

  • stages
  • cache
  • only
  • when
  • before_script,script, after_script
  • artifacts
  • hidden_job && extends
  • reserved keywords - include
  • tags

stages:

stages 是用来定义一个 pipeline 的,一个 pipeline 就像一个流水线,由一系列 stage 来构成。拿一个著名的故事来说,把大象装进冰箱是一个pipeline,那么打开冰箱门,把大象装进去,把冰箱🚪关上就是3个stage。再比如在发布(publish)之前要做 lint,test,build,那么这四个 stage 就构成一个pipeline,写成下面的样子:

stages
  - lint
  - test
  - build
  - publish

然后你在gitlab的pipeline下面就能看到下面的图:

上面我们虽然定义了一个pipeline,和4个 stage 名称,但是具体每个 stage 做什么还是不清楚的,stage具体要做什么是由 job 定义的。 接下来我们学习怎么定义一个job。

job

以上面的 lint 为例,我们需要执行npm run lint命令来查看有没有lint错误,那么这个job可以写成:

job-lint:
  stage: lint
  script: npm run lint

这里job-lint是任务名称,script是要在终端执行的命令,stage 表示这个 job 属于哪个 stage(pipeline的某个节点)。关于 job 名称这里要注意一点是,不能使用保留字。比如:不能把一个 job 的名字称为 stages 或者 image,就像变量名不能用if一样。相关文档可以看这里

一个 stage 下可以有多个 job,一个 job 可以进行多个 scripts。比如:打包的时候要打包到windows,mac,linux下,可以这样:

job-build-mac:
  stage: build
job-build-win;
  stage: build
job-build-linux:
  stage: build

有时候,我们希望一些任务是在某些场景下执行的,比如:打 tag 的时候再 build,这时候可以使用 only/except。

variables

在跑一个job的过程中,我们可能会需要环境变量,比如development,production,一个url,又或者是一个不希望显示在控制台的token,都可以作为一个环境变量,设置一个环境变量通常有3种方式:在项目设置中,在yml文件中,或者通过api。

通过项目设置界面来配置环境变量的入口如下:

在variables下可以配置变量名和值,通常是需要保密的变量

当然我们也可以设置在yml中:

variables:
  TEST: "HELLO WORLD"

然后就可以在脚本中引用:

  script:
    - echo $TEST 

only/except

以上面的场景为例,我们可以这样写job-build:

job-build:
  stage: build
  script: npm run build
  only:
    - tags

这样,上面的job就只有在我们push tags时才会触发。如果我们希望一个job只在某一类分支有提交的时候触发,可以这样:

job-bugfix-build:
  stage: build
  script: npm run build
  only:
    - /^bugfix-.+$/

上面这个例子只有在bugfix为前缀的分支产生提交的时候,才会触发job-bugfix-build。

然而,这样并不足以让这个任务跑起来,因为CI是跑在docker里面的,在执行run lint之前,我们需要把node环境搭起来,这就需要image保留字了:

image: node:12.18

添加了image之后,在任务开始之前,还要安装依赖,我们使用before_script来完成这件事:

# 使用node镜像
image: node:12.18

# 安装依赖
before_script:
 - npm install

有时候我们希望在某些场景下不执行某项任务,这时可以使用expect,比如不对hotfix进行lint:

job-lint-except-hotfix:
  script: 
    - npm run lint
  except: /^hotfix-.+$/
    

when

说了only,再说说when,when 是用来决定当前置任务失败时,当前job是否执行,以及如何执行的问题。比如我们希望lint成功了再执行build:

build_job:
  when: on_success
  stage: build
  needs: lint_job

再比如我们在执行发布的时候,希望手动点击发布按钮来执行发布:

publish_job:
  when: manual
  stage: publish
  script: npm run deploy

artifacts

在前面提到的build job中,我们会使用webpack生成压缩,混淆后的代码,此时我们需要把它保存或者下载下来,这时就要用到artifacts了。用法如下:

build_job:
  script: npm run build
  artifacts:
    name: "$CI_COMMIT_REF_NAME"
    paths: dist/

artifacts最终会被打包成一个压缩文件,这里的path表示要添加到压缩文件的文件或文件夹,name表示生成的压缩文件的名字。然后在对应的任务详情特面就可以下载:

include

正如通过程序通过模块来实现代码复用一样,CI的yml配置可以通过include实现配置复用:

include:
  - remote: 'https://gitlab.com/awesome-project/raw/master/.before-script-template.yml'
  - local: '/templates/.after-script-template.yml'
  - template: Auto-DevOps.gitlab-ci.yml

这样,我们可以把一些公用的环境变量或者job放到一个公共repo中,然后在其他项目中通过remote来引用。

tags

我们已经知道,CI任务是跑在runner上的。那么,我们怎么告诉CI每个job到底用什么runner呢,这就要用到tags了。我们来看一个官方给出的例子:

windows job:
  stage:
    - build
  tags:
    - windows
  script:
    - echo Hello, %USERNAME%!

osx job:
  stage:
    - build
  tags:
    - osx
  script:
    - echo "Hello, $USER!"

上面的例子定义了两个job,一个需要在windows上跑,另一个需要在mac上跑,我们为job加上tags,这样CI就会找到有对应tags的runner来执行这个任务了。

最后,github actions与gitlab ci在概念上很相似,不过配置的写法不太一样,官方还贴心的出了迁移文档:migrating-from-gitlab-cicd-to-github-actions

参考:
https://gitlab.com/help/ci/yaml/README

posted @ 2020-10-05 19:11  饭特稠  阅读(2108)  评论(2编辑  收藏  举报