如何使用 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 代理变量