При ближайшем рассмотрении способ есть. Но прежде чем я пришел к этому, я попробовал пару идей. Сначала я думал, что могу смонтировать каталог с исходным кодом в контейнер и запустить один из файлов проекта (скрипт), указав опцию --entrypoint
, но сервисы запускаются до git clone
. Тогда я подумал, что, возможно, я могу передать команду контейнеру, но нет, это невозможно. Третий вариант, который я рассматривал, это передача команды через переменную окружения какому-то исполняемому файлу, который идет с образом, предположительно оболочке. Но оболочки могут указывать путь к сценарию, а не к команде (переменная 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
Контейнер заданий запускается со следующими параметрами (см. Initialize containers > Starting job containeir
):
...
--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. С учетом сказанного я собираюсь запускать внешние и внутренние тесты в отдельных заданиях, что упростит задачу и может устранить необходимость запускать контейнеры вручную.
person
x-yuri
schedule
09.08.2020