GitHub action с Go
В этой статье вы узнаете, как создать собственное GitHub actions в Go. GitHub предоставляет нам два способа создания пользовательских действий GitHub: вы можете создавать действия с помощью JavaScript 💩 или использовать Docker 🐳. Я собираюсь использовать Docker + Go для создания пользовательского действия GitHub, при этом я укажу на некоторые важные вещи, на которые следует обратить внимание.
Написание кода Go
А пока давайте упростим код и просто напечатаем сообщение. Создайте файл main.go
и добавьте в него следующий код.
package main
import "fmt"
func main() {
fmt.Println("Hello World From GitHub Action")
}
Пишем Dockerfile
Нет необходимости делать что-то конкретное для Dockerfile
, все, что вам нужно, это обычный образ докера, который запускает код go. Создайте новый Dockerfile
и добавьте в него следующий код.
FROM golang:1.18.3-alpine3.16
WORKDIR /app
COPY ./ ./
RUN go build -o /bin/app main.go
ENTRYPOINT ["app"]
Вы могли заметить, что (RUN go build -o /bin/app main.go
) при построении кода go исполняемый файл сохраняется внутри каталога bin
. Это не обязательно, вы можете хранить исполняемый файл где угодно.
Пишем action.yml
action.yml
это файл, который сообщает GitHub: «Эй, GitHub! Этот репозиторий содержит действие GitHub». Вы можете определить множество метаданных, связанных с действием в этом файле. Я настоятельно рекомендую прочитать эту документацию, если вы разрабатываете GitHub Action 👉 Синтаксис метаданных для GitHub Actions.
Создайте новый файл action.yml
и добавьте в него следующий код.
name: "github-action-go"
description: "An example of building github actions with Go"
runs:
using: docker
image: Dockerfile
В разделе runs
вы можете указать GitHub для запуска этого действия с помощью Docker.
Публикация действия
Теперь все готово, создайте новый репозиторий и загрузите код. Прежде чем вы сможете использовать действие, вам необходимо опубликовать его, создав релиз на GitHub. В репозитории нажмите «Создать новый релиз».
Вам нужно будет создать тег перед выпуском, создать тег с именем v1
(вы можете назвать его как хотите, но настоятельно рекомендуется сохранять правильные версии).
Дайте релизу название и нажмите «Опубликовать релиз».
Использование действия
После создания релиза вы можете начать использовать действие в любых репозиториях github, пример файла рабочего процесса будет выглядеть примерно так:
jobs:
github-action-go:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: gurleensethi/github-action-go@v1 # 👈 using custom action
Вы также можете использовать свое пользовательское действие в том же репозитории, что и само действие.
jobs:
github-action-go:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./ # 👈 using action from the repository itself.
Как GitHub запускает Docker
Поскольку действие должно выполняться в качестве контейнера докеров, GitHub использует команду docker run
для его запуска, она предоставляет набор аргументов. Осмелитесь увидеть гигантскую команду.
docker run --name e225889822a53557c5068f1d4400b154c_a1b5de --label 72882e
--workdir /github/workspace --rm -e HOME -e GITHUB_JOB -e GITHUB_REF -e GITHUB_SHA
-e GITHUB_REPOSITORY -e GITHUB_REPOSITORY_OWNER -e GITHUB_RUN_ID
-e GITHUB_RUN_NUMBER -e GITHUB_RETENTION_DAYS -e GITHUB_RUN_ATTEMPT
-e GITHUB_ACTOR -e GITHUB_WORKFLOW -e GITHUB_HEAD_REF -e GITHUB_BASE_REF
-e GITHUB_EVENT_NAME -e GITHUB_SERVER_URL -e GITHUB_API_URL -e GITHUB_GRAPHQL_URL
-e GITHUB_REF_NAME -e GITHUB_REF_PROTECTED -e GITHUB_REF_TYPE -e GITHUB_WORKSPACE
-e GITHUB_ACTION -e GITHUB_EVENT_PATH -e GITHUB_ACTION_REPOSITORY
-e GITHUB_ACTION_REF -e GITHUB_PATH -e GITHUB_ENV -e GITHUB_STEP_SUMMARY
-e RUNNER_OS -e RUNNER_ARCH -e RUNNER_NAME -e RUNNER_TOOL_CACHE -e RUNNER_TEMP
-e RUNNER_WORKSPACE -e ACTIONS_RUNTIME_URL -e ACTIONS_RUNTIME_TOKEN
-e ACTIONS_CACHE_URL -e GITHUB_ACTIONS=true -e CI=true
-v "/var/run/docker.sock":"/var/run/docker.sock"
-v "/home/runner/work/_temp/_github_home":"/github/home"
-v "/home/runner/work/_temp/_github_workflow":"/github/workflow"
-v "/home/runner/work/_temp/_runner_file_commands":"/github/file_commands"
-v "/home/runner/work/github-action-go/github-action-go":"/github/workspace" 72882e:225889822a53557c5068f1d4400b154c
Здесь есть куча хороших вещей, он устанавливает рабочий каталог --workdir /github/workspace
, передает кучу переменных среды, используя флаг -e
, и прикрепляет много томов. Внимательно прочтите эту команду, она может помочь вам в том, что вы разрабатываете.
Ввод действия и аргументы контейнера
Действия GitHub позволяют указать входные данные, которые пользователь действия может передать при определении файла рабочего процесса.
Код этого раздела доступен в ветке репозитория input_args.
Давайте реорганизуем код, чтобы он принимал сообщение от пользователя, а не закодировал его. Обновите код main.go
, чтобы распечатать все аргументы, переданные программе.
package main
import (
"fmt"
"strings"
"os"
)
func main() {
fmt.Println(strings.Join(os.Args[1:], " "))
}
Если вы запустите go run main.go hello world
, вы получите результат hello world
.
Обновите action.yml
, чтобы принимать ввод от пользователя, назовем его message
.
name: "github-action-go"
description: "An example of building github actions with Go"
inputs:
message:
required: true
runs:
using: docker
image: Dockerfile
Как видите, я добавил новый раздел inputs
, в котором я определил ввод с именем message
.
Этот ввод необходимо передать в качестве аргументов программе go, вы можете сделать это, используя параметр args
в разделе run
. Любые указанные вами аргументы args
будут переданы команде docker run
при выполнении действия.
name: "github-action-go"
description: "An example of building github actions with Go"
inputs:
message:
required: true
runs:
using: docker
image: Dockerfile
args:
- ${{ inputs.message }}
Обновите файл рабочего потока, чтобы использовать message
.
jobs:
github-action-go:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: gurleensethi/github-action-go@v1
with:
message: Hello World from Github Action Input
Запустив рабочий процесс, вы увидите указанное сообщение 🎉, а также увидите, что команде docker run
передаются аргументы.
Вы можете сделать гораздо больше с GitHub Actions и еще больше с прекрасным языком Go, идите и создавайте какие-нибудь действия 😉.