如何在 GitHub Action 服务容器中运行命令?

20

我正在使用Minio创建类似S3的对象存储服务器,希望能在我的CI/CD过程中对该服务器进行一些代码测试。
使用Github Actions,我尝试将Minio添加为工作流文件中的服务,但是由于Minio需要一个命令和一些参数,因此无法通过这种机制来运行它。
以下是我ci.yml文件中与此相关配置的部分:

minio-container:
runs-on: ubuntu-latest
container: python:3.8.2

services:
  minio:
    image: minio/minio:latest
    ports:
      - 9000:9000
    env:
      MINIO_ACCESS_KEY: XXXX
      MINIO_SECRET_KEY: XXXXX

我稍微读了一下,发现在幕后 GitHub 运行了 docker create service [OPTIONS] IMAGE_NAME,但我还需要能够运行 docker create service [OPTIONS] IMAGE_NAME COMMAND [ARGS]

如果这个功能尚未实现,我可以尝试哪些其他选项?


1
如果有帮助的话,我曾经回答过类似的问题 - masseyb
GH社区讨论此主题:https://github.com/orgs/community/discussions/52675 - teuber789
2个回答

1

从Github Actions的文档来看,目前还不支持此功能。您可以通过使用Bitnami的Minio镜像轻松解决此问题。

我认为以下内容应该有效:

    services:
  minio:
    image: bitnami/minio:latest
    env:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    ports:
      - 9000:9000
    options: --name minio-server

最好使用MinIO官方发布的镜像quay.io/minio/minio或minio/minio-不支持Bitnami镜像,这是MinIO项目的建议。 - Harshavardhana
https://github.com/bitnami/containers/tree/main/bitnami/minio - William Desportes
2
这个回答没有解决 OP 的总体问题。OP 确实想要使用 minio,但最重要的是,OP 想知道是否可以在 GHA 中向服务容器传递命令和参数。这个回答处理得不好。 - teuber789

0
仔细检查后,有一种方法。但在找到它之前,我尝试了几个想法。 首先,我认为可以将源代码目录挂载到容器中,并通过指定--entrypoint选项运行其中一个项目文件(脚本),但服务在git clone之前启动。 然后我想也许可以向容器传递命令,但不可能。 我考虑的第三个选项是通过环境变量将命令传递给某个随镜像提供的可执行文件,假设是shell。 但是shell只能接受脚本路径,而不是命令(ENV变量)。 然后我想,“让服务死掉”,我只需要在克隆存储库后重新启动容器即可。 但与“手动创建容器”相比,这没有任何优势:

这就是我所做的:.github/workflows/django.yml

...
jobs:
    build:
        runs-on: ubuntu-latest
        container: python:3.5-alpine3.12
        steps:
            - uses: actions/checkout@v2
            - run: apk add expect && unbuffer ./create-cypress-container.sh
...

create-cypress-container.sh:

#!/bin/sh -eux
apk add docker jq
network=$(docker inspect --format '{{json .NetworkSettings.Networks}}' `hostname` \
  | jq -r 'keys[0]')
docker pull -q cypress/base:12
docker run \
  -v /home/runner/work:/__w \
  -w "$GITHUB_WORKSPACE" \
  --name cypress \
  --network "$network" \
  -d \
  cypress/base:12 sh -xc 'ls && whoami && pwd'
sleep 10
docker ps
docker logs cypress

作业容器使用以下选项启动(参见初始化容器 > 启动作业容器):
...
--workdir /__w/PROJECT_NAME/PROJECT_NAME
-v "/home/runner/work":"/__w"
...

以及环境变量:

...
GITHUB_WORKSPACE='/__w/PROJECT_NAME/PROJECT_NAME'
...

/__w/PROJECT_NAME/PROJECT_NAME 是您的代码库克隆的位置。

P.S. 话虽如此,我将在不同的作业中运行前端和后端测试, 这应该简化事情并可能消除手动启动容器的需要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接