如何使用 gitlab 设置 yaml 文件以在特定文件更改时进行部署?

Posted

技术标签:

【中文标题】如何使用 gitlab 设置 yaml 文件以在特定文件更改时进行部署?【英文标题】:How to set up yaml file with gitlab to deploy when a specific file changes? 【发布时间】:2021-11-21 20:26:48 【问题描述】:

我正在尝试为 GitLab 设置一个 YAML 文件,该文件仅在特定文件夹发生更改时才会部署到我的 QA 服务器。

这是我所拥有的,但它不想工作。语法没有记录任何错误。

deploy to qa:
  script: **aws scripts**
  only:
    refs:
      - master
    changes:
      - directory/*
  stage: deploy
  environment:
    name: qa
    url: **aws bucket url**

问题似乎出在这部分,其余部分没有它。文档讨论了使用规则来代替 when only 和 changes 一起使用,但我也无法让它发挥作用。

only:
    refs:
      - master
    changes:
      - directory/*

【问题讨论】:

【参考方案1】:

您遇到的问题是“唯一”规则的 refs 部分。根据 GitLab's documentation 关于“更改”:“如果您使用除分支、external_pull_requests 或 merge_requests 之外的引用,更改无法确定给定文件是新文件还是旧文件,并且始终返回 true。”由于您使用master 作为您的参考,因此您遇到了这个问题。

正如您所确定的,正确的答案是改用rules 关键字。等效的rules 设置应如下所示:

deploy to qa:
  script: **aws scripts**
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      changes:
        - directory/*
      when: on_success
    - when: never
  stage: deploy
  environment:
    name: qa
    url: **aws bucket url**

本质上,规则是说“如果您正在构建的提交存在于您的默认分支上(在您的情况下为master),并且您在directory/* 中有更改,然后在之前的作业成功时运行此作业. ELSE, 永远不要运行这个工作”

注意:从技术上讲,如果没有匹配的子句,when: never 是隐含的,但我更喜欢包含它,因为它明确说明了您对下一个必须阅读您的 CI/CD 文件的人的期望。

【讨论】:

以上是关于如何使用 gitlab 设置 yaml 文件以在特定文件更改时进行部署?的主要内容,如果未能解决你的问题,请参考以下文章

聊聊如何将gitlab ci的环境变量透传给k8s deployment.yaml

如何将 gitlab ci/cd 变量传递给 kubernetes(AKS) deployment.yaml

如何使用 JAVA_OPTS 在 gitlab-ci.yaml 中设置 Gradle 代理变量

GitLab CI 的多行 YAML 字符串 (.gitlab-ci.yml)

发布单个文件以在 GitLab 上下载

2022-02-13:k8s安装gitlab,yaml如何写?