GitLab CI/CD关键词(一):脚本script,前置脚本before_script,后置脚本after_script


转载自:https://cloud.tencent.com/developer/article/1976367

简介

本篇文章详细介绍了GitLab CI/CD中script,before_script,与after_script三个关键词。 对于一个作业script内容是必填项(trigger 作业除外),这也是script关键词放到第一个来讲解的原因。before_script与after_script这两个关键词与script的内容一致,都是定义作业的脚本,除了执行时机还有一些其他的不同之处。本文也是详细解释。

script

关键词script是用来定义作业要执行的命令。只能定义在作业下,不可全局定义。 示例如下:

# 单行script
FizzJob:
  script: echo 'The first step is as good as half over.'
 
# 多行script
AsheJob:
  script:
    - echo 'You never know your luck.'
    - echo 'Sow nothing, reap nothing.' 

使用特殊字符

当你想要在script中使用特殊字符时,避免YAML语法,你必须使用单引号'或双引号" ,如下面的在script中使用curl的例子:

YiJob:
  script:
    - 'curl --request POST --header "Content-Type:application/json" "https://fizzz.blog.csdn.net/"'

这些特殊字符包括 {, }, [, ], ,, &, *, #, ?, |,-, <, >, =, !, %, @。 此规则在before_script,after_script中同样适用。 请注意,这里经常出错,pipeLine editor验证不通过。报错信息 Syntax is incorrect 或 script config should be a string or a nested array of strings up to 10 levels deep。出现这种错误大致就是因为script的内容存在特殊字符。

使用YAML锚点

在script中编写内容,除了以上中规中矩的写法外,你还可以使用YAML语法特有的锚点来组装script的内容,如下例

.some-script: &some-script
  - echo "Execute some script "

KayleJob:
  script:
    - *some-script
    - echo "Execute something, for this job only"

这种骚气的写法一定程度上可以提取公共的运行命令,从而降低代码量,提高复用率。但不太推荐。如果真的有类似的需求,请使用作业模板配合extends关键词来定义公共的作业配置。

分离长命令行

由于script的内容都是一行一行地执行,所以有时我们有时为了实现业务,会编写一条很长的命令。在这种情况下可以试一试将命令行分割,使用 |>。如下

RyzeJob:
  script:
    - |
      echo "Ideal are like the stars."
      echo "we never reach them ."
      echo "but like mariners , we chart our course by them."

NunuJob:
  script:
    - >
      echo "Have an aim in life, 
      or your energies will all be wasted.."

      echo "R. Peters."

这种写法会大大提高可读性。也可以设计非常酷的日志格式。

配置颜色的日志格式

为了使日志具备一定的辨识度,在Script中定义内容时,可以指定打印的颜色。如下:

IreliaJob:
  script:
    - echo -e "\e[31mA man is not old  ,\e[0m as long as\e[31m he is seeking something.."

如下图:

这里的颜色使用的是 ANSI escape codes。

支持的脚本类型

script中支持的脚本类型有很多,但有一个前提是GitLab Runner的执行器。不同的执行器支持不同的脚本类型。以下是Shell执行器所支持的脚本类型

可以看到,在script中可以编写所有主流的脚本。这也是GitLab CI/CD的一大特性,基本覆盖了全平台。 你可以在任何你想要的平台上运行GitLab Runner,执行各种各样的作业。

需要注意的是一些特殊的脚本,需要在GitLab Runner的配置文件config.toml 中稍微配置。具体可以查看一下官方Shell执行器文档

before_script

before_script是一个作业关键词,但你也可以使用关键词default让其内容在全局生效。下面是几个使用before_script示例:

default:
  before_script:
    - echo 'Miracles sometimes occur, but one has to work terribly for them.'

RammusJob:
  script: echo 'Rammus'
  before_script:
    - echo 'It never will rain roses.'
    - echo 'When we want to have more roses we must plant trees.'
    
TeemoJob:
  script: echo 'Teemo'
  before_script:
    - echo 'Genius only means hard-working all one's life.'

这里需要注意的是before_script的执行时机,是在制品(artifacts )被恢复后,也就是说可以操作制品。

此外如果你在before_script中定义了一个新的变量,那么可以在script中使用。如下

SorakaJob:
  before_script:
    - MY_NAME="Fizz"
    - YOUR_NAME="Amumu"
  script: 
    - echo ${MY_NAME} # Fizz
    - echo ${YOUR_NAME} # Amumu

与script关键词类似,before_script也可以使用|>分割命令行,也可以使用YAML文件的锚点来组装内容,也可以自定义打印颜色。

在真正运行时,before_script的内容直接拼接在script内容之前的,在script执行前执行。

after_script

关键词after_script定义的是作业完成后的命令,包括失败作业,这意味着,即使一个作业运行失败,它的after_script中的内容依然会被执行。

after_script的内容可以使用YAML锚点,也可以配置日志颜色,也可以分割多行。
after_script的执行环境是与 script分离的,是一个新的shell环境。这也意味着在after_script中无法访问到在before_script和script中定义的变量。此外,after_script的运行超时时间为5分钟。
after_script的运行状态不影响当前作业的状态,如果after_script运行失败或超时都不影响当前作业的成功或失败。

如果当前作业超时或者被取消运行,那么after_script的内容也不会被运行。

相关