Pipeline语法4

cache

cache :paths<缓存>

  1. - 存储编译项目所需的依赖项,指定项目工作空间中需要在job之间缓存的文件或目录
  2. - 全局cache定义在job外,针对所有job生效。job中的cache优先于全局。

由于缓存是在job之间共享的,不同的job使用不同的路径就出现缓存覆盖的问题。如果让不同的job缓存不同的cache就要设置不同的cache:key
cache:key:files <文件变化自动创建缓存> 文件发生变化时自动重新生成缓存(files最多指定两个文件),提交的时候检查指定的文件。根据指定的文件生成密钥计算SHA校验和,如果文件未改变值为default

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

cache:policy <缓存策略>
默认:在执行开始时下载文件,并在结束时重新上传文件

  - policy: pull 跳过下载步骤
  - policy: push 跳过上传步骤

image.png

artifacts

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

artifacts:
 paths:
  - target/
artifacts:expose_as <展示制品><br />关键字expose_as用于在合并请求 UI中公开作业工件(每个合并请求最多可以开10个作业工件)
test:
 script:
  - echo 1
 artifacts:
  expose_as: 'artifact 1'
  paths:
   - path/to/file.txt
artifacts:name <制品名称><br />通过name定义所创建的工件文档的名称。可以为每个档案使用唯一的名称。
job:
 arifacts:
  name: "$CI_JOB_NAME"
  paths:
   - binaries/
artifacts:when <制品创建条件>

  - 用于在作业失败或成功时上传工件
  - on_success 仅在作业成功时上载工件 (默认值)。
  -  on_failure 仅在作业失败时上载工件。
  - always 上载工件,无论任何状态。

artifacts:expire_in <制品保留时间><br />制品的有效期,从上传和存储到gitlab的时间开始算起。如果未定义过期时间,则默认30天。expire_in 的值以秒为单位的经过时间,除非提供了单位。<br />'42'<br />'3 mins 4 sec'<br />'2h20min'<br />'6 mos 1 day'<br />'47 yrs 6 mos and 4d'<br />'3 weeks and 2 days'
job:
 artifacts:
  expire_in: 1 week
