我有一个 GitHub 项目,我想使用 Docker 构建并通过操作推送到 GHCR。
我希望每当有拉取请求时就构建它,以验证构建是否有效。但是,我只希望当通过推送到
main
分支或标记的版本来触发操作时将图像推送到 GHCR。
这是我的
build-and-push.yml
:
name: Build
on:
push:
branches: ['main']
tags: ['v*']
pull_request:
branches: ['main']
env:
# ...
DO_PUSH: ${{ github.ref == 'refs/heads/main' || github.event_name == 'release' }}
jobs:
build-and-push:
# ...
steps:
-
name: Checkout repository
uses: actions/checkout@v3
-
name: Log in to GHCR
if: env.DO_PUSH == true
uses: docker/login-action@v2
# ...
-
name: Get Docker metadata
if: env.DO_PUSH == true
id: meta
uses: docker/metadata-action@v4
# ...
-
name: Only build
if: env.DO_PUSH != true
uses: docker/build-push-action@v4
with:
context: .
push: false
-
name: Build and push
if: env.DO_PUSH == true
uses: docker/build-push-action@v4
with:
context: .
push: true
# ...
所以,这是一个非常标准的构建和推送工作流程,有一个关键的区别。
env.DO_PUSH
定义为 github.ref == 'refs/heads/main' || github.event_name == 'release'
,如果 Action 由 true
分支或发布触发,则应为 main
,如果由 PR 触发,则应为 false
。
通过添加
run: echo ${{ env.DO_PUSH }}
步骤进行一些基本调试,确认该值已设置为我想要的值。但是,标有条件 if: env.DO_PUSH == true
的步骤永远不会运行,标有 if: env.DO_PUSH != true
的“仅构建”步骤始终运行。
例如,从推送到
main
:
docker/build-push-action@v4
具有 push
属性,您可以这样设置:
push: ${{ github.event_name != 'pull_request' }}