ci(docker): 修 workflow 非法表达式, secrets 改经 job env 透传
Docker Publish / build-and-push (push) Canceled after 0s
Docker Publish / build-and-push (push) Canceled after 0s
GitHub Actions 拒绝加载本 workflow, 报:
Invalid workflow file: .github/workflows/docker.yml#L1
(Line: 49, Col: 13): Unrecognized named-value: 'secrets'.
Located at position 40 within expression:
github.event_name != 'pull_request' && secrets.DOCKERHUB_USERNAME != ''
原因: secrets 上下文不允许在 step 的 if: 表达式里引用(GitHub 沙箱限制)。
secrets 只在 with: / env: / run: 等位置可用, if: 里必须走 env 中转。
修复:
- 新增 job 级 env: DOCKERHUB_USERNAME / DOCKERHUB_TOKEN (值来自 secrets)
- DockerHub login step: if 改 env.DOCKERHUB_USERNAME != ''
- DockerHub login step: username/password 改读 env.*
- metadata-action images: DockerHub 那行改 env.DOCKERHUB_USERNAME,
enable 判断同样改 env 上下文
副作用: 无。secret 未配置时行为不变(跳过 login + 不渲染 DockerHub image)。
已用 js-yaml 校验 YAML 结构合法, 并扫描确认全部 step 的 if: 不含 secrets 引用。
This commit is contained in:
@@ -25,6 +25,11 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
# secrets 不能在 step 的 if: 表达式里直接引用(GitHub 沙箱限制),
|
||||
# 必须先经 job 级 env 透传,再用 env.XXX != '' 判断。
|
||||
env:
|
||||
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
@@ -46,11 +51,11 @@ jobs:
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Login to DockerHub
|
||||
if: github.event_name != 'pull_request' && secrets.DOCKERHUB_USERNAME != ''
|
||||
if: env.DOCKERHUB_USERNAME != ''
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
username: ${{ env.DOCKERHUB_USERNAME }}
|
||||
password: ${{ env.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Extract version from git
|
||||
id: version
|
||||
@@ -63,10 +68,11 @@ jobs:
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
# 多个 image base:metadata-action 会为每个 base 渲染完整 tag 列表。
|
||||
# DockerHub image 用 enable 保护:username secret 没设时不渲染,避免非法 image 名。
|
||||
# DockerHub image 用 enable 保护:username 未配置(secret 未设)时不渲染,
|
||||
# 避免生成 "docker.io//ttshub" 这种非法 image 名导致 metadata 步骤报错。
|
||||
images: |
|
||||
name=${{ env.REGISTRY }}/${{ github.repository }}
|
||||
name=docker.io/${{ secrets.DOCKERHUB_USERNAME }}/ttshub,enable=${{ secrets.DOCKERHUB_USERNAME != '' }}
|
||||
name=docker.io/${{ env.DOCKERHUB_USERNAME }}/ttshub,enable=${{ env.DOCKERHUB_USERNAME != '' }}
|
||||
tags: |
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
|
||||
Reference in New Issue
Block a user