Github Actions 动态容器名称

Str*_*ter 14 continuous-integration docker github-actions

概括:

Github Actions 允许使用 Docker 容器来运行作业,但它似乎不允许为此容器映像提供动态值(使用环境变量)。

这有效(不是所需的解决方案):

jobs:
  pytest-test:
    container:
      image: ghcr.io/ashrafgt/test:latest    ...
Run Code Online (Sandbox Code Playgroud)

这不起作用(所需的解决方案):

jobs:
  pytest-test:
    container:
      # env variables defined at the start of the workflow
      image: ${{ env.REGISTRY_NAME }}/test:${{ env.IMAGE_TAG }} 
    ...
Run Code Online (Sandbox Code Playgroud)

给出这个错误:

Invalid workflow file : .github/workflows/workflow.yaml
The workflow is not valid. Unrecognized named-value: 'env'. Located at position 1 within expression: env.REGISTRY_NAME
Run Code Online (Sandbox Code Playgroud)

除了执行 a 之外,还有其他方法可以做到这一点吗run: docker run ...

完整示例:

在此示例中,我尝试构建并推送 Docker 映像(用当前提交 SHA 标记),然后使用相同的映像来运行单元测试:

name: Main CI Pipeline

on: [push]

env:
  REGISTRY_NAME: ghcr.io/${{ github.repository_owner }}
  REGISTRY_USERNAME: ${{ github.actor }}
  REGISTRY_PASSWORD: ${{ secrets.GITHUB_TOKEN }}
  IMAGE_TAG: ${{ github.sha }}

jobs:

  docker-build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v2
      - uses: docker/setup-buildx-action@v1
      - uses: docker/login-action@v1
        with:
          registry: ${{ env.REGISTRY_NAME }}
          username: ${{ env.REGISTRY_USERNAME }}
          password: ${{ env.REGISTRY_PASSWORD }}
      - uses: docker/build-push-action@v2
        with:
          tags: ${{ env.REGISTRY_NAME }}/test:${{ env.IMAGE_TAG }}
          push: true

  pytest-test:
    needs: docker-build
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: read
    container:
      image: ${{ env.REGISTRY_NAME }}/test:${{ env.IMAGE_TAG }}
    steps:
      - uses: actions/checkout@v2
      - run: pytest
Run Code Online (Sandbox Code Playgroud)

请在此处找到完整的存储库。

完整的错误消息是:

Invalid workflow file : .github/workflows/workflow.yaml#L38
The workflow is not valid. .github/workflows/workflow.yaml (Line: 38, Col: 14): Unrecognized named-value: 'env'. Located at position 1 within expression: env.REGISTRY_NAME
Run Code Online (Sandbox Code Playgroud)

请在此处找到运行的 Github 操作。

修复尝试:

  1. 仅使用container而不是container.image

    jobs:
      pytest-test:
        container: ${{ env.REGISTRY_NAME }}/test:${{ env.IMAGE_TAG }} 
        ...
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用docker://单步语法:

    jobs:
      pytest-test:
        steps:
          - uses: docker://${{ env.REGISTRY_NAME }}/test:${{ env.IMAGE_TAG }}
            entrypoint: pytest
        ...
    
    Run Code Online (Sandbox Code Playgroud)

两次修复尝试均失败,并出现与原始语法相同的错误。

Jos*_*elm 1

我也很惊讶地发现这不起作用。然而,我偶然发现了这篇博文:https://aschmelyun.com/blog/using-docker-run-inside-of-github-actions/

它使用预定义的 github 操作来访问docker run. 因此,您可以将文件编辑为如下所示:

    pytest-test:
        needs: docker-build
        runs-on: ubuntu-latest
        steps:
          - name: Check out the repo
            uses: actions/checkout@v2
          - name: Run Pytest inside Docker
            uses: addnab/docker-run-action@v3
            with:
                image: ${{ env.REGISTRY_NAME }}/test:${{ env.IMAGE_TAG }}
                options: -v ${{ github.workspace }}:/your_dockerfile_workdir

                registry: ${{ env.REGISTRY_NAME }}
                username: ${{ env.REGISTRY_USERNAME }}
                password: ${{ env.REGISTRY_PASSWORD }}
                run: pytest
Run Code Online (Sandbox Code Playgroud)

由于某种原因,在此操作中with.image确实接受变量