# Создание составного действия

В этом руководстве вы узнаете, как создать составное действие.

> \[!NOTE]
> GitHub Enterprise Serverразмещенные в данный момент средства выполнения не поддерживаются в GitHub.

## Введение

В этом руководстве вы узнаете об основных компонентах, необходимых для создания и использования упакованного составного действия. Чтобы сосредоточиться в этом руководстве на компонентах, необходимых для упаковки действия, функциональные возможности кода действия будут минимальны. Экшн печатает «Hello World», затем «Goodbye», или, если вы дадите кастомное имя, появляется «Hello \[who-to-greet]» и затем «Goodbye». Действие также сопоставляет случайное число с выходной переменной `random-number` и запускает сценарий с именем `goodbye.sh`.

Завершив этот проект, вы узнаете, как создать собственное составное действие и протестировать его в рабочем процессе.

> \[!WARNING]
> При создании рабочих процессов и действий следует всегда учитывать, может ли код выполнять ненадежные входные данные от возможных злоумышленников. Некоторые контексты следует считать непроверенными, так как злоумышленники могут вставить собственное вредоносное содержимое. Дополнительные сведения см. в разделе [Справочник по безопасному использованию](/ru/enterprise-server@3.22/actions/reference/security/secure-use#good-practices-for-mitigating-script-injection-attacks).

### Составные действия и многократно используемые рабочие процессы

Составные действия позволяют собирать ряд шагов задания рабочего процесса в одно действие, которое затем можно запустить как один шаг задания в нескольких рабочих процессах. Повторно используемые рабочие процессы позволяют избежать дублирования, позволяя выполнять полный рабочий процесс из других рабочих процессов. Дополнительные сведения см. в разделе [Повторное использовать конфигурации рабочих процессов](/ru/enterprise-server@3.22/actions/concepts/workflows-and-actions/reusing-workflow-configurations).

## Необходимые компоненты

> \[!NOTE]
> В этом примере объясняется, как создать составное действие в отдельном репозитории. Однако можно создать составное действие в одном репозитории. Дополнительные сведения см. в разделе [Создание составного действия](/ru/enterprise-server@3.22/actions/tutorials/create-actions/create-a-composite-action#creating-a-composite-action-within-the-same-repository).

Прежде чем начать, вы создадите репозиторий на GitHub.

1. Создайте новый публичный репозиторий на GitHub. Вы можете выбрать любое имя репозитория или использовать следующий пример: `hello-world-composite-action`. Вы можете добавить эти файлы после того, как ваш проект был отправлен в GitHub. Дополнительные сведения см. в разделе [Создание репозитория](/ru/enterprise-server@3.22/repositories/creating-and-managing-repositories/creating-a-new-repository).

2. Клонируйте репозиторий на ваш компьютер. Дополнительные сведения см. в разделе [Клонирование репозитория](/ru/enterprise-server@3.22/repositories/creating-and-managing-repositories/cloning-a-repository).

3. В окне терминала перейдите в новый репозиторий.

   ```shell copy
   cd hello-world-composite-action
   ```

4. В репозитории `hello-world-composite-action` создайте новый файл `goodbye.sh` с примером кода:

   ```shell copy
   echo "echo Goodbye" > goodbye.sh
   ```

5. В окне терминала сделайте `goodbye.sh` исполняемым файлом.

   <div class="ghd-tool linux">

   ```shell copy
   chmod +x goodbye.sh
   ```

   </div>

   <div class="ghd-tool mac">

   ```shell copy
   chmod +x goodbye.sh
   ```

   </div>

   <div class="ghd-tool windows">

   ```shell copy
   git add --chmod=+x -- goodbye.sh
   ```

   </div>

6. В окне терминала зарегистрируйте файл `goodbye.sh`.

   <div class="ghd-tool linux">

   ```shell copy
   git add goodbye.sh
   git commit -m "Add goodbye script"
   git push
   ```

   </div>

   <div class="ghd-tool mac">

   ```shell copy
   git add goodbye.sh
   git commit -m "Add goodbye script"
   git push
   ```

   </div>

   <div class="ghd-tool windows">

   ```shell copy
   git commit -m "Add goodbye script"
   git push
   ```

   </div>

## Создание файла метаданных действия

1. В репозитории `hello-world-composite-action` создайте файл под названием `action.yml` и добавьте следующий пример кода. Дополнительные сведения об этом синтаксисе см. в разделе [Справочник по синтаксису метаданных](/ru/enterprise-server@3.22/actions/reference/workflows-and-actions/metadata-syntax#runs-for-composite-actions).

   ```yaml copy
   name: 'Hello World'
   description: 'Greet someone'
   inputs:
     who-to-greet:  # id of input
       description: 'Who to greet'
       required: true
       default: 'World'
   outputs:
     random-number:
       description: "Random number"
       value: ${{ steps.random-number-generator.outputs.random-number }}
   runs:
     using: "composite"
     steps:
       - name: Set Greeting
         run: echo "Hello $INPUT_WHO_TO_GREET."
         shell: bash
         env:
           INPUT_WHO_TO_GREET: ${{ inputs.who-to-greet }}

       - name: Random Number Generator
         id: random-number-generator
         run: echo "random-number=$(echo $RANDOM)" >> $GITHUB_OUTPUT
         shell: bash

       - name: Set GitHub Path
         run: echo "$GITHUB_ACTION_PATH" >> $GITHUB_PATH
         shell: bash
         env:
           GITHUB_ACTION_PATH: ${{ github.action_path }}

       - name: Run goodbye.sh
         run: goodbye.sh
         shell: bash

   ```

   Этот файл определяет входные данные, сопоставляет `who-to-greet` случайно созданное число с `random-number` выходной переменной, добавляет путь действия к системному пути runner (чтобы найти `goodbye.sh` скрипт во время выполнения) и запускает `goodbye.sh` скрипт.

   Дополнительные сведения об управлении выходными данными см. в разделе [Справочник по синтаксису метаданных](/ru/enterprise-server@3.22/actions/reference/workflows-and-actions/metadata-syntax#outputs-for-composite-actions).

   Дополнительные сведения об использовании `github.action_path`см. в разделе [Справочник по контекстам](/ru/enterprise-server@3.22/actions/reference/workflows-and-actions/contexts#github-context).

2. В окне терминала зарегистрируйте файл `action.yml`.

   ```shell copy
   git add action.yml
   git commit -m "Add action"
   git push
   ```

3. В окне терминала добавьте тег. В этом примере используется тег под названием `v1`. Дополнительные сведения см. в разделе [Управление пользовательскими действиями](/ru/enterprise-server@3.22/actions/how-tos/create-and-publish-actions/manage-custom-actions#using-release-management-for-actions).

   ```shell copy
   git tag -a -m "Description of this release" v1
   git push --follow-tags
   ```

## Тестирование действия в рабочем процессе

В следующем коде рабочего процесса используется завершенное действие hello world, которое вы сделали в [Создание составного действия](/ru/enterprise-server@3.22/actions/tutorials/create-actions/create-a-composite-action#creating-an-action-metadata-file).

Скопируйте код `.github/workflows/main.yml` рабочего процесса в файл в другом репозитории, заменив `OWNER` владельца `SHA` репозитория и SHA фиксации, которую вы хотите использовать соответственно. Вы также можете заменить входное поле `who-to-greet` на свое имя.

```yaml copy
on: [push]

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
      - uses: actions/checkout@v6
      - id: foo
        uses: OWNER/hello-world-composite-action@SHA
        with:
          who-to-greet: 'Mona the Octocat'
      - run: echo random-number "$RANDOM_NUMBER"
        shell: bash
        env:
          RANDOM_NUMBER: ${{ steps.foo.outputs.random-number }}
```

В репозитории перейдите на вкладку **Действия** и выберите последний запуск рабочего процесса. Выходные данные должны включать: Hello Mona the Octocat, результат сценария Goodbye и случайное число.

## Создание составного действия в одном репозитории

1. Создайте новую вложенную папку, которая называется, она может быть помещена в любую вложенную папку `hello-world-composite-action`в репозитории. Однако рекомендуется поместить его в вложенную `.github/actions` папку, чтобы упростить организацию.

2. В папке `hello-world-composite-action` выполните те же действия, чтобы создать `goodbye.sh` скрипт

   ```shell copy
   echo "echo Goodbye" > goodbye.sh
   ```

   <div class="ghd-tool linux">

   ```shell copy
   chmod +x goodbye.sh
   ```

   </div>

   <div class="ghd-tool mac">

   ```shell copy
   chmod +x goodbye.sh
   ```

   </div>

   <div class="ghd-tool windows">

   ```shell copy
   git add --chmod=+x -- goodbye.sh
   ```

   </div>

   <div class="ghd-tool linux">

   ```shell copy
   git add goodbye.sh
   git commit -m "Add goodbye script"
   git push
   ```

   </div>

   <div class="ghd-tool mac">

   ```shell copy
   git add goodbye.sh
   git commit -m "Add goodbye script"
   git push
   ```

   </div>

   <div class="ghd-tool windows">

   ```shell copy
   git commit -m "Add goodbye script"
   git push
   ```

   </div>

3. В папке `hello-world-composite-action` создайте `action.yml` файл на основе шагов в [Создание составного действия](/ru/enterprise-server@3.22/actions/tutorials/create-actions/create-a-composite-action#creating-an-action-metadata-file).

4. При использовании действия используйте относительный путь к папке, в которой находится файл составного действия `action.yml` в `uses` ключе. В приведенном ниже примере предполагается, что он находится в папке `.github/actions/hello-world-composite-action` .

```yaml copy
on: [push]

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
      - uses: actions/checkout@v6
      - id: foo
        uses: ./.github/actions/hello-world-composite-action
        with:
          who-to-greet: 'Mona the Octocat'
      - run: echo random-number "$RANDOM_NUMBER"
        shell: bash
        env:
          RANDOM_NUMBER: ${{ steps.foo.outputs.random-number }}
```