Полезные Github Actions для подготовки релизов

27 янв. 2022 г.

Всем привет! Сегодня хотел бы поделиться подборкой Github Actions для управления репозиторием и автоматизации релизов.

У меня была задача автоматизировать существующий ручной процесс подготовки релиза(создание ветки, обновление файла и т.д.). А также последующих действий - создание тега/релиза, слияние веток, удаление релиз бранча и т.д.)

Существующий ручной процесс был отчасти похож на gitflow, но имел свою специфику. Это не позволяло использовать существующие общедоступные workflow, например github-action-gitflow-release-workflow).

В этом посте хотел бы поделиться полезными Github Actions, а также некоторыми приемами.

Приемы

  • Workflow можно запускать вручную с помощью workflow_dispatch. В этом случае можно выбирать ветку.

  • В случае ручного запуска можно передавать параметры в workflow.

  • Для поиска Actions под конкретную задачу удобно использовать marketplace

  • Иногда задачу можно решить консольной bash-командой. Также можно использовать последовательность команд. Однако, возможно, в этом случае стоит задуматься о создании собственного action.

  • Для быстрого завершения workflow можно использовать exit 1. Этот прием можно использовать для кастомной валидации входных параметров workflow.

Стандартные Github Actions

Самодельные action (bash-команды)

- name: Retrieve tag exists flag
  uses: mukunku/tag-exists-action@v1.0.0
  id: checkTag
  with:
    tag: ${{ github.event.inputs.version }}
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Verify tag not exists
  run: |
    if [ ${{ steps.checkTag.outputs.exists }} == true ]; then exit 1; else exit 0; fi
  • Проверка, что ветка не существует.
- name: Verify release branch not exists
  run: |
    git fetch --all
    if git branch -a | grep -q release-${{ steps.dashed_version.outputs.result }}; then exit 1; else exit 0; fi
  • Редактирование файлов:
- name: Update version
  run: |
    echo ${{ github.event.inputs.version }} > .version
  • Валидация названия ветки
- name: Verify branch name
  if: "!contains(github.ref, 'refs/heads/release-')"
  run: |
      echo "Wrong branch name: ${{ github.ref }}, should be release branch"
      exit 1

С использованием указанных actions мне удалось реализовать pre и post release workflows и автоматизировать рутинную работу по подготовке релизов.

На этом пока все. Спасибо за внимание!