{"meta":{"title":"Создание действия JavaScript","intro":"В этом руководстве вы узнаете, как создать действие JavaScript с помощью набора средств действий.","product":"GitHub Actions","breadcrumbs":[{"href":"/ru/enterprise-cloud@latest/actions","title":"GitHub Actions"},{"href":"/ru/enterprise-cloud@latest/actions/tutorials","title":"Учебники"},{"href":"/ru/enterprise-cloud@latest/actions/tutorials/create-actions","title":"Создание действий"},{"href":"/ru/enterprise-cloud@latest/actions/tutorials/create-actions/create-a-javascript-action","title":"Создание действия JavaScript"}],"documentType":"article"},"body":"# Создание действия JavaScript\n\nВ этом руководстве вы узнаете, как создать действие JavaScript с помощью набора средств действий.\n\n## Введение\n\nВ этом руководстве вы узнаете об основных компонентах, необходимых для создания и использования упакованного действия JavaScript. Чтобы сосредоточиться в этом руководстве на компонентах, необходимых для упаковки действия, функциональные возможности кода действия будут минимальны. Действие печатает «Hello World» в логах или «Hello \\[who-to-greet]», если вы дадите кастомное имя.\n\nДля ускорения разработки в этом руководстве применяется модуль Node.js из набора средств GitHub Actions. Дополнительные сведения см. в репозитории [actions/toolkit](https://github.com/actions/toolkit).\n\nЗавершив этот проект, вы узнаете, как создать собственное действие JavaScript и протестировать его в рабочем процессе.\n\nЧтобы обеспечить совместимость действий JavaScript со всеми средствами выполнения, размещенными в GitHub (Ubuntu, Windows и macOS), упакованный код JavaScript должен быть чистым JavaScript без зависимостей от других двоичных файлов. Действия JavaScript запускаются непосредственно в средстве выполнения и используют двоичные файлы, которые уже существуют в образе средства выполнения тестов.\n\n> \\[!WARNING]\n> При создании рабочих процессов и действий следует всегда учитывать, может ли код выполнять ненадежные входные данные от возможных злоумышленников. Некоторые контексты следует считать непроверенными, так как злоумышленники могут вставить собственное вредоносное содержимое. Дополнительные сведения см. в разделе [Справочник по безопасному использованию](/ru/enterprise-cloud@latest/actions/security-guides/security-hardening-for-github-actions#understanding-the-risk-of-script-injections).\n\n## Необходимые компоненты\n\nПеред началом работы необходимо скачать Node.js и создать общедоступный репозиторий GitHub.\n\n1. Скачайте и установите Node.js 20.x, включающую npm.\n\n   <https://nodejs.org/en/download/>\n\n2. Создайте новый общедоступный репозиторий на GitHub и вызовите его \"hello-world-javascript-action\". Дополнительные сведения см. в разделе [Создание репозитория](/ru/enterprise-cloud@latest/repositories/creating-and-managing-repositories/creating-a-new-repository).\n\n3. Клонируйте репозиторий на ваш компьютер. Дополнительные сведения см. в разделе [Клонирование репозитория](/ru/enterprise-cloud@latest/repositories/creating-and-managing-repositories/cloning-a-repository).\n\n4. В окне терминала перейдите в новый репозиторий.\n\n   ```shell copy\n   cd hello-world-javascript-action\n   ```\n\n5. В окне терминала инициализируйте каталог с помощью npm, чтобы создать файл `package.json`.\n\n   ```shell copy\n   npm init -y\n   ```\n\n## Создание файла метаданных действия\n\nСоздайте в каталоге `action.yml` файл с именем `hello-world-javascript-action`, содержащий приведенный ниже код. Дополнительные сведения см. в разделе [Справочник по синтаксису метаданных](/ru/enterprise-cloud@latest/actions/creating-actions/metadata-syntax-for-github-actions).\n\n```yaml copy\nname: Hello World\ndescription: Greet someone and record the time\n\ninputs:\n  who-to-greet: # id of input\n    description: Who to greet\n    required: true\n    default: World\n\noutputs:\n  time: # id of output\n    description: The time we greeted you\n\nruns:\n  using: node20\n  main: dist/index.js\n```\n\nВ этом файле определяются входной атрибут `who-to-greet` и выходной атрибут `time`. В нем также указывается способ запуска этого действия JavaScript средством выполнения.\n\n## Добавление пакетов из набора средств actions\n\nНабор средств actions — это коллекция пакетов Node.js, которые позволяют быстро и согласованно создавать действия JavaScript.\n\nПакет [`@actions/core`](https://github.com/actions/toolkit/tree/main/packages/core) из набора средств предоставляет интерфейс для команд рабочего процесса, входных и выходных переменных, состояний выхода и сообщений отладки.\n\nИнструментарий также предлагает пакет [`@actions/github`](https://github.com/actions/toolkit/tree/main/packages/github), который возвращает аутентифицированный клиент Octokit REST и доступ к GitHub Actions контекстам.\n\nНабор средств не ограничивается пакетами `core` и `github`. Дополнительные сведения см. в репозитории [actions/toolkit](https://github.com/actions/toolkit).\n\nВ окне терминала установите пакеты `core` и `github` из набора средств actions.\n\n```shell copy\nnpm install @actions/core @actions/github\n```\n\nТеперь вы увидите `node_modules` каталог и `package-lock.json` файл, отслеживающий все установленные зависимости и их версии. Вы не должны зафиксировать каталог в `node_modules` репозитории.\n\n## Написание кода действия\n\nЭто действие использует набор средств для получения входной переменной `who-to-greet`, требуемой в файле метаданных действия, и записывает строку \"Hello \\[имя приветствуемого]\" в отладочном сообщении журнала. Затем скрипт получает текущее время и присваивает его выходной переменной, которую смогут использовать действия, выполняемые позже в рамках задания.\n\nGitHub Actions предоставляет контекстную информацию о событии webhook, ссылках на Git, рабочем процессе, действии и человеке, который запустил этот рабочий процесс. Для доступа к сведениям о контексте можно использовать пакет `github`. Вы напишете действие, которое будет записывать полезные данные события веб-перехватчика в журнал.\n\nДобавьте файл с именем `src/index.js`, содержащий приведенный ниже код.\n\n```javascript copy\nimport * as core from \"@actions/core\";\nimport * as github from \"@actions/github\";\n\ntry {\n  // `who-to-greet` input defined in action metadata file\n  const nameToGreet = core.getInput(\"who-to-greet\");\n  core.info(`Hello ${nameToGreet}!`);\n\n  // Get the current time and set it as an output variable\n  const time = new Date().toTimeString();\n  core.setOutput(\"time\", time);\n\n  // Get the JSON webhook payload for the event that triggered the workflow\n  const payload = JSON.stringify(github.context.payload, undefined, 2);\n  core.info(`The event payload: ${payload}`);\n} catch (error) {\n  core.setFailed(error.message);\n}\n```\n\nЕсли в приведенном выше примере `index.js` возникает ошибка, `core.setFailed(error.message);` использует пакет [`@actions/core`](https://github.com/actions/toolkit/tree/main/packages/core) из набора средств actions для регистрации сообщения и задания кода выхода \"сбой\". Дополнительные сведения см. в разделе [Настройка кодов выхода для действий](/ru/enterprise-cloud@latest/actions/creating-actions/setting-exit-codes-for-actions).\n\n## Создание файла README\n\nЧтобы сообщить людям, как применить свое действие, можно создать файл README. Файл сведений наиболее полезен, если вы планируете опубликовать действие в открытом доступе, но может также применяться в качестве напоминания для себя или своей команды.\n\nВ каталоге `hello-world-javascript-action` создайте файл `README.md` со следующими сведениями:\n\n* подробное описание того, что делает действие;\n* обязательные входные и выходные аргументы;\n* необязательные входные и выходные аргументы;\n* секреты, используемые действием;\n* переменные среды, используемые действием;\n* пример использования действия в рабочем процессе.\n\n````markdown copy\n# Hello world JavaScript action\n\nThis action prints \"Hello World\" or \"Hello\" + the name of a person to greet to the log.\n\n## Inputs\n\n### `who-to-greet`\n\n**Required** The name of the person to greet. Default `\"World\"`.\n\n## Outputs\n\n### `time`\n\nThe time we greeted you.\n\n## Example usage\n\n```yaml\nuses: actions/hello-world-javascript-action@e76147da8e5c81eaf017dede5645551d4b94427b\nwith:\n  who-to-greet: Mona the Octocat\n```\n````\n\n## Фиксация, тег и отправка действия\n\nGitHub загружает каждое действие в рабочем процессе во время выполнения и выполняет его как полный пакет кода, прежде чем использовать команды рабочих процессов, как `run` взаимодействовать с компьютером runner. Это означает, что необходимо включить все зависимости пакетов, необходимые для выполнения кода JavaScript. Например, это действие использует `@actions/core` и `@actions/github` пакеты.\n\nВозврат каталога `node_modules` может привести к проблемам. В качестве альтернативы можно использовать такие средства, как `rollup.js`[](https://github.com/rollup/rollup)или объединить код и зависимости в один файл для распространения.\n\n1. Установите `rollup` и его подключаемые модули, выполнив эту команду в терминале.\n\n   `npm install --save-dev rollup @rollup/plugin-commonjs @rollup/plugin-node-resolve`\n\n2. Создайте новый файл, который вызывается `rollup.config.js` в корневом каталоге репозитория, с помощью следующего кода.\n\n   ```javascript copy\n   import commonjs from \"@rollup/plugin-commonjs\";\n   import { nodeResolve } from \"@rollup/plugin-node-resolve\";\n\n   const config = {\n     input: \"src/index.js\",\n     output: {\n       esModule: true,\n       file: \"dist/index.js\",\n       format: \"es\",\n       sourcemap: true,\n     },\n     plugins: [commonjs(), nodeResolve({ preferBuiltins: true })],\n   };\n\n   export default config;\n   ```\n\n3. Скомпилируйте файл `dist/index.js`.\n\n   `rollup --config rollup.config.js`\n\n   Вы увидите новый `dist/index.js` файл с кодом и любыми зависимостями.\n\n4. В терминале зафиксируйте обновления.\n\n   ```shell copy\n   git add src/index.js dist/index.js rollup.config.js package.json package-lock.json README.md action.yml\n   git commit -m \"Initial commit of my first action\"\n   git tag -a -m \"My first action release\" v1.1\n   git push --follow-tags\n   ```\n\nПри фиксации и отправке кода обновленный репозиторий должен выглядеть следующим образом:\n\n```text\nhello-world-javascript-action/\n├── action.yml\n├── dist/\n│   └── index.js\n├── package.json\n├── package-lock.json\n├── README.md\n├── rollup.config.js\n└── src/\n    └── index.js\n```\n\n## Тестирование действия в рабочем процессе\n\nТеперь вы готовы протестировать действие в рабочем процессе.\n\nОбщедоступные действия могут использоваться рабочими процессами в любом репозитории. Если действие находится в закрытом или внутреннем репозитории, параметры репозитория определяют, доступно ли действие только в том же репозитории или в других репозиториях, принадлежащих тем же , организации или предприятия. Дополнительные сведения см. в разделе [Управление настройками GitHub Actions для репозитория](/ru/enterprise-cloud@latest/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository).\n\n### Пример. Использование общедоступного действия\n\nВ этом примере показано, как можно запустить новое общедоступное действие из внешнего репозитория.\n\nСкопируйте приведенный ниже код YAML в новый файл по пути `.github/workflows/main.yml` и измените строку `uses: octocat/hello-world-javascript-action@1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b`, указав свое имя пользователя и имя созданного ранее общедоступного репозитория. Вы также можете заменить входное поле `who-to-greet` на свое имя.\n\n```yaml copy\non:\n  push:\n    branches:\n      - main\n\njobs:\n  hello_world_job:\n    name: A job to say hello\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Hello world action step\n        id: hello\n        uses: octocat/hello-world-javascript-action@1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b\n        with:\n          who-to-greet: Mona the Octocat\n\n      # Use the output from the `hello` step\n      - name: Get the output time\n        run: echo \"The time was ${{ steps.hello.outputs.time }}\"\n```\n\nПри активации этого рабочего процесса средство выполнения скачивает действие `hello-world-javascript-action` из общедоступного репозитория, а затем запускает его.\n\n### Пример использования частного действия\n\nСкопируйте код рабочего процесса в файл `.github/workflows/main.yml` в репозитории действия. Вы также можете заменить входное поле `who-to-greet` на свое имя.\n\n```yaml copy\non:\n  push:\n    branches:\n      - main\n\njobs:\n  hello_world_job:\n    name: A job to say hello\n    runs-on: ubuntu-latest\n\n    steps:\n      # To use this repository's private action,\n      # you must check out the repository\n      - name: Checkout\n        uses: actions/checkout@v6\n\n      - name: Hello world action step\n        uses: ./ # Uses an action in the root directory\n        id: hello\n        with:\n          who-to-greet: Mona the Octocat\n\n      # Use the output from the `hello` step\n      - name: Get the output time\n        run: echo \"The time was ${{ steps.hello.outputs.time }}\"\n```\n\nВ репозитории перейдите на вкладку **Действия** и выберите последний запуск рабочего процесса. В разделе **Задания** или в графе визуализации щелкните **Задание для отображения приветствия**.\n\nНажмите кнопку **\"Hello world action step**\", и вы увидите \"Hello Mona the Octocat\" или имя, которое вы использовали для `who-to-greet` ввода, напечатанного в журнале. Чтобы просмотреть метку времени, нажмите кнопку **\"Получить время** вывода\".\n\n## Репозитории шаблонов для создания действий JavaScript\n\nGitHub предоставляет репозитории шаблонов для создания действий JavaScript и TypeScript. С помощью этих шаблонов можно быстро приступить к созданию нового действия, включающего тесты, подкладку и другие рекомендуемые методики.\n\n* [\n  `javascript-action` репозиторий шаблонов](https://github.com/actions/javascript-action)\n* [\n  `typescript-action` репозиторий шаблонов](https://github.com/actions/typescript-action)\n\n## Пример действий JavaScript для GitHub.com\n\nВы можете найти множество примеров действий JavaScript на GitHub.com.\n\n* [DevExpress/testcafe-action](https://github.com/DevExpress/testcafe-action)\n* [duckduckgo/privacy-configuration](https://github.com/duckduckgo/privacy-configuration)"}