{"meta":{"title":"Создание составного действия","intro":"В этом руководстве вы узнаете, как создать составное действие.","product":"GitHub Actions","breadcrumbs":[{"href":"/ru/actions","title":"GitHub Actions"},{"href":"/ru/actions/tutorials","title":"Учебники"},{"href":"/ru/actions/tutorials/create-actions","title":"Создание действий"},{"href":"/ru/actions/tutorials/create-actions/create-a-composite-action","title":"Создание составного действия"}],"documentType":"article"},"body":"# Создание составного действия\n\nВ этом руководстве вы узнаете, как создать составное действие.\n\n## Введение\n\nВ этом руководстве вы узнаете об основных компонентах, необходимых для создания и использования упакованного составного действия. Чтобы сосредоточиться в этом руководстве на компонентах, необходимых для упаковки действия, функциональные возможности кода действия будут минимальны. Экшн печатает «Hello World», затем «Goodbye», или, если вы дадите кастомное имя, появляется «Hello \\[who-to-greet]» и затем «Goodbye». Действие также сопоставляет случайное число с выходной переменной `random-number` и запускает сценарий с именем `goodbye.sh`.\n\nЗавершив этот проект, вы узнаете, как создать собственное составное действие и протестировать его в рабочем процессе.\n\n> \\[!WARNING]\n> При создании рабочих процессов и действий следует всегда учитывать, может ли код выполнять ненадежные входные данные от возможных злоумышленников. Некоторые контексты следует считать непроверенными, так как злоумышленники могут вставить собственное вредоносное содержимое. Дополнительные сведения см. в разделе [Справочник по безопасному использованию](/ru/actions/security-guides/security-hardening-for-github-actions#understanding-the-risk-of-script-injections).\n\n### Составные действия и многократно используемые рабочие процессы\n\nСоставные действия позволяют собирать ряд шагов задания рабочего процесса в одно действие, которое затем можно запустить как один шаг задания в нескольких рабочих процессах. Повторно используемые рабочие процессы позволяют избежать дублирования, позволяя выполнять полный рабочий процесс из других рабочих процессов. Дополнительные сведения см. в разделе [Повторное использовать конфигурации рабочих процессов](/ru/actions/using-workflows/avoiding-duplication).\n\n## Необходимые компоненты\n\n> \\[!NOTE]\n> В этом примере объясняется, как создать составное действие в отдельном репозитории. Однако можно создать составное действие в одном репозитории. Дополнительные сведения см. в разделе [Создание составного действия](/ru/actions/creating-actions/creating-a-composite-action#creating-a-composite-action-within-the-same-repository).\n\nПрежде чем начать, вы создадите репозиторий на GitHub.\n\n1. Создайте новый публичный репозиторий на GitHub. Вы можете выбрать любое имя репозитория или использовать следующий пример: `hello-world-composite-action`. Вы можете добавить эти файлы после того, как ваш проект был отправлен в GitHub. Дополнительные сведения см. в разделе [Создание репозитория](/ru/repositories/creating-and-managing-repositories/creating-a-new-repository).\n\n2. Клонируйте репозиторий на ваш компьютер. Дополнительные сведения см. в разделе [Клонирование репозитория](/ru/repositories/creating-and-managing-repositories/cloning-a-repository).\n\n3. В окне терминала перейдите в новый репозиторий.\n\n   ```shell copy\n   cd hello-world-composite-action\n   ```\n\n4. В репозитории `hello-world-composite-action` создайте новый файл `goodbye.sh` с примером кода:\n\n   ```shell copy\n   echo \"echo Goodbye\" > goodbye.sh\n   ```\n\n5. В окне терминала сделайте `goodbye.sh` исполняемым файлом.\n\n   <div class=\"ghd-tool linux\">\n\n   ```shell copy\n   chmod +x goodbye.sh\n   ```\n\n   </div>\n\n   <div class=\"ghd-tool mac\">\n\n   ```shell copy\n   chmod +x goodbye.sh\n   ```\n\n   </div>\n\n   <div class=\"ghd-tool windows\">\n\n   ```shell copy\n   git add --chmod=+x -- goodbye.sh\n   ```\n\n   </div>\n\n6. В окне терминала зарегистрируйте файл `goodbye.sh`.\n\n   <div class=\"ghd-tool linux\">\n\n   ```shell copy\n   git add goodbye.sh\n   git commit -m \"Add goodbye script\"\n   git push\n   ```\n\n   </div>\n\n   <div class=\"ghd-tool mac\">\n\n   ```shell copy\n   git add goodbye.sh\n   git commit -m \"Add goodbye script\"\n   git push\n   ```\n\n   </div>\n\n   <div class=\"ghd-tool windows\">\n\n   ```shell copy\n   git commit -m \"Add goodbye script\"\n   git push\n   ```\n\n   </div>\n\n## Создание файла метаданных действия\n\n1. В репозитории `hello-world-composite-action` создайте файл под названием `action.yml` и добавьте следующий пример кода. Дополнительные сведения об этом синтаксисе см. в разделе [Справочник по синтаксису метаданных](/ru/actions/creating-actions/metadata-syntax-for-github-actions#runs-for-composite-actions).\n\n   ```yaml copy\n   name: 'Hello World'\n   description: 'Greet someone'\n   inputs:\n     who-to-greet:  # id of input\n       description: 'Who to greet'\n       required: true\n       default: 'World'\n   outputs:\n     random-number:\n       description: \"Random number\"\n       value: ${{ steps.random-number-generator.outputs.random-number }}\n   runs:\n     using: \"composite\"\n     steps:\n       - name: Set Greeting\n         run: echo \"Hello $INPUT_WHO_TO_GREET.\"\n         shell: bash\n         env:\n           INPUT_WHO_TO_GREET: ${{ inputs.who-to-greet }}\n\n       - name: Random Number Generator\n         id: random-number-generator\n         run: echo \"random-number=$(echo $RANDOM)\" >> $GITHUB_OUTPUT\n         shell: bash\n\n       - name: Set GitHub Path\n         run: echo \"$GITHUB_ACTION_PATH\" >> $GITHUB_PATH\n         shell: bash\n         env:\n           GITHUB_ACTION_PATH: ${{ github.action_path }}\n\n       - name: Run goodbye.sh\n         run: goodbye.sh\n         shell: bash\n\n   ```\n\n   Этот файл определяет входные данные, сопоставляет `who-to-greet` случайно созданное число с `random-number` выходной переменной, добавляет путь действия к системному пути runner (чтобы найти `goodbye.sh` скрипт во время выполнения) и запускает `goodbye.sh` скрипт.\n\n   Дополнительные сведения об управлении выходными данными см. в разделе [Справочник по синтаксису метаданных](/ru/actions/creating-actions/metadata-syntax-for-github-actions#outputs-for-composite-actions).\n\n   Дополнительные сведения об использовании `github.action_path`см. в разделе [Справочник по контекстам](/ru/actions/learn-github-actions/contexts#github-context).\n\n2. В окне терминала зарегистрируйте файл `action.yml`.\n\n   ```shell copy\n   git add action.yml\n   git commit -m \"Add action\"\n   git push\n   ```\n\n3. В окне терминала добавьте тег. В этом примере используется тег под названием `v1`. Дополнительные сведения см. в разделе [Сведения о настраиваемых действиях](/ru/actions/creating-actions/about-custom-actions#using-release-management-for-actions).\n\n   ```shell copy\n   git tag -a -m \"Description of this release\" v1\n   git push --follow-tags\n   ```\n\n## Тестирование действия в рабочем процессе\n\nВ следующем коде рабочего процесса используется завершенное действие hello world, которое вы сделали в [Создание составного действия](/ru/actions/creating-actions/creating-a-composite-action#creating-an-action-metadata-file).\n\nСкопируйте код `.github/workflows/main.yml` рабочего процесса в файл в другом репозитории, заменив `OWNER` владельца `SHA` репозитория и SHA фиксации, которую вы хотите использовать соответственно. Вы также можете заменить входное поле `who-to-greet` на свое имя.\n\n```yaml copy\non: [push]\n\njobs:\n  hello_world_job:\n    runs-on: ubuntu-latest\n    name: A job to say hello\n    steps:\n      - uses: actions/checkout@v6\n      - id: foo\n        uses: OWNER/hello-world-composite-action@SHA\n        with:\n          who-to-greet: 'Mona the Octocat'\n      - run: echo random-number \"$RANDOM_NUMBER\"\n        shell: bash\n        env:\n          RANDOM_NUMBER: ${{ steps.foo.outputs.random-number }}\n```\n\nВ репозитории перейдите на вкладку **Действия** и выберите последний запуск рабочего процесса. Выходные данные должны включать: Hello Mona the Octocat, результат сценария Goodbye и случайное число.\n\n## Создание составного действия в одном репозитории\n\n1. Создайте новую вложенную папку, которая называется, она может быть помещена в любую вложенную папку `hello-world-composite-action`в репозитории. Однако рекомендуется поместить его в вложенную `.github/actions` папку, чтобы упростить организацию.\n\n2. В папке `hello-world-composite-action` выполните те же действия, чтобы создать `goodbye.sh` скрипт\n\n   ```shell copy\n   echo \"echo Goodbye\" > goodbye.sh\n   ```\n\n   <div class=\"ghd-tool linux\">\n\n   ```shell copy\n   chmod +x goodbye.sh\n   ```\n\n   </div>\n\n   <div class=\"ghd-tool mac\">\n\n   ```shell copy\n   chmod +x goodbye.sh\n   ```\n\n   </div>\n\n   <div class=\"ghd-tool windows\">\n\n   ```shell copy\n   git add --chmod=+x -- goodbye.sh\n   ```\n\n   </div>\n\n   <div class=\"ghd-tool linux\">\n\n   ```shell copy\n   git add goodbye.sh\n   git commit -m \"Add goodbye script\"\n   git push\n   ```\n\n   </div>\n\n   <div class=\"ghd-tool mac\">\n\n   ```shell copy\n   git add goodbye.sh\n   git commit -m \"Add goodbye script\"\n   git push\n   ```\n\n   </div>\n\n   <div class=\"ghd-tool windows\">\n\n   ```shell copy\n   git commit -m \"Add goodbye script\"\n   git push\n   ```\n\n   </div>\n\n3. В папке `hello-world-composite-action` создайте `action.yml` файл на основе шагов в [Создание составного действия](/ru/actions/creating-actions/creating-a-composite-action#creating-an-action-metadata-file).\n\n4. При использовании действия используйте относительный путь к папке, в которой находится файл составного действия `action.yml` в `uses` ключе. В приведенном ниже примере предполагается, что он находится в папке `.github/actions/hello-world-composite-action` .\n\n```yaml copy\non: [push]\n\njobs:\n  hello_world_job:\n    runs-on: ubuntu-latest\n    name: A job to say hello\n    steps:\n      - uses: actions/checkout@v6\n      - id: foo\n        uses: ./.github/actions/hello-world-composite-action\n        with:\n          who-to-greet: 'Mona the Octocat'\n      - run: echo random-number \"$RANDOM_NUMBER\"\n        shell: bash\n        env:\n          RANDOM_NUMBER: ${{ steps.foo.outputs.random-number }}\n```"}