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的内容也不会被运行。