21.云原生之GitLab pipline语法(CI基础)

云原生专栏大纲

文章目录

    • gitlab-ci.yml 介绍
    • GitLab中语法检测
    • gitlab-ci.yml 语法
      • job定义作业
      • before_script和after_script
      • stages定义阶段
      • tages指定runner
      • allow_failure运行失败
      • when控制作业运行
      • retry重试
      • timeout超时
      • parallel并行作业
      • only & except
      • rules
      • cache 缓存
        • cache:paths
        • cache:key 缓存标记
        • cache:policy 策略
      • artifacts
        • artifacts:paths
        • artifacts:expose_as
        • artifacts:name
        • artifacts:when
        • artifacts:expire_in
        • artifacts:reports
          • artifacts:reports:junit
          • artifacts:reports:cobertura
        • maven集成cobertura插件
        • dependencies
      • needs 并行阶段
        • 制品下载
      • include
        • local
        • file
        • template
        • remote
      • extends
        • extends & include
      • trigger 管道触发
        • 多项目管道
        • 父子管道
      • image
      • 准备工作注册docker类型的runner
      • services
      • environment
      • inherit

gitlab docs官网

gitlab-ci.yml 介绍

gitlab-ci.yml 是 GitLab CI/CD 的配置文件,用于定义项目的持续集成和持续交付流程。它采用 YAML 格式,位于项目的根目录或指定的目录中。
gitlab-ci.yml 文件包含了一系列的作业(jobs)和阶段(stages),定义了项目在不同情况下的构建、测试、部署等操作。以下是一些常见的 gitlab-ci.yml 配置项:

  • image:指定用于作业执行的 Docker 镜像。可以选择现有的镜像,也可以自定义镜像。
  • stages:定义项目的阶段顺序。每个阶段包含一组作业。
  • before_script:在每个作业执行之前运行的脚本命令。可以用于设置环境、安装依赖等操作。
  • after_script:在每个作业执行之后运行的脚本命令。可以用于清理环境、收集结果等操作。
  • variables:定义作业的环境变量。可以在作业的脚本中使用这些变量。
  • jobs:定义项目的作业。每个作业包含一个或多个脚本命令,用于执行具体的操作。
    • script:指定作业要执行的脚本命令。可以是单个命令或多个命令的序列。
    • artifacts:定义作业产生的构建产物,可以在后续的作业中使用。
    • only 和 except:指定作业执行的条件。可以基于分支、标签、变量等进行条件判断。

gitlab-ci.yml 文件的配置可以根据项目的需求进行自定义。你可以定义多个作业和阶段,根据需要设置依赖关系,以及在不同的条件下执行不同的操作。这使得你能够构建灵活、可扩展的 CI/CD 流程,提高开发效率和软件质量。

需要注意的是,一旦 gitlab-ci.yml 文件发生变化,GitLab 会自动检测并开始执行新的 CI/CD 流程。执行结果和日志可以在 GitLab 的界面中查看和分析。

GitLab中语法检测

  1. 进入CI/CD->配置检查

image.png

  1. 语法检测(这儿可以像写代码一样测试脚本)

image.png

gitlab-ci.yml 语法

官网gitlab-ci.yml语法,官网在线文档维护的最低版本是14.10,若想看更低版本文GitLab Docs历史版本。

# 较老版本
docker run -it --rm -p 4000:4000 registry.gitlab.com/gitlab-org/gitlab-docs:11.1
# 较新版本
docker run -it --rm -p 4000:4000 registry.gitlab.com/gitlab-org/gitlab-docs/archives:15.5

GitLab CI/CD 示例:http://localhost:4000/11.1/ee/ci/examples/README.html
gitlab-ci.yml 语法参考:http://localhost:4000/11.1/ee/ci/yaml/README.html

常用关键字:

job/script/before_script/after_script/stages/stage/variables/tags/allow_failure/when/retry/timeout/parallel

job无标签,runner有标签,流水线job被卡住情况:
image.png
登录gitlab修改runner配置勾选运行没有标签的作业:
image.png

job定义作业

job至少包含一个script

job1:script: "execute-script-for-job1"job2:script: - uname -a- bundle exec respec

注意:有时, script命令将需要用单引号或双引号引起来.例如,包含冒号命令(:)需要加引号,以便被包裹的YAML解析器知道来解释整个事情作为一个字符串,而不是一个"键:值"对.使用特殊字符时要小心:},[,],&,*,#,?,1,-,<,>,=!,8,@,

job下能使用的参数关键字:

