Примечание. В GitHub Enterprise Server в настоящее время не поддерживаются средства выполнения тестов, размещенные в GitHub. Дополнительные сведения о планируемой поддержке в будущем см. в GitHub public roadmap.
Введение
В этом руководстве вы узнаете об основных компонентах, необходимых для создания и использования упакованного действия контейнера Docker. Чтобы была возможность сосредоточить это руководство на компонентах, необходимых для упаковки действия, функциональные возможности кода действия минимальны. Действие выводит Hello World в журналах или Hello [who-to-greet] при указании настраиваемого имени.
Завершив этот проект, вы должны понять, как создать собственное действие контейнера Docker и протестировать его в рабочем процессе.
В локальных средствах выполнения должна использоваться операционная система Linux и должен быть установлен Docker для выполнения действий с контейнерами Docker. Дополнительные сведения о требованиях локальных средств выполнения тестов см. в разделе О самостоятельно размещенных средствах выполнения.
Предупреждение. Во время создания рабочих процессов и действий необходимо учитывать, будет ли код использовать непроверенные входные данные от возможных злоумышленников. Некоторые контексты следует считать непроверенными, так как злоумышленники могут вставить собственное вредоносное содержимое. Дополнительные сведения см. в разделе Защита системы безопасности для GitHub Actions.
Предварительные требования
Возможно, полезно иметь базовое представление о переменных среды GitHub Actions и файловой системе контейнера Docker.
Перед началом работы необходимо создать репозиторий GitHub.
-
Создайте репозиторий в экземпляр GitHub Enterprise Server. Вы можете выбрать любое имя репозитория или использовать hello-world-docker-action, как в этом примере. Дополнительные сведения см. в разделе Создание репозитория.
-
Клонируйте репозиторий на ваш компьютер. Дополнительные сведения см. в разделе Клонирование репозитория.
-
В терминале измените каталоги на новый репозиторий.
Shell cd hello-world-docker-action
Создание файла Dockerfile
В новом каталоге hello-world-docker-action
создайте файл Dockerfile
. Убедитесь, что имя файла имеет прописную букву (используйте прописную букву D
, но не прописную букву f
), если у вас возникли проблемы. Дополнительные сведения см. в разделе Поддержка Dockerfile для GitHub Actions.
Dockerfile
# Container image that runs your code
FROM alpine:3.10
# Copies your code file from your action repository to the filesystem path `/` of the container
COPY entrypoint.sh /entrypoint.sh
# Code file to execute when the docker container starts up (`entrypoint.sh`)
ENTRYPOINT ["/entrypoint.sh"]
Создание файла метаданных действия
Создайте новый файл action.yml
в каталоге hello-world-docker-action
. Дополнительные сведения см. в разделе Синтаксис метаданных для GitHub Actions.
action.yml
# action.yml
name: 'Hello World'
description: 'Greet someone and record the time'
inputs:
who-to-greet: # id of input
description: 'Who to greet'
required: true
default: 'World'
outputs:
time: # id of output
description: 'The time we greeted you'
runs:
using: 'docker'
image: 'Dockerfile'
args:
- ${{ inputs.who-to-greet }}
Эти метаданные определяют один входной параметр who-to-greet
и один выходной параметр time
. Чтобы передать входные данные в контейнер Docker, необходимо объявить входные данные с помощью inputs
и передать их в ключевом слове args
. Все, что вы включаете в контейнер, передается в контейнер args
, но для лучшего обнаружения для пользователей вашего действия мы рекомендуем использовать входные данные.
GitHub создаст образ из образа Dockerfile
и выполнит команды в новом контейнере с помощью этого образа.
Написание кода действия
Вы можете выбрать любой базовый образ Docker и, следовательно, любой язык для своего действия. В указанном ниже примере скрипта оболочки используется входная переменная who-to-greet
для печати Hello [who-to-greet] в файле журнала.
Затем скрипт получает текущее время и задает его в качестве выходной переменной, которая может использовать действия, выполняемые позже в задании. Чтобы GitHub распознал выходные переменные, необходимо использовать команду рабочего процесса в определенном синтаксисе: echo "::set-output name=<output name>::<value>"
. Дополнительные сведения см. в разделе Команды рабочего процесса для GitHub Actions.
-
Создайте файл
entrypoint.sh
в новом каталогеhello-world-docker-action
. -
Добавьте в файл
entrypoint.sh
указанный ниже код.entrypoint.sh
Shell #!/bin/sh -l echo "Hello $1" time=$(date) echo "::set-output name=time::$time"
Если
entrypoint.sh
выполняется без ошибок, состояние действия имеет значениеsuccess
. Вы также можете явно задать коды выхода в коде действия, чтобы предоставить состояние действия. Дополнительные сведения см. в разделе Настройка кодов выхода для действий. -
entrypoint.sh
Сделайте файл исполняемым. Git предоставляет способ явного изменения режима разрешений для файла, чтобы он не сбрасывал каждый раз при наличии клона или вилки.Shell $ git add entrypoint.sh $ git update-index --chmod=+x entrypoint.sh
-
При необходимости, чтобы проверка режим разрешений файла в индексе Git, выполните следующую команду.
Shell $ git ls-files --stage entrypoint.sh
Результат, подобный
100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 entrypoint.sh
этому, означает, что файл имеет разрешение на исполняемый файл. В этом примере755
обозначает разрешение исполняемого файла.
Создание файла README
Чтобы сообщить людям, как применить свое действие, можно создать файл README. Файл README является наиболее полезным, если вы планируете поделиться своим действием публично, но также является отличным способом напомнить вам или вашей команде, как использовать действие.
В каталоге hello-world-docker-action
создайте файл README.md
, указывающий следующие сведения:
- подробное описание того, что делает действие;
- обязательные входные и выходные аргументы;
- необязательные входные и выходные аргументы;
- секреты, используемые действием;
- переменные среды, используемые действием;
- пример использования действия в рабочем процессе.
README.md
# Hello world docker action
This action prints "Hello World" or "Hello" + the name of a person to greet to the log.
## Inputs
## `who-to-greet`
**Required** The name of the person to greet. Default `"World"`.
## Outputs
## `time`
The time we greeted you.
## Example usage
uses: actions/hello-world-docker-action@v1
with:
who-to-greet: 'Mona the Octocat'
Фиксация действия, добавление тегов к нему и его отправка в GitHub Enterprise Server
В терминале зафиксируйте файлы action.yml
, entrypoint.sh
, Dockerfile
и README.md
.
Рекомендуется также добавить тег версии для выпусков действия. Дополнительные сведения о настройке версий действия см. в разделе Сведения о настраиваемых действиях.
git add action.yml entrypoint.sh Dockerfile README.md
git commit -m "My first action is ready"
git tag -a -m "My first action release" v1
git push --follow-tags
Тестирование действия в рабочем процессе
Теперь вы готовы протестировать действие в рабочем процессе.
— если действие находится в частном репозитории, действие может использоваться только в рабочих процессах в том же репозитории. — если действие находится во внутреннем репозитории, вы можете контролировать, кто может получить к нему доступ. Дополнительные сведения см. в разделе Управление параметрами GitHub Actions для репозитория.
- Общедоступные действия могут использоваться рабочими процессами в любом репозитории.
Примечание. GitHub Actions в экземпляр GitHub Enterprise Server может иметь ограниченный доступ к действиям в GitHub.com или GitHub Marketplace. Дополнительные сведения см. в разделе Управление доступом к действиям с сайта GitHub.com и обратитесь к администратору сайта GitHub Enterprise.
Пример использования общедоступного действия
В указанном ниже коде рабочего процесса используется готовое действие hello world в общедоступном репозитории actions/hello-world-docker-action
. Скопируйте указанный ниже пример кода рабочего процесса в файл .github/workflows/main.yml
, но замените actions/hello-world-docker-action
именем репозитория и действия. Вы также можете заменить именем входные данные who-to-greet
.
.github/workflows/main.yml
on: [push]
jobs:
hello_world_job:
runs-on: ubuntu-latest
name: A job to say hello
steps:
- name: Hello world action step
id: hello
uses: actions/hello-world-docker-action@v1
with:
who-to-greet: 'Mona the Octocat'
# Use the output from the `hello` step
- name: Get the output time
run: echo "The time was ${{ steps.hello.outputs.time }}"
Пример применения частного действия
Скопируйте указанный ниже пример кода рабочего процесса в файл .github/workflows/main.yml
в репозитории действия. Вы также можете заменить именем входные данные who-to-greet
.
.github/workflows/main.yml
on: [push]
jobs:
hello_world_job:
runs-on: ubuntu-latest
name: A job to say hello
steps:
# To use this repository's private action,
# you must check out the repository
- name: Checkout
uses: actions/checkout@v3
- name: Hello world action step
uses: ./ # Uses an action in the root directory
id: hello
with:
who-to-greet: 'Mona the Octocat'
# Use the output from the `hello` step
- name: Get the output time
run: echo "The time was ${{ steps.hello.outputs.time }}"
В репозитории перейдите на вкладку Действия и выберите последний запуск рабочего процесса. В разделе Задания или в графе визуализации щелкните Задание для отображения приветствия.
Щелкните Шаг действия Hello world, и вы увидите "Hello Mona the Octocat" или имя, которое вы использовали для who-to-greet
входных данных, напечатанных в журнале. Щелкните Получить выходное время , чтобы просмотреть метку времени.