.gitlab-ci.yml 的脚本部分中有重复的代码

Mee*_*ott 9 gitlab docker

gitlab ci 中有没有办法创建类似函数的东西?我希望阶段中没有重复的代码,或者我应该使用外部脚本来完成这样的任务吗?

我查看了 gitlab 模板,但是使用模板我只能使用模板中的作业一次。

stages:
  - build-artefakts
  - build-image

variables:
  CI_REGISTRY_NAMESPACE: 'main'
  CI_BASE_IMAGE: '...'

  1_GROUP_ID: '...'
  1_ARTIFACT_ID: '...'
  1_CLASSIFIER: '...'
  1_JAR_NAME: '...'
  1_IMAGE_NAME: '...'

  2_GROUP_ID: '...'
  2_ARTIFACT_ID: '...'
  2_CLASSIFIER: '...'
  2_JAR_NAME: '...'
  2_IMAGE_NAME: '...'


deploy-maven:
  image: maven:3.6-jdk-11
  stage: build-artefakts
  script:
    - 'mvn deploy -f pom.xml -s ~config/maven/ci_settings.xml -P prod'
  only:
    - master
  artifacts:
    paths:
      - ./target
    expire_in: 1 weeks

deploy-docker-1:
  image: $CI_BASE_IMAGE
  stage: build-image
  variables:
    ARTIFACT_ID: $1_ARTIFACT_ID
    JAR_NAME: $1_JAR_NAME
    IMAGE_NAME: $1_IMAGE_NAME

  before_script:
    - 'docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_TOKEN  $CI_REGISTRY'
  script:
    - 'cd docker'
    - 'mv ../target/$ARTIFACT_ID/*.jar $JAR_NAME'
    - 'docker build . -t $IMAGE_NAME:$PROJECT_VERSION --build-arg JAR_FILE=$JAR_NAME'
    - 'docker tag $IMAGE_NAME:$PROJECT_VERSION $CI_REGISTRY/$CI_REGISTRY_NAMESPACE/$IMAGE_NAME:$PROJECT_VERSION'
    - 'docker push $CI_REGISTRY/$CI_REGISTRY_NAMESPACE/$IMAGE_NAME:$PROJECT_VERSION'

deploy-docker-2:
  image: $CI_BASE_IMAGE
  stage: build-image
  variables:
    ARTIFACT_ID: $2_ARTIFACT_ID
    JAR_NAME: $2_JAR_NAME
    IMAGE_NAME: $2_IMAGE_NAME

  before_script:
    - 'docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_TOKEN  $CI_REGISTRY'
  script:
    - 'cd docker'
    - 'mv ../target/$ARTIFACT_ID/*.jar $JAR_NAME'
    - 'docker build . -t $IMAGE_NAME:$PROJECT_VERSION --build-arg JAR_FILE=$JAR_NAME'
    - 'docker tag $IMAGE_NAME:$PROJECT_VERSION $CI_REGISTRY/$CI_REGISTRY_NAMESPACE/$IMAGE_NAME:$PROJECT_VERSION'
    - 'docker push $CI_REGISTRY/$CI_REGISTRY_NAMESPACE/$IMAGE_NAME:$PROJECT_VERSION'

Run Code Online (Sandbox Code Playgroud)

Jak*_*kow 10

您可以在“脚本”部分中使用YAML 锚点

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

.some-other-script: &some-other-script
  - echo "executed other script"

first_job:
  script:
    - *some-script

second_job:
  script:
    - *some-other-script
Run Code Online (Sandbox Code Playgroud)

从 GitLab 13.9 开始,您还可以使用自定义 YAML 标签!reference

.some-script:
  script:
    - echo "executed script"

.some-other-script:
  script:
    - echo "executed other script"

first_job:
  script:
    - !reference [.some-script, script]

second_job:
  script:
    - !reference [.some-other-script, script]
Run Code Online (Sandbox Code Playgroud)

两种方法之间的区别在于 YAML 锚点不能跨包含的 YAML 文件使用。另一方面,引用的标签可以在包含的 YAML 文件中使用。