2

我们在同一个存储库中有 12 个不同的项目,并且为每个项目运行不同的工作。

我想知道如何仅在特定文件夹中发生更改时触发作业,因为每次推送都运行所有 12 个需要很长时间才能完成。

4

1 回答 1

3

好吧,我已经破解了一个适合我们的解决方案。

首先,添加一个Execute Shell构建步骤:

#!/bin/bash
export DIRS="api objects"
DIFF=`git diff --name-only develop`

echo "export RUN_TEST=0" > "$WORKSPACE/RUN_TEST"

for DIR in $DIRS; do
  for LINE in $DIFF; do
    # Is this file inside an interesting directory?
    echo $LINE | grep -e "^$DIR/"
    # Checking if it is inside
    if [ $? -eq 0 ]; then
      echo "export RUN_TEST=1" > "$WORKSPACE/RUN_TEST"
    fi
  done
done

这里:

  • api并且objects是我要触发此作业的 2 个目录
  • develop是我们使用的主要分支,所以我特别想知道我的目录与该分支相比如何
  • 如果我应该或不运行它,我会创建一个文件$WORKSPACE/RUN_TEST来设置变量

然后在耗时的构建步骤中添加:

#!/bin/sh
. "$WORKSPACE/RUN_TEST"

if [ $RUN_TEST -eq 1 ]; then
  # Time consuming code here
fi

这样,作业被触发,但运行速度与未触发一样快。


现在我将其修改为:

#!/bin/bash
export DIRS="api objects"
DIFF=`git diff --name-only origin/develop`

RUN_TEST=111

for DIR in $DIRS; do
  for LINE in $DIFF; do
    # Is this file inside an interesting directory?
    echo $LINE | grep -e "^$DIR/"
    # Checking if it is inside
    if [ $? -eq 0 ]; then
      RUN_TEST=0
    fi
  done
done

echo "RUN_TEST=$RUN_TEST"
echo "return $RUN_TEST" > "$WORKSPACE/RUN_TEST"
exit $RUN_TEST

并设置Exit code to set build unstable111所有构建步骤。然后,在我执行的所有以下构建步骤中:

#!/bin/bash
# Exit on any error
set -euo pipefail
. "$WORKSPACE/RUN_TEST"

# Rest of build step
于 2018-05-23T14:54:45.047 回答