如何使用 GitLab CI 确保文件已更改?

Kal*_*mar 5 gitlab gitlab-ci

我在 GitLab 上有一个小项目,我CHANGELOG.md在其中保存了一个文件。我想在每次合并时更新它以掌握,但有时我会忘记。我正在使用 GitLab CI,因此我想使用它来检查更改日志文件是否已更改。我该怎么做?

小智 6

这是我经过多次尝试后的解决方案。希望能帮助到你。基本上,我只想在有新的合并请求时触发该作业。使用 git,我可以获得合并请求中更改的文件列表,如果我要跟踪的文件位于该列表中,则作业成功。如果找不到该文件,则作业失败

update_file_check:
  stage: test
  script:
    - git fetch
    - FILES_CHANGED=$(git diff --name-only $CI_MERGE_REQUEST_DIFF_BASE_SHA...HEAD)
    - |+
      for i in $FILES_CHANGED
      do
        if [[ "$i" == "<filename>" ]]
        then
          exit 0
        fi
      done
      exit 1
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
Run Code Online (Sandbox Code Playgroud)


vse*_*rgi 1

这是可能的,并且有多种方法可以实现它。我建议使用 gitlab 所在的同一主机作为带有 shell 执行器的运行程序。基本上,您正在打开一种方式,以便在这个 gitlab 运行程序中运行一些命令。现在,互联网上甚至gitlab的官方文档中都有很多资源,但总而言之,您需要遵循以下流程:

1..gitlab-ci.yml

该文件应该位于项目的根目录中。运行 CI CD 任务时,gitlab 会读取并解释它。它可以像你希望的那样复杂,但在我看来,我喜欢让事情变得简单,所以我只会在主分支更改时调用脚本。

内容可能是这样的:

Check Changelog:
  script:
    - sh .gitlab/CI-CD-Script.sh       ## Execute in the gitlab runner the script.
  only:
    - master                           ## It will run only when master branch changes.
Run Code Online (Sandbox Code Playgroud)

2..gitlab/CI-CD-Script.sh

如前所述,我更喜欢调用一个脚本来管理所有 CI CD 的逻辑。但正如前面所说,有多种方法可以达到相同的结果。下面,您可以通过以下方式构建脚本:

#!/bin/bash
# Download the original changelog from master branch.
wget http://<yourgitlabAddress>/<pathToProject>/-/raw/master/CHANGELOG.md /tmp/CHANGELOG.md

if cmp -s /tmp/CHANGELOG.md CHANGELOG.md; then       ## Checking if files are different.
    echo "Changelog not changed"
    exit 1                                           ## Job will fail
else
    echo "Changelog changed"
    exit 0                                           ## Job will pass
fi

Run Code Online (Sandbox Code Playgroud)

到目前为止,这就是全部了。我无法在您的环境中尝试,希望对您有所帮助。