情况:我们有一个大型项目,开发人员应该能够在其分支上跳过一些测试,以便专注于他所做的特定更改。我们不希望每个人都更改.gitlab-ci.yaml,因为这可能会导致很多合并冲突。
我们的想法是制作特定于分支的内容,例如
include:
- local: branch/${CI_COMMIT_REF_SLUG}-config.yaml
在include中应该定义一些变量,这些变量然后影响必须运行的作业。
很遗憾,gitlab-ci没有直接支持此功能。
任何建议如何解决这个问题?
答案 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得到真正解决,请不要使用此技巧。