特定分支包括gitlab-ci

时间:2019-10-22 08:06:26

标签: gitlab-ci

情况:我们有一个大型项目,开发人员应该能够在其分支上跳过一些测试,以便专注于他所做的特定更改。我们不希望每个人都更改.gitlab-ci.yaml,因为这可能会导致很多合并冲突。

我们的想法是制作特定于分支的内容,例如

include:
  - local: branch/${CI_COMMIT_REF_SLUG}-config.yaml

在include中应该定义一些变量,这些变量然后影响必须运行的作业。

很遗憾,gitlab-ci没有直接支持此功能。

任何建议如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

我认为您应该查看GitLab的only/except

https://docs.gitlab.com/ee/ci/yaml/#onlyexcept-basic

由此,可以根据许多不同的事物来决定运行哪些作业。如果使用合并请求,则仅当某些文件中的文件已更改时才可以运行作业。像这样:

my_job:
  script:
    - build things
  only:
    refs:
      - merge_requests
    changes:
      - path/to/somewhere/**/*
      - other/path/**/*

这很容易设置和理解。

如果您确实需要开发人员能够手动选择要运行的作业,则应该可以。不过,它可能会变得有些笨拙。如果您的分支机构名称为fix-bug-xyz_myvar-eq-42,然后有类似的工作:

job:
  script:
    - build things
  only:
    - /.*myvar-eq-.*/

它们仅应针对内部具有匹配模式的分支运行。然后,您可以使用变量CI_COMMIT_REF_NAME并将其拆分以找到变量集的值。我还没有亲自测试过,但是类似的东西应该可以工作。

答案 1 :(得分:0)

我们通过以下解决方法解决了该问题。 我们解析提交消息以确定必须运行的作业,这可以通过规则轻松完成。

  rules:
    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME || $JOBNAME'
      when: never
    - if: '$CONFIG_CI =~ /.*customer.*IPONA.*/i'
    - if: '$CONFIG_CI'
      when: never
    - if: '$CI_COMMIT_MESSAGE =~ /CC:.*@customer@.*-IPONA-.*/i'

此外,我们还有一个目录branch / config,其中包含带有configuration-option的文件。 使用下面的hook-skript,我们确保不要每次提交都添加config-file中的数据。


#!/bin/bash
# Use in prepare-commit-msg-hook
# add a CC to the Commit-message to configure CI.

BRANCH_NAME=$(git symbolic-ref --short HEAD)
grep "CC:" $1

if [[ $? -ne 0 ]]; then
  echo >> $1
  branch_config=gitlab-ci/config/branch/$BRANCH_NAME
  if [[ -f ${branch_config} ]]; then
    . ${branch_config}
    echo "CC: ${CONFIG_CI}" >> $1
  else
    echo "CC: @customer@-IPOFA-IPONA-HOLIA-INSCA-OUTCA-INTT-QAT-" >> $1
  fi
fi

如果gitlab-ci issue得到真正解决,请不要使用此技巧。