Два дня назад я узнал о хакатоне на Github и задумал совершить какую-нибудь полезную акцию. Но перед этим я решил сделать что-нибудь веселое и узнать об основах действия на Github. Поэтому я создал экшн-PR-гифки по мотивам экшн-котов. action-pr-gifs будет публиковать gif в качестве комментария в PR в зависимости от типа PR. Проверьте мои действия и получайте удовольствие!

Давайте сделаем простое действие GitHub, чтобы опубликовать комментарий в PR!

Вы можете создать действие двумя способами

  • Действие контейнера Docker
  • Действие Javascript

Докер-контейнер

Этот тип действия идеально подходит, если вы хотите выполнять свои действия с определенной операционной системой, средами и т. д. Обратите внимание, что они медленнее по сравнению с действием javascript, поскольку оно должно извлекать контейнер.

Действие Javascript

Действия JavaScript могут выполняться непосредственно на исполняющей машине. Это намного проще и быстрее, и я буду использовать действие javascript в этом уроке.

Вместо того, чтобы создавать репозиторий узлов с нуля, я рекомендую использовать шаблон, предоставленный командой GitHub. В нем есть почти все, чтобы начать свое первое действие на GitHub. Но если вы хотите начать все с нуля, как я, вы всегда можете это сделать.

Прежде чем писать какой-либо фактический код, убедитесь, что eslint настроен для вашего проекта. Это гарантирует, что вы используете один и тот же стиль кодирования во всем проекте.

action.yml

Добавьте файл action.yml в корневую папку и добавьте следующую строку.

name: 'Action name'
description: 'A sample description'
inputs:
  github-token:
    description: 'Pass in secrets.GITHUB_TOKEN'
    required: true
runs:
  using: 'node12'
  main: 'dist/index.js'

Вы заметили, что я добавил dist/index.js в качестве основного? Я вернусь к этому позже.

Действительный код

Добавьте новую функцию run в index.js или src/index.js по своему усмотрению. Это простая функция для публикации комментария You are awesome к каждому пулл-реквесту. Обратите внимание, что это должно быть вызвано только событием PR. Поэтому, если она срабатывает для любого другого события, функция должна выдать ошибку.

const core = require('@actions/core');
const github = require('@actions/github');

async function run() {
  try {
    const githubToken = core.getInput('GITHUB_TOKEN');

    const { context } = github;
    if (context.payload.pull_request == null) {
      core.setFailed('No pull request found.');
    }

    const pullRequestNumber = context.payload.pull_request.number;
    const octokit = new github.GitHub(githubToken);
    const message = 'Wow! you are awesome';

    octokit.issues.createComment({
      ...context.repo,
      issue_number: pullRequestNumber,
      body: message,
    });
  } catch (error) {
    core.setFailed(error.message);
  }
}

run();

Создать

GitHub загружает каждое действие, выполняемое в рабочем процессе во время выполнения, и выполняет его как полный пакет кода. Итак, вам нужно node_modules для запуска вашего кода. Если вы добавили его в .gitignore, удалите его. В качестве альтернативы вы можете использовать zeit/ncc для создания исходного кода, чтобы вам не нужен был node modules.

Установите ncc с помощью следующей команды

Создайте свой источник, используя

ncc build index.js (or) ncc build src/index.js

Это создаст ваши исходные файлы в папке dist. Это будет ваш основной файл, и не забывайте создавать и фиксировать этот файл каждый раз, когда вы вносите изменения в исходный файл.

Тестирование

В этом действии особо нечего тестировать. Но всегда рекомендуется писать тесты для вашего действия на GitHub. Вы можете проверить мой репозиторий для некоторых примеров.

Вот и все, вы написали свой первый экшен на Github. Пришло время проверить это

Добавление действий в репозитории

Прежде чем размещать действие на торговой площадке, вы можете один раз протестировать его в том же репозитории. Создайте файл .github/workflows/main.yml с такой же структурой и добавьте следующую строку.

name: PR

# Controls when the action will run. Triggers the workflow on push or pull request 
# events but only for the master branch
on:
  pull_request:
    branches: [ master ]
jobs:
  pr_check:
    runs-on: ubuntu-latest
    name: A job to Post comment on PR
    steps:
    - uses: actions/checkout@v2
    - name: PR Action
      uses: koushikmohan1996/action-pr-gifs@master
      with:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

В зависимости от ваших действий вы должны заменить koushikmohan1996/action-pr-gifs@master на username/reponame@master. Здесь я использовал branches: [master], поэтому действие будет запускаться только в том случае, если PR создан для основной ветки. Вы можете удалить это, если хотите во всех ветках.

После того, как вы все протестировали, вы можете добавить это действие в Marketplace, создав релиз. Обратите внимание, что для публикации в Marketplace вам потребуется файл readme и файл лицензии.

Проверьте этот образец пр action-pr-gifs. Оставьте комментарий, если вы создали какой-нибудь классный экшен на Github или встретите его.

Подписание!

Первоначально опубликовано на https://dev.to 13 марта 2020 г.