仔细检查后,有一种方法。但在找到它之前,我尝试了几个想法。
首先,我认为可以将源代码目录挂载到容器中,并通过指定
--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. 话虽如此,我将在不同的作业中运行前端和后端测试,
这应该简化事情并可能消除手动启动容器的需要。