关键词必填描述
scriptyes定义由 Runner 执行的 shell 脚本
imageno使用 docker 镜像,在使用 Docker 镜像中介绍
servicesno使用 Docker 服务,如使用 Docker 映像中所述
stageno定义作业阶段(默认值:test)
typeno别名stage
variablesno在作业级别定义作业变量
onlyno定义为其创建作业的 git ref 列表
exceptno定义未为其创建作业的 git ref 列表
tagsno定义用于选择 Runner 的标签列表
allow_failureno允许作业失败。失败的作业对提交状态没有影响
whenno定义何时运行作业。可以是 、 或on_successon_failurealwaysmanual
dependenciesno定义作业所依赖的其他作业,以便在它们之间传递工件
artifactsno定义作业工件列表
cacheno定义应在后续运行之间缓存的文件列表
before_scriptno覆盖在作业之前执行的一组命令
after_scriptno覆盖作业后执行的一组命令
environmentno定义此作业执行部署的环境的名称
coverageno定义给定作业的代码覆盖率设置
retryno定义作业在发生故障时可以自动重试的次数

before_script和after_script

before_script用于定义应先运行的命令 作业,包括部署作业,但在还原项目之后。 这可以是数组或多行字符串。
after_script用于定义将在 all 之后运行的命令 作业,包括失败的作业。这必须是数组或多行字符串。

before_script:- echo "global before script... "
after_script:- echo "global before after_script... "stages:- job1- job2job1:stage: job1before_script:- echo "job1 before_script... "script:- echo "job1 script... "after_script:- echo "job1 after_script... "
job2:stage: job2script:- echo "job2 script... "

before_script失败导致整个作业失败,其他作业将不再执行。作业失败不会影响after_script运行。

job1运行日志:没有执行全局before_script和after_script
image.png
job2运行日志:执行全局before_script和after_script
image.png

stages定义阶段

stages全局定义阶段执行顺序;stages在job中定义,指定job在那个阶段。

  1. 同一阶段的作业并行运行。
  2. 下一阶段的作业在上一阶段的作业之后运行 成功完成。
before_script:- echo "global before script... "
after_script:- echo "global before after_script... "# 全局定义阶段执行顺序
stages:- build- test- deployjob1:stage: buildbefore_script:- echo "job1 before_script... "script:- echo "job1 script... "after_script:- echo "job1 after_script... "
job2:stage: testscript:- echo "job2 script... "job3:stage: testscript:- echo "job3 script... "job4:stage: deployscript:- echo "job3 script... "

job2和job3在同一stage,作业并行执行
image.png
并行需要修改gitlab-runner中 /etc/gitlab-runner/config.toml下concurrent并发数配置,该配置默认1。修改后自动生效。

  1. .pre和.post

.pre:在流水线运行之前运行; .post: 在流水线运行之后运行

pre:stage: .prescript:- echo "pre script... "
post:stage: .postscript:- echo "post script... "

tages指定runner

用于指定job在那个runner上执行

stages:- build- deploybuild_job:stage: buildtags:- buildonly: - masterscript:- echo "Building the project... "deploy_job:stage: deploytags:- deployonly:- masterscript:- echo "Deploying the project..."

查看build和deploy作业日志验证是否在指定runner上运行
build_job日志:runner使用的3a8211f3
image.png
deploy_job日志:runner使用的c62726d6
image.png
跟下述创建的runner令牌能对应上
image.png

allow_failure运行失败

allow_failure允许作业失败,默认值为false。启用后,如果作业失败,该作业将在用户界面中显示橙色警告。但是,管道的逻辑流程将认为作业成功/通过,并且不会被阻塞。假设所有其他作业均成功,则该作业的阶段及其管道将显示相同的橙色警告。但是,关联的提交将被标记为"通过",而不会发出警告。

下述job2中script下脚本写错模拟失败情况:

before_script:- echo "global before script... "
after_script:- echo "global before after_script... "stages:- build- test- deployjob1:stage: buildbefore_script:- echo "job1 before_script... "script:- echo "job1 script... "after_script:- echo "job1 after_script... "
job2:stage: testscript:- ech "job2 script... "allow_failure: truejob3:stage: testscript:- echo "job3 script... "job4:stage: deployscript:- echo "job3 script... "

image.png

when控制作业运行

  1. on_success :仅当前几个阶段的所有作业时才执行作业 成功。这是默认设置。
  2. on_failure :仅当先前阶段的至少一个作业时失败才执行作业。
  3. always :总是执行作业,而不考虑先前阶段的作业状态。
  4. manual :手动执行作业(在 GitLab 8.10 中添加)。请阅读下面的手动操作。
  5. delayed:延迟执行作业
