GitLab CI,单体代码库和功能分支

4

我在GitLab上有一个单体仓库,使用特性分支的方法。

我的目标是启动与包含更改文件的目录相关联的部分流水线。因此,我的.gitlab-ci.yml文件看起来像:

job1:
  stage: build
  script:
    - ...
  only:
    changes:
      - myparentdir/dir1/*

job2:
  stage: build
  script:
    - ...
  only:
    changes:
      - myparentdir/dir2/*
  1. 从develop分支创建一个新的分支
  2. 在这个分支上提交myparentdir/dir2/test.txt文件
  3. 管道将启动每个构建工作!

似乎GitLab在使用新功能分支时会将所有文件视为已更改。

您知道有什么解决方法吗?

1个回答

3
Gitlab ci总是将新分支的changes视为真。原因是他们无法决定要与什么进行比较。这意味着对于新分支的第一个流水线,将构建所有内容。有关详细信息,请参见功能请求
但是,现在有一个相当新的功能叫做合并请求的管道 - 在合并请求上运行一个阶段。 这里是实现具有merge_requests的changes的功能请求。它已经被合并了,但我不确定它是否已经发布。(里程碑是11.9 - 下一个版本)
同时,您可以自己实现它 - 您可以添加一个比较更改(git diff)并决定是否运行下一个阶段的阶段。
.store_diff_from_main: &store_diff_from_main |
  git diff --name-only origin/master...HEAD > "${DIFF_FILE}"
  git diff --name-only HEAD~1 >> "${DIFF_FILE}"

.skip_stage: &skip_stage_condition |
  echo Checking for changes in ${STAGE_PATHS}, changed files
  # https://coderwall.com/p/gecfwa/git-diff-vs
  cat .diff-from-master
  # also cover merge squash cases
  if ! (cat ${DIFF_FILE} | grep -E "${STAGE_PATHS}"); then
    echo "Skipping stage ..."
    exit 0
  fi


看起来不错。目前我无法确定它是否解决了我的问题,因为我在使用 Windows 批处理时遇到了困难:https://dev59.com/_LLma4cB1Zd3GeqPa3B6?noredirect=1#comment96958039_55105278 - jBravo
它可以运行。问题在于,我所有的126个作业都已启动,其中125个被跳过但仍然出现在我的管道中... - jBravo
这个解决方案的问题在于它不是本地的,所以任务会开始但会被跳过。我也在等待本地解决方案。 - Amityo
only: changes 结合 only: refs: - merge_requests 看起来可以让我拥有特定于代码的流水线,但是由于“only: merge_requests 参数的行为是这样的,只有带有该参数的作业才会在合并请求的上下文中运行;不会运行其他任何作业。” 来自 https://docs.gitlab.com/ee/ci/merge_request_pipelines/,所以我不能让一些作业适用于所有代码更改,而另一些作业则适用于特定的文件路径。 - mmacvicar
@mmacvicar 你说得对。在我的情况下,我有主分支和特性分支。如果我想让某个阶段运行PR和主分支,我需要在merge_request行后添加-master。 - Amityo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接