artifacts:reports:junit <单元测试报告><br />收集junit单元测试报告,收集的junit报告将作为工件上传到gitlab,并自动显示在合并请求中。<br />artifacts:reports:cobertura <覆盖率>
build:
  stage: build
  tags:
    - build
  only:
    - master
  script:
    - mvn test
    - mvn cobertura:cobertura
    - ls target
  artifacts:
    name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"
    when: on_success
    expose_as: 'artifact 1'
    paths:
      - target/*.jar
    reports:
      junit: target/surefire-reports/TEST-*.xml
      cobertura: target/site/cobertura/coverage.xml

:::info junit和cobertura很耗资源,默认是关闭的。如要打开需要执行以下操作:
登录gitlab
image.png :::

dependencies

<获取制品> 定义要获取工件的作业列表,只能从当前阶段之前的阶段定义作业。定义一个空数组将跳过下载该作业的任何工件不会考虑先前作业的状态,因此,如果它失败或是未运行的手动作业,则不会发生错误。如果设置为依赖项的作业的工件已过期或删除,那么依赖项作业将失败。

unittest;
  dependencies:
    - build

Pipeline语法5

needs

<制品下载> 使用needs时,可以通过artifacts:true 或artifacts:false 来控制工件下载,默认为true。可无序执行作业,无需按照阶段顺序运行某些作业,可以让多个阶段同时运行。

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

include

include:local <引入本地配置>
可以允许引入外部YAML文件,文件具有扩展名.yml 或.yaml。
使用合并功能可以制定能够以和覆盖包含本地定义的CI/CD配置。
引入同一存储库中的文件,使用相对于根目录的完整路径进行引用,于配置文件在同一分支上使用。

stages:
  - deploy

deployjob:
  stage: deploy
  script:
    - echo 'deploy'
include:
  local: 'ci/localci.yml'


stages:
  - build
  - test
  - deploy


buildjob:
  stage: build
  script: ls


testjob:
  stage: test
  script: ls

include: file <引入其他项目配置>

# 引入demo/demo-java-service 项目master分支的.gitlab-ci.yml文件
include:
  - project: demo/demo-java-service
    ref: master
    file: '.gitlab-ci.yml'

include:template <引入官方的模板> 只能是官方的

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

include: remote <引入远程配置>
用于通过http/https包含来自其他位置的文件,并使用完整URL进行引用。

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

extends

<继承作业配置>

stages:
  - test
variables:
  RSPEC: 'test'

.tests:
  tags:
    - build
  script: echo "mvn test"
  stage: test
  only:
    refs:
      - branches

testjob:
  extends: .tests
  script: echo "mvn clean test"
  only:
    variables:
      - $RSPEC

extends & include

引用ci下localci.yml中配置的template

deployjob:
  stage: deploy
  script:
    - echo 'deploy'
  only:
    - dev

.template:
  stage: build
  script: 
    - echo "build"
  only:
    - master
include:
  local: 'ci/localci.yml'

stages:
  - test
  - build 
  - deploy

variables:
  RSPEC: 'test'

.tests:
  tags:
    - build
  script: echo "mvn test"
  stage: test
  only: 
    refs:
      - branches

testjob:
  tags:
    - build
  extends: .tests
  script: echo "mvn clean test"
  only:
    variables:
      - $RSPEC


newbuildjob:
  tags:
    - build
  script:
    - echo "123"
  extends: .template

trigger

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

staging:
  variables:
    ENVIRONMENT: staging
  stage: deploy
  trigger:
    project: demo/demo-java-service
    barnch: master
    strategy: depend
  • project关键字,用于指定下游项目的完整路径。
  • branch 关键字,指定该下游项目的分支名称。
  • variables 关键字,可以将变量传递到下游管道。全局变量也会传递到下游项目。上游管道优先于下游管道,如果上下游同时定义了两个相同名称的变量,则在上游项目中的变量优先,默认情况下,一旦创建了下游管道,trigger作业就会以success状态完成。
  • strategy:depend 将自身状态从触发的管道合并到源作业。
    stages:
    - build
    child-a-build:
    stage: build
    script:
    - echo "didi"
    - sleep 10
    
    staging2:
    variables:
    ENVIRONMENT: staging
    stage: deploy
    trigger:
    include: ci/child01.yml
    strategy: depend
    

Pipeline语法6

准备工作:注册一个docker类型的runner(之前的是shell类型)

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 "newdocker" \
  --run-untagged="true" \
  --locked="false" \
  --access-level="not_protected"

image

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

build:
  image: maven:3.6.3-jdk-8
  stage: build
  tags:
    - newdocker
  script:
    - ls
    - sleep 2
    - echo "mvn clean "
    - sleep 10

services

工作期间运行的另一个docker镜像,并link到image关键字定义的docker镜像。这样,您就可以在构建期间访问服务镜像。

services:
  - name: mysql:latest
    alias: mysql-1

environment

开发者可以将一个作业设置为某一环境的部署作业,同一个环境的部署作业会被收集到一起,运行部署作业,或者停止作业都将触发一个钩子。 不太理解

deploy to production:
  stage: deploy
  script: git push production HEAD:master
  environment:
    name: production
    url: https://prod.example.com

inherit

(12.9新增)
使用或禁用全局定义的环境变量(variables)或默认值(default)。
使用true、false觉得是否使用,默认是true

inherit:
  default: false
  variables: false

构建集成工具

环境配置

[maven软件包下载]https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
[gradle软件包下载] https://downloads.gradle.org/distributions/gradle-5.3-bin.zip
[ant 包下载地址] https://dlcdn.apache.org//ant/binaries/apache-ant-1.10.12-bin.tar.gz
[node软件包下载] https://nodejs.org/dist/v10.15.3/

解压
tar zxf apache-maven-xxxx.tar.gz -C /usr/local
tar zxf gradle-xxxx.tar.gz -C /usr/local
tar zxf node-xxxxx.tar.gz -C /usr/local
tar zxf apache-ant-xxxx.tar.gz -C /usr/local
#添加环境变量
vim /etc/profile
export MAVEN_HOME=/usr/local/apache-maven-3.8.6
export ANT_HOME=/usr/local/apache-ant-1.10.12
export GRADLE_HOME=/usr/local/gradle-5.3
export NODE_HOME=/usr/local/node-v10.15.3-linux-x64
export JAVA_HOME=/usr/local/jdk1.8.0_333
export PATH=$PATH:$MAVEN_HOME/bin:$ANT_HOME/bin:$GRADLE_HOME/bin:$NODE_HOME/bin
export PATH=$PATH:$JAVA_HOME/bin

生效全局环境变量
source /etc/profile
mvn -v 查看信息

构建基础模板