stages:- build- test- deployjob_ok:stage: buildscript:- echo "job_ok... "on_failure_job_skip:stage: testscript:- echo "on_failure_job_skip... "when: on_failureon_success_job_run:stage: testscript:- echo "on_success_job_run... "when: on_successjob_err:stage: testscript:- ech "on_success_job_run... "on_failure_job_run:stage: deployscript:- echo "on_failure_job_run... "when: on_failure

image.png
注意当错误执行使用allow_failure: true,stage会认为是正确,验证如下on_failure_job_run没执行
image.png

retry重试

配置在失败的情况下重试作业的次数。重试成功或达到最大重试次数就在执行该job

job_err:stage: testscript:- ech "on_success_job_run... "# retry: 2 # 11.1.4版本使用该语法,还不支持whenretry:max: 2when:- script_failure

重试错误类型

always :在发生任何故障时重试(默认).
unknown_failure :当失败原因未知时。
script_failure :脚本失败时重试。
api_failure :API失败重试。
stuck_or_timeout_failure :作业卡住或超时时。
runner_system_failure :运行系统发生故障。
missing_dependency_failure: 如果依赖丢失。
runner_unsupported :Runner不受支持。
stale_schedule :无法执行延迟的作业。
job_execution_timeout :脚本超出了为作业设置的最大执行时间。
archived_failure :作业已存档且无法运行。
unmet_prerequisites :作业未能完成先决条件任务。
scheduler_failure :调度程序未能将作业分配给运行scheduler_failure。
data_integrity_failure :检测到结构完整性问题。

timeout超时

该标签在小编安装11.1版本中没有,但是介绍下。
作业级别超时配置:

job_ok:stage: buildscript:- echo "job_ok... "timeout: 3h 30m  # 作业级别超时

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

项目超时时间配置如下:
image.png
runner超时配置:

如果小于项目定义超时时间将具有优先权。此功能可用于通过设置大超时(例如一个星期)来防止SharedRunner被项目占用。未配置时,Runner将不会覆盖项目超时。

image.png
超时时间到底哪个生效?

当项目和runner都设置了超时时间,那个小那个生效。runner未设置,项目设置超时时间,项目设置生效。

parallel并行作业

  1. 配置要并行运行的作业实例数,此值必须大于或等于2并且小于或等于50。
  2. 这将创建N个并行运行的同一作业实例.它们从job_name 1/N到job_name N/N依次命名。
job_ok:stage: buildscript:- echo "job_ok... "parallel: 5

only & except

only和except是两个参数用分支策略来限制jobs构建:

  1. only定义哪些分支和标签的git项目将会被job执行。
  2. except定义哪些分支和标签的git项目将不会被job执行。
job:# use regexponly:- /^issue-.*$/# use special keywordexcept:- 分支名

rules

rules允许_按顺序_评估单个规则对象的列表,直到一个匹配并为作业动态提供属性.

在 GitLab 12.3 中引入。请注意, rules不能与only/except组合使用。

variables:DOMAIN: xxx.comcodescan:stage: testtags:- buildscript:- echo "codescan"- sleep 5;#parallel: 5rules:- exists:- Jenkinsfile- changes:- Jenkinsfile- if: '$DOMAIN == "xxx.com"'when: manual- when: on_successallow_failure: true

rules:if

如果DOMAIN的值匹配,则需要手动运行。不匹配on_success。 条件判断从上到下,匹配即停止。多条件匹配可以使用&& ||

rules:changes

接受文件路径数组。 如果提交中Jenkinsfile文件发生的变化则为true。

rules:exists

接受文件路径数组。当仓库中存在指定的文件时操作。

rules:allow_failure

使用allow_failure: true rules:在不停止管道本身的情况下允许作业失败或手动作业等待操作.

cache 缓存

用来指定需要在job之间缓存的文件或目录。只能使用该项目工作空间内的路径。不要使用缓存在阶段之间传递工件,因为缓存旨在存储编译项目所需的运行时依赖项。
如果在job范围之外定义了cache ,则意味着它是全局设置,所有job都将使用该定义。如果未全局定义或未按job定义则禁用该功能。

cache:paths

使用paths指令选择要缓存的文件或目录,路径是相对于项目目录,不能直接链接到项目目录之外。
$CI_PROJECT_DIR 项目目录
在job build中定义缓存,将会缓存target目录下的所有.jar文件。

