GitLab CI、monorepo 和功能分支
GitLab CI, monorepo and feature branch
我在 GitLab 中有一个 monorepo,采用了 Feature Branch 方法。
我想要实现的是启动与包含已更改文件的目录关联的管道部分。所以我的 .gitlab-ci.yml 看起来像:
job1:
stage: build
script:
- ...
only:
changes:
- myparentdir/dir1/*
job2:
stage: build
script:
- ...
only:
changes:
- myparentdir/dir2/*
- 从 develop 创建一个新分支
- 在此分支上提交 myparentdir/dir2/test.txt
- 管道启动每个构建作业!
GitLab 似乎在使用新功能分支时将每个文件都视为已更改。
您知道任何解决方法吗?
Gitlab ci 始终将新分支的 changes
视为 true。原因是他们无法确定ci要比较的对象。
what this means is that for the first pipeline of a new branch, everything will be built.
有关详细信息,请参阅 feature request。
但是,merge requests - that runs a stage on merge requests. Here 有一个名为 Pipelines 的相当新的功能,它是使用 merge_requests 实现 changes
的功能请求。它已合并,但我不确定它是否已经发布。 (里程碑是 11.9 - 下一个版本)
在此期间你可以自己实施 - 你可以添加一个阶段来比较变化(git diff)并确定cides是否运行下一阶段:
.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
我在 GitLab 中有一个 monorepo,采用了 Feature Branch 方法。
我想要实现的是启动与包含已更改文件的目录关联的管道部分。所以我的 .gitlab-ci.yml 看起来像:
job1:
stage: build
script:
- ...
only:
changes:
- myparentdir/dir1/*
job2:
stage: build
script:
- ...
only:
changes:
- myparentdir/dir2/*
- 从 develop 创建一个新分支
- 在此分支上提交 myparentdir/dir2/test.txt
- 管道启动每个构建作业!
GitLab 似乎在使用新功能分支时将每个文件都视为已更改。
您知道任何解决方法吗?
Gitlab ci 始终将新分支的 changes
视为 true。原因是他们无法确定ci要比较的对象。
what this means is that for the first pipeline of a new branch, everything will be built.
有关详细信息,请参阅 feature request。
但是,merge requests - that runs a stage on merge requests. Here 有一个名为 Pipelines 的相当新的功能,它是使用 merge_requests 实现 changes
的功能请求。它已合并,但我不确定它是否已经发布。 (里程碑是 11.9 - 下一个版本)
在此期间你可以自己实施 - 你可以添加一个阶段来比较变化(git diff)并确定cides是否运行下一阶段:
.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