{"meta":{"title":"Criar uma ação composta","intro":"Neste tutorial, você aprenderá a criar uma ação composta.","product":"GitHub Actions","breadcrumbs":[{"href":"/pt/actions","title":"GitHub Actions"},{"href":"/pt/actions/tutorials","title":"Tutoriais"},{"href":"/pt/actions/tutorials/create-actions","title":"Criar ações"},{"href":"/pt/actions/tutorials/create-actions/create-a-composite-action","title":"Criar uma ação composta"}],"documentType":"article"},"body":"# Criar uma ação composta\n\nNeste tutorial, você aprenderá a criar uma ação composta.\n\n## Introdução\n\nNeste guia, você aprenderá os componentes básicos necessários para criar e usar uma ação composta empacotada. Para manter o foco deste guia nos componentes necessários para empacotar a ação, a funcionalidade do código da ação é mínima. A ação imprime \"Hello World\" e depois \"Adeus\", ou se você fornecer um nome personalizado, ela imprime \"Olá \\[quem cumprimentar]\" e, em seguida, \"Adeus\". A ação também mapeia um número aleatório para a variável de saída `random-number` e executa um script chamado `goodbye.sh`.\n\nAo concluir este projeto, você entenderá como criar a sua própria ação composta e testá-la em um fluxo de trabalho.\n\n> \\[!WARNING]\n> Ao criar fluxos de trabalho e ações, sempre considere se o código poderá executar entradas não confiáveis de possíveis invasores. Certos contextos devem ser tratados como entradas não confiáveis, uma vez que um invasor pode inserir seu próprio conteúdo malicioso. Para saber mais, confira [Referência de uso seguro](/pt/actions/security-guides/security-hardening-for-github-actions#understanding-the-risk-of-script-injections).\n\n### Ações compostas e fluxos de trabalho reutilizáveis\n\nAs ações compostas permitem coletar uma série de etapas de tarefas de fluxo de trabalho em uma única ação que você pode executar como uma única etapa de trabalho em vários fluxos de trabalho. Os fluxos de trabalho reutilizáveis fornecem outra maneira de evitar a duplicação, permitindo que você execute um fluxo de trabalho completo de dentro de outros fluxos de trabalho. Para saber mais, confira [Reutilizando configurações de fluxo de trabalho](/pt/actions/using-workflows/avoiding-duplication).\n\n## Pré-requisitos\n\n> \\[!NOTE]\n> Este exemplo explica como criar uma ação composta em um repositório separado. No entanto, é possível criar uma ação composta no mesmo repositório. Para saber mais, confira [Criar uma ação composta](/pt/actions/creating-actions/creating-a-composite-action#creating-a-composite-action-within-the-same-repository).\n\nAntes de começar, você criará um repositório em GitHub.\n\n1. Crie um novo repositório público em GitHub. Você pode escolher qualquer nome de repositório ou usar o exemplo de `hello-world-composite-action` a seguir. Você pode adicionar esses arquivos depois que seu projeto tiver sido enviado por push para GitHub. Para saber mais, confira [Criar um repositório](/pt/repositories/creating-and-managing-repositories/creating-a-new-repository).\n\n2. Clone o repositório para seu computador. Para saber mais, confira [Clonar um repositório](/pt/repositories/creating-and-managing-repositories/cloning-a-repository).\n\n3. No seu terminal, mude os diretórios para seu novo repositório.\n\n   ```shell copy\n   cd hello-world-composite-action\n   ```\n\n4. No repositório `hello-world-composite-action`, crie um arquivo chamado `goodbye.sh` com o código de exemplo:\n\n   ```shell copy\n   echo \"echo Goodbye\" > goodbye.sh\n   ```\n\n5. A partir do terminal, torne o comando `goodbye.sh` executável.\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. Ainda no terminal, faça check-in do arquivo `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## Criar um arquivo de metadados de ação\n\n1. No repositório `hello-world-composite-action`, crie um arquivo chamado `action.yml` e adicione o código de exemplo a seguir. Para obter mais informações sobre essa sintaxe, confira [Referência de sintaxe de metadados](/pt/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   Esse arquivo define a entrada de`who-to-greet`, mapeia o número gerado aleatoriamente para a variável de saída`random-number`, adiciona o caminho da ação ao caminho do sistema executor (para localizar o script`goodbye.sh` durante a execução) e executa o script`goodbye.sh`.\n\n   Para obter mais informações sobre como gerenciar saídas, confira [Referência de sintaxe de metadados](/pt/actions/creating-actions/metadata-syntax-for-github-actions#outputs-for-composite-actions).\n\n   Para obter mais informações sobre como usar o `github.action_path`, confira [Referência de contextos](/pt/actions/learn-github-actions/contexts#github-context).\n\n2. Ainda no terminal, faça check-in do arquivo `action.yml`.\n\n   ```shell copy\n   git add action.yml\n   git commit -m \"Add action\"\n   git push\n   ```\n\n3. No seu terminal, adicione uma tag. Este exemplo usa uma tag chamada `v1`. Para saber mais, confira [Sobre ações personalizadas](/pt/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## Testar sua ação em um fluxo de trabalho\n\nO código de fluxo de trabalho a seguir usa a ação concluída \"olá, mundo\" que você criou em [Criar uma ação composta](/pt/actions/creating-actions/creating-a-composite-action#creating-an-action-metadata-file).\n\nCopie o código do fluxo de trabalho em um arquivo `.github/workflows/main.yml` em outro repositório, substituindo `OWNER` e `SHA` pelo proprietário do repositório e o SHA do commit que deseja usar, respectivamente. Você também pode substituir a entrada `who-to-greet` pelo seu nome.\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\nNo repositório, clique na guia **Ações** e selecione a execução mais recente do fluxo de trabalho. A saída deve incluir: \"Hello Mona the Octocat\", o resultado do script \"Goodbye\" e um número aleatório.\n\n## Criando uma ação composta no mesmo repositório\n\n1. Crie uma subpasta chamada `hello-world-composite-action`, que pode ser colocada em qualquer subpasta dentro do repositório. No entanto, é recomendável que seja colocada na subpasta `.github/actions` para facilitar a organização.\n\n2. Na pasta `hello-world-composite-action`, execute as mesmas etapas para criar o script `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. Na pasta `hello-world-composite-action`, crie o arquivo `action.yml` com base nas etapas em [Criar uma ação composta](/pt/actions/creating-actions/creating-a-composite-action#creating-an-action-metadata-file).\n\n4. Ao usar a ação, use o caminho relativo para a pasta em que o arquivo `action.yml` da ação composta está localizado na chave `uses`. O exemplo a seguir pressupõe que ele esteja na pasta `.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```"}