build:script: testcache:paths:- target/*.jar

当在全局定义了cache:paths会被job中覆盖。以下实例将缓存binaries目录。

cache:paths:- my/filesbuild:script: echo "hello"cache:key: buildpaths:- target/

由于缓存是在job之间共享的,如果不同的job使用不同的路径就出现了缓存覆盖的问题。如何让不同的job缓存不同的cache呢?设置不同的cache:key。


cache:key 缓存标记

为缓存做个标记,可以配置job、分支为key来实现分支、作业特定的缓存。为不同 job 定义了不同的 cache:key 时, 会为每个 job 分配一个独立的 cache。cache:key变量可以使用任何预定义变量,默认default ,从GitLab 9.0开始,默认情况下所有内容都在管道和作业之间共享。
按照分支设置缓存

cache:key: ${CI_COMMIT_REF_SLUG}

files: 文件发生变化自动重新生成缓存(files最多指定两个文件),提交的时候检查指定的文件。
根据指定的文件生成密钥计算SHA校验和,如果文件未改变值为default。

cache:key:files:- Gemfile.lock- package.jsonpaths:- vendor/ruby- node_modules

prefix: 允许给定prefix的值与指定文件生成的秘钥组合。
在这里定义了全局的cache,如果文件发生变化则值为 rspec-xxx111111111222222 ,未发生变化为rspec-default。

cache:key:files:- Gemfile.lockprefix: ${CI_JOB_NAME}paths:- vendor/rubyrspec:script:- bundle exec rspec

例如,添加$CI_JOB_NAME prefix将使密钥看起来像: rspec-feef9576d21ee9b6a32e30c5c79d0a0ceb68d1e5 ,并且作业缓存在不同分支之间共享,如果分支更改了Gemfile.lock ,则该分支将为cache🔑files具有新的SHA校验和. 将生成一个新的缓存密钥,并为该密钥创建一个新的缓存. 如果Gemfile.lock未发生变化 ,则将前缀添加default ,因此示例中的键为rspec-default 。


cache:policy 策略

默认:在执行开始时下载文件,并在结束时重新上传文件。称为” pull-push缓存策略.
policy: pull 跳过下载步骤
policy: push 跳过上传步骤

stages:- setup- testprepare:stage: setupcache:key: gemspaths:- vendor/bundlescript:- bundle install --deploymentrspec:stage: testcache:key: gemspaths:- vendor/bundlepolicy: pullscript:- bundle exec rspec ...

artifacts

用于指定在作业成功或者失败时应附加到作业的文件或目录的列表。作业完成后,工件将被发送到GitLab,并可在GitLab UI中下载。

artifacts:paths

路径是相对于项目目录的,不能直接链接到项目目录之外。
将制品设置为target目录

artifacts:paths:- target/


禁用工件传递

job:stage: buildscript: make builddependencies: []

您可能只想为标记的发行版创建构件,以避免用临时构建构件填充构建服务器存储。仅为标签创建工件( default-job不会创建工件):

default-job:script:- mvn test -Uexcept:- tagsrelease-job:script:- mvn package -Uartifacts:paths:- target/*.waronly:- tags

artifacts:expose_as

关键字expose_as可用于在合并请求 UI中公开作业工件。
例如,要匹配单个文件:

test:script: - echo 1artifacts:expose_as: 'artifact 1'paths: - path/to/file.txt

使用此配置,GitLab将在指向的相关合并请求中添加链接file1.txt。

制品浏览

请注意以下几点:

  • 每个合并请求最多可以公开10个作业工件。
  • 如果指定了目录,那么如果目录中有多个文件,则该链接将指向指向作业工件浏览器。
  • 如果开启GitlabPages可以对.html .htm .txt .json .log扩展名单个文件工件渲染工件。

artifacts:name

通过name指令定义所创建的工件存档的名称。可以为每个档案使用唯一的名称。 artifacts:name变量可以使用任何预定义变量。默认名称是artifacts,下载artifacts改为artifacts.zip。
使用当前作业的名称创建档案

job:artifacts:name: "$CI_JOB_NAME"paths:- binaries/

使用内部分支或标记的名称(仅包括binaries目录)创建档案,

job:artifacts:name: "$CI_COMMIT_REF_NAME"paths:- binaries/

使用当前作业的名称和当前分支或标记(仅包括二进制文件目录)创建档案

job:artifacts:name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"paths:- binaries/

要创建一个具有当前阶段名称和分支名称的档案

job:artifacts:name: "$CI_JOB_STAGE-$CI_COMMIT_REF_NAME"paths:- binaries/

artifacts:when

用于在作业失败时或尽管失败而上传工件。on_success仅在作业成功时上载工件。这是默认值。on_failure仅在作业失败时上载工件。always 上载工件,无论作业状态如何。
要仅在作业失败时上传工件:

job:artifacts:when: on_failure

artifacts:expire_in

制品的有效期,从上传和存储到GitLab的时间开始算起。如果未定义过期时间,则默认为30天。
expire_in的值以秒为单位的经过时间,除非提供了单位。可解析值的示例:

‘42’
‘3 mins 4 sec’
‘2 hrs 20 min’
‘2h20min’
‘6 mos 1 day’
‘47 yrs 6 mos and 4d’
‘3 weeks and 2 days’

一周后过期

job:artifacts:expire_in: 1 week

artifacts:reports

用于从作业中收集测试报告,代码质量报告和安全报告. 在GitLab的UI中显示这些报告。
**注意:**无论作业结果(成功或失败),都将收集测试报告。

artifacts:reports:junit

收集junit单元测试报告,收集的JUnit报告将作为工件上传到GitLab,并将自动显示在合并请求中。

build:stage: buildtags:- buildonly:- masterscript:- mvn test- mvn cobertura:cobertura- ls targetartifacts:name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"when: on_successexpose_as: 'artifact 1'paths:- target/*.jarreports:junit: target/surefire-reports/TEST-*.xml

**注意:**如果您使用的JUnit工具导出到多个XML文件,则可以在一个作业中指定多个测试报告路径,它们将被自动串联到一个文件中. 使用文件名模式( junit: rspec-.xml ),文件名数组( junit: [rspec-1.xml, rspec-2.xml, rspec-3.xml] )或其组合( junit: [rspec.xml, test-results/TEST-.xml] )。


如果无法显示此页面,需要更改系统设置。此选项可能会加大资源占用,默认禁用了需要启用。

登录gitlab
su -  git
$ gitlab-rails console
--------------------------------------------------------------------------------GitLab:       12.9.0 (9a382ff2c82) FOSSGitLab Shell: 12.0.0PostgreSQL:   10.12
--------------------------------------------------------------------------------
Feature.enable(:junit_pipeline_view)Loading production environment (Rails 6.0.2)
irb(main):001:0>
irb(main):002:0>
irb(main):003:0> Feature.enable(:junit_pipeline_view)
=> true
irb(main):004:0>

参考链接:https://docs.gitlab.com/ee/ci/junit_test_reports.html


artifacts:reports:cobertura

收集的Cobertura覆盖率报告将作为工件上传到GitLab,并在合并请求中自动显示。

build:stage: buildtags:- buildonly:- masterscript:- mvn test- mvn cobertura:cobertura- ls targetartifacts:name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"when: on_successexpose_as: 'artifact 1'paths:- target/*.jarreports:junit: target/surefire-reports/TEST-*.xmlcobertura: target/site/cobertura/coverage.xml
$ gitlab-rails console
--------------------------------------------------------------------------------GitLab:       12.9.0 (9a382ff2c82) FOSSGitLab Shell: 12.0.0PostgreSQL:   10.12
--------------------------------------------------------------------------------Loading production environment (Rails 6.0.2)
irb(main):001:0>
irb(main):002:0>
irb(main):003:0> Feature.enable(:coverage_report_view)
=> true

maven集成cobertura插件
<plugins>       <!--  cobertura plugin start --><plugin><groupId>org.codehaus.mojo</groupId>  <artifactId>cobertura-maven-plugin</artifactId>  <version>2.7</version>  <configuration>  <formats>  <format>html</format>  <format>xml</format>  </formats>  </configuration>  </plugin>       <!--  cobertura plugin end --></plugins>

执行 mvn cobertura:cobertura 运行测试并产生 Cobertura 覆盖率报告。
参考链接:https://docs.gitlab.com/12.9/ee/user/project/merge_requests/test_coverage_visualization.html
备注实验未做出效果,具体问题待排查。


dependencies

定义要获取工件的作业列表,只能从当前阶段之前执行的阶段定义作业。定义一个空数组将跳过下载该作业的任何工件不会考虑先前作业的状态,因此,如果它失败或是未运行的手动作业,则不会发生错误。

如果设置为依赖项的作业的工件已过期或删除,那么依赖项作业将失败。

needs 并行阶段

可无序执行作业,无需按照阶段顺序运行某些作业,可以让多个阶段同时运行。

stages:- build- test- deploymodule-a-build:stage: buildscript: - echo "hello3a"- sleep 10module-b-build:stage: buildscript: - echo "hello3b"- sleep 10module-a-test:stage: testscript: - echo "hello3a"- sleep 10needs: ["module-a-build"]module-b-test:stage: testscript: - echo "hello3b"- sleep 10needs: ["module-b-build"]


如果needs:设置为指向因only/except规则而未实例化的作业,或者不存在,则创建管道时会出现YAML错误。
暂时限制了作业在needs:可能需要的最大作业数分配,ci_dag_limit_needs功能标志已启用(默认)分配10个,如果功能被禁用为50。

Feature::disable(:ci_dag_limit_needs)   # 50
Feature::enable(:ci_dag_limit_needs)  #10

制品下载

在使用needs,可通过artifacts: true或artifacts: false来控制工件下载。 默认不指定为true。

module-a-test:stage: testscript: - echo "hello3a"- sleep 10needs: - job: "module-a-build"artifacts: true

相同项目中的管道制品下载,通过将project关键字设置为当前项目的名称,并指定引用,可以使用needs从当前项目的不同管道中下载工件。在下面的示例中,build_job将使用other-refref下载最新成功的build-1作业的工件:

build_job:stage: buildscript:- ls -lhRneeds:- project: group/same-project-namejob: build-1ref: other-refartifacts: true

不支持从parallel:运行的作业中下载工件。


include

https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates
可以允许引入外部YAML文件,文件具有扩展名.yml或.yaml 。使用合并功能可以自定义和覆盖包含本地定义的CI / CD配置。相同的job会合并,参数值以源文件为准。

local

引入同一存储库中的文件,使用相对于根目录的完整路径进行引用,与配置文件在同一分支上使用。
ci/localci.yml: 定义一个作业用于发布。

stages:- deploydeployjob:stage: deployscript:- echo 'deploy'

.gitlab-ci.yml 引入本地的CI文件’ci/localci.yml’。

include:local: 'ci/localci.yml'stages:- build- test- deploybuildjob:stage: buildscript: lstestjob:stage: testscript: ls

效果


file

包含来自另一个项目的文件

include:- project: demo/demo-java-serviceref: masterfile: '.gitlab-ci.yml'

template

只能使用官方提供的模板 https://gitlab.com/gitlab-org/gitlab/tree/master/lib/gitlab/ci/templates

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

remote

用于通过HTTP / HTTPS包含来自其他位置的文件,并使用完整URL进行引用. 远程文件必须可以通过简单的GET请求公开访问,因为不支持远程URL中的身份验证架构。

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

extends

继承模板作业

stages:- test
variables:RSPEC: 'test'.tests:script: echo "mvn test"stage: testonly:refs:- branchestestjob:extends: .testsscript: echo "mvn clean test"only:variables:- $RSPEC

合并后

testjob:stage: testscript: mvn clean testonly:variables:- $RSPECrefs:- branches

extends & include

aa.yml

#stages:
#  - deploydeployjob:stage: deployscript:- echo 'deploy'only:- dev.template:stage: buildscript: - echo "build"only:- master
include:local: 'ci/localci.yml'stages:- test- build - deployvariables:RSPEC: 'test'.tests:script: echo "mvn test"stage: testonly:refs:- branchestestjob:extends: .testsscript: echo "mvn clean test"only:variables:- $RSPECnewbuildjob:script:- echo "123"extends: .template

这将运行名为useTemplate的作业,该作业运行echo Hello! 如.template作业中所定义,并使用本地作业中所定义的alpine Docker映像.


trigger 管道触发

当GitLab从trigger定义创建的作业启动时,将创建一个下游管道。允许创建多项目管道和子管道。将trigger与when:manual一起使用会导致错误。
多项目管道: 跨多个项目设置流水线,以便一个项目中的管道可以触发另一个项目中的管道。[微服务架构]
父子管道: 在同一项目中管道可以触发一组同时运行的子管道,子管道仍然按照阶段顺序执行其每个作业,但是可以自由地继续执行各个阶段,而不必等待父管道中无关的作业完成。

多项目管道

当前面阶段运行完成后,触发demo/demo-java-service项目master流水线。创建上游管道的用户需要具有对下游项目的访问权限。如果发现下游项目用户没有访问权限以在其中创建管道,则staging作业将被标记为_失败_。

staging:variables:ENVIRONMENT: stagingstage: deploytrigger: project: demo/demo-java-servicebranch: masterstrategy: depend

project关键字,用于指定下游项目的完整路径。该branch关键字指定由指定的项目分支的名称。使用variables关键字将变量传递到下游管道。 全局变量也会传递给下游项目。上游管道优先于下游管道。如果在上游和下游项目中定义了两个具有相同名称的变量,则在上游项目中定义的变量将优先。默认情况下,一旦创建下游管道,trigger作业就会以success状态完成。strategy: depend将自身状态从触发的管道合并到源作业。

在下游项目中查看管道信息

在此示例中,一旦创建了下游管道,该staging将被标记为成功。

父子管道

创建子管道ci/child01.yml

stages:- buildchild-a-build:stage: buildscript: - echo "hello3a"- sleep 10

在父管道触发子管道

staging2:variables:ENVIRONMENT: stagingstage: deploytrigger: include: ci/child01.yml  strategy: depend

image

准备工作注册docker类型的runner

gitlab-runner register \--non-interactive \--executor "docker" \--docker-image alpine:latest \--url "http://192.168.1.33:30088/" \--registration-token "xxx" \--description "docker-runner" \--tag-list "newdocker" \--run-untagged="true" \--locked="false" \--docker-privileged \ --access-level="not_protected"
[[runners]]name = "docker-runner"url = "http://192.168.1.33:30088/"token = "xxx"executor = "docker"[runners.custom_build_dir][runners.cache][runners.cache.s3][runners.cache.gcs][runners.docker]pull_policy = "if-not-present"tls_verify = falseimage = "alpine:latest"privileged = truedisable_entrypoint_overwrite = falseoom_kill_disable = falsedisable_cache = falsevolumes = ["/cache"]shm_size = 0

默认在注册runner的时候需要填写一个基础的镜像,请记住一点只要使用执行器为docker类型的runner所有的操作运行都会在容器中运行。 如果全局指定了images则所有作业使用此image创建容器并在其中运行。 全局未指定image,再次查看job中是否有指定,如果有此job按照指定镜像创建容器并运行,没有则使用注册runner时指定的默认镜像。

#image: maven:3.6.3-jdk-8before_script:- lsbuild:image: maven:3.6.3-jdk-8stage: buildtags:- newdockerscript:- ls- sleep 2- echo "mvn clean "- sleep 10deploy:stage: deploytags:- newdockerscript:- echo "deploy"

services

工作期间运行的另一个Docker映像,并link到image关键字定义的Docker映像。这样,您就可以在构建期间访问服务映像.
服务映像可以运行任何应用程序,但是最常见的用例是运行数据库容器,例如mysql 。与每次安装项目时都安装mysql相比,使用现有映像并将其作为附加容器运行更容易,更快捷。

services:- name: mysql:latestalias: mysql-1

environment

deploy to production:stage: deployscript: git push production HEAD:masterenvironment:name: productionurl: https://prod.example.com

inherit

使用或禁用全局定义的环境变量(variables)或默认值(default)。
使用true、false决定是否使用,默认为true

inherit:default: falsevariables: false

继承其中的一部分变量或默认值使用list

inherit:default:- parameter1- parameter2variables:- VARIABLE1- VARIABLE2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/643648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PolarDB 再升级:欢迎来到云数据库 x AI新时代

大模型时代&#xff0c;数据库的变化走到了哪&#xff1f; 作者|思杭 编辑|皮爷 出品|产业家 “搭积木”、“‘自动驾驶’”、“三层解耦”&#xff0c;这些形象的标签成了1月17日阿里云开发者生态大会当天最出圈的词汇。 会上&#xff0c;一名小学生受邀上台演示了数据…

3.jmeter接口关联及实战

1.当所传参数包含键值对和json文件时&#xff0c;键值对放在链接后&#xff0c;参数放在消息体数据中 2.当查看结果树返回乱码时&#xff0c;修改请求中内容编码为utf-8 一、jmeter接口关联 1.正则表达式提取器 接口2.3传递的参数中需要用到接口1的返回值 禁用接口2.3&#…

Elasticsearch:Simulate ingest API

Ingest pipeline 为我们摄入数据提供了极大的方便。在我之前的文章中&#xff0c;有非常多的有关 ingest pipeline 的文章。请详细阅读文章 “Elastic&#xff1a;开发者上手指南”。针对一组提供的文档执行摄取管道&#xff0c;可以选择使用替代管道定义。 Simulate ingest AP…

基于关系型数据库的知识图谱存储探析

目录 前言1 图结构数据的关系存储1.1 Wikidata与MySQL的结合1.2 关系型数据库的优势与挑战 2 选择数据库需要考虑的三个问题2.1 存储的物理结构2.2 存储的性能问题2.3 图的查询问题 3. 不同的存储方式3.1 Triple Store3.2 属性表存储3.3 二元表3.4 全索引结构 结语 前言 在当今…

前端动画特效分享(附效果图及在线演示)

分享7款有趣也实用的前端动画特效 其中有CSS动画、canvas动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 SVG天气图标动画特效 SVG天气图标动画特效 不管是晴天雨天等都很完美的展示出了各自真实的…

新版idea创建spring boot项目

目录 前言 汉化教程 项目模板初始化 1.点击新建项目 2.配置初始化信息 3.初始依赖选择 配置Maven 1.打开maven设置 2.重写maven配置文件 3.选择你创建的配置文件 4.重启项目 spring boot配置并测试 1.修改配置文件后缀 2.启动项目 3.编写测试控制类 4.重启项目…

创建.gitignore,忽视不必要提交的文件

在项目主目录下创建.gitignore文件 touch .gitignore在.gitignore文件内输入要忽略的文件即可。 e.g. build/.gitignore文件不生效问题 上传后并没有不在build目录内产生文件 该文件只能作用于Untracked Files&#xff0c;也就是那些从来没有被git记录过的文件。 解决方法…

springboot druid数据库配置密码加密

1.使用的druid版本 <!-- 阿里数据库连接池 --> <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.21</version> </dependency> 2.配置文件 # Spring配置 …

141:vue+leaflet 利用高德逆地理编码,点击地图标记marker,popup地址信息

第141个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中利用高德逆地理编码,点击地图标记marker,popup地址信息 。主要利用高德地图的api将坐标转化为地址,然后在点击的位置,弹出弹窗,在里面显示出地址信息。 直接复制下面的 vue+leaflet源代码,操作2分钟…

性能优化(CPU优化技术)-NEON 介绍

「发表于知乎专栏《移动端算法优化》」 本节主要介绍基本 SIMD 及其他的指令流与数据流的处理方式&#xff0c;NEON 的基本原理、指令以及与其他平台及硬件的对比。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;…

Unity之Timeline教程

前言 Unity Timeline是Unity的一种时间轴编辑器工具&#xff0c;用于制作和管理游戏中的动画、剧情以及事件触发。它提供了直观的界面&#xff0c;使得开发者可以通过拖放操作轻松创建和编辑时间轴。 Timeline的使用 创建新的Timeline 在Unity中&#xff0c;选择菜单栏的 Wi…

云计算入门——Linux 命令行入门

云计算入门——Linux 命令行入门 前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 如今&#xff0c;我们许多人都熟悉计算机&#xff08;台式机和笔记本电…

Ant Design Vue详解a-tree-select使用树形选择器,递归渲染数据,点击选项回显,一二级菜单是否可选等问题

后台给的树形数据&#xff1a; {"code": 200,"data": [{"code": "jsd","children": [{"code": "hx","children": [],"name": "航向","id": 8,"libTable…

《WebKit 技术内幕》学习之十一(3):多媒体

3 音频 3.1 音频元素 说完视频之后&#xff0c;接下来就是HTML5中对音频的支持情况。音频支持不仅指对声音的播放&#xff0c;还包括对音频的编辑和合成&#xff0c;以及对乐器数字接口&#xff08;MIDI&#xff09;等的支持&#xff0c;下面逐次介绍并分析它们。 3.1.1 H…

代码随想录算法训练营第36天 |435. 无重叠区间 763.划分字母区间 56. 合并区间

目录 435. 无重叠区间 &#x1f4a1;解题思路 &#x1f4bb;实现代码 763.划分字母区间 &#x1f4a1;解题思路 &#x1f4bb;实现代码 56. 合并区间 &#x1f4a1;解题思路 &#x1f4bb;实现代码 435. 无重叠区间 题目链接&#xff1a;435. 无重叠区间 给定一个…

一文讲透Redis的LRU与LFU算法实现

深入解析Redis的LRU与LFU算法实现 一、前言 Redis是一款基于内存的高性能NoSQL数据库&#xff0c;数据都缓存在内存里&#xff0c; 这使得Redis可以每秒轻松地处理数万的读写请求。 相对于磁盘的容量&#xff0c;内存的空间一般都是有限的&#xff0c;为了避免Redis耗尽宿主…

【Go面试向】Go程序的执行顺序

【Go】Go程序的执行顺序 大家好 我是寸铁&#x1f44a; 总结了一篇Go程序的执行顺序的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; Go程序内容 go程序通常包含: 包、常量、变量、init()、main()等元素 下面从这几个方面分别去梳理&#xff01; 包的执行顺序 程序中的包 …

Linux系统常用命令行指令

Linux系统是一种常用于开源项目开发的生产环境&#xff0c;因其免费、开源、安全、稳定的特点被广泛应用于手机、平板电脑、路由器、电视和电子游戏机等嵌入式系统中&#xff0c;能够更加简便地让用户知道系统是怎样工作的。前几日我安装好了Red Hat Enterprise Linux 9.0&…

Linux的常见指令和基本操作演绎【复习篇章一】

文章目录 前言下载安装 XShellXShell 下的复制粘贴热键操作01.ls指令tree 02.cd指令03.touch指令04.mkdir指令&#xff08;重要&#xff09;&#xff1a;05.rmdir指令 && rm 指令&#xff08;重要&#xff09;06.组合07.man指令&#xff08;重要&#xff09;&#xff1…

《WebKit 技术内幕》学习之十一(4):多媒体

4 WebRTC 4.1 历史 相信读者都有过使用Tencent QQ或者FaceTime进行视频通话的经历&#xff0c;这样的应用场景相当典型和流行&#xff0c;但是基本上来说它们都是每个公司推出的私有产品&#xff0c;而且通信等协议也都是保密的&#xff0c;这使得一种产品的用户基本上不可能…