Как я могу запустить команду в контейнерах службы действий github?

Я использую minio для создания сервера хранения объектов, похожего на s3, и хочу протестировать некоторый код на этом сервере во время моего процесса ci cd.
Используя действия Github, я попытался добавить 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 crate service [OPTIONS] IMAGE_NAME, но мне также нужно иметь возможность запускать docker create service [OPTIONS] IMAGE_NAME COMMAND [ARGS]

Если это еще не реализовано, какие еще варианты я могу попробовать?

Спасибо,
или


person Or Chen    schedule 25.03.2020    source источник
comment
Я ответил на похожий вопрос если это может помочь.   -  person masseyb    schedule 03.10.2020


Ответы (2)


Из беглого взгляда на документацию Github Actions это еще не поддерживается. Вы можете легко обойти это, используя образ Minio из Bitnami .

Я считаю, что что-то вроде этого должно работать:

    services:
  minio:
    image: bitnami/minio:latest
    env:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    ports:
      - 9000:9000
    options: --name minio-server
person Aristos Diamadis    schedule 04.04.2020

При ближайшем рассмотрении способ есть. Но прежде чем я пришел к этому, я попробовал пару идей. Сначала я думал, что могу смонтировать каталог с исходным кодом в контейнер и запустить один из файлов проекта (скрипт), указав опцию --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