ci(docker): 修 workflow 非法表达式, secrets 改经 job env 透传

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:
sun
2026-09-28 23:30:57 +08:00
parent ecc1d94fbc
commit feba9d7b35
+11 -5
View File
@@ -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}}