跳至主要内容

创建复合操作

在本指南中,您将学习如何构建复合操作。

平台导航

简介

本指南将介绍创建和使用打包复合操作所需的组件。为了将本指南的重点放在打包操作所需的组件上,操作代码的功能非常简单。该操作打印“Hello World”,然后打印“Goodbye”,或者如果您提供自定义名称,它将打印“Hello [who-to-greet]”,然后打印“Goodbye”。该操作还将随机数映射到`random-number`输出变量,并运行名为`goodbye.sh`的脚本。

完成本项目后,您应该了解如何构建自己的复合操作并在工作流中对其进行测试。

警告

在创建工作流和操作时,应始终考虑您的代码是否可能执行来自潜在攻击者的不受信任的输入。某些上下文应被视为不受信任的输入,因为攻击者可能会插入他们自己的恶意内容。有关更多信息,请参阅“[GitHub Actions 的安全强化](/en/actions/security-guides/security-hardening-for-github-actions#understanding-the-risk-of-script-injections)”。

复合操作和可重用工作流

复合操作允许您将一系列工作流作业步骤收集到单个操作中,然后您可以在多个工作流中将其作为单个作业步骤运行。可重用工作流提供了另一种避免重复的方法,允许您从其他工作流中运行完整的工作流。有关更多信息,请参阅“[避免重复](/en/actions/using-workflows/avoiding-duplication)”。

先决条件

在开始之前,您将在 GitHub 上创建一个仓库。

  1. 在 GitHub 上创建一个新的公共仓库。您可以选择任何仓库名称,或使用以下`hello-world-composite-action`示例。将项目推送到 GitHub 后,您可以添加这些文件。有关更多信息,请参阅“[创建新的仓库](/en/repositories/creating-and-managing-repositories/creating-a-new-repository)”。

  2. 将您的仓库克隆到您的计算机上。有关更多信息,请参阅“[克隆仓库](/en/repositories/creating-and-managing-repositories/cloning-a-repository)”。

  3. 在您的终端中,更改目录到您的新仓库。

    Shell
    cd hello-world-composite-action
    
  4. 在`hello-world-composite-action`仓库中,创建一个名为`goodbye.sh`的新文件,并添加示例代码。

    Shell
    echo "echo Goodbye" > goodbye.sh
    
  5. 在您的终端中,使`goodbye.sh`可执行。

    Shell
    chmod +x goodbye.sh
    
    Shell
    chmod +x goodbye.sh
    
    Shell
    git add --chmod=+x -- goodbye.sh
    
  6. 在您的终端中,检入您的`goodbye.sh`文件。

    Shell
    git add goodbye.sh
    git commit -m "Add goodbye script"
    git push
    
    Shell
    git add goodbye.sh
    git commit -m "Add goodbye script"
    git push
    
    Shell
    git commit -m "Add goodbye script"
    git push
    

创建操作元数据文件

  1. 在`hello-world-composite-action`仓库中,创建一个名为`action.yml`的新文件,并添加以下示例代码。有关此语法的更多信息,请参阅“[GitHub Actions 的元数据语法](/en/actions/creating-actions/metadata-syntax-for-github-actions#runs-for-composite-actions)”。

    YAML
    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`输出变量,将操作的路径添加到运行器系统路径(以便在执行期间找到`goodbye.sh`脚本),并运行`goodbye.sh`脚本。

    有关管理输出的更多信息,请参阅“[GitHub Actions 的元数据语法](/en/actions/creating-actions/metadata-syntax-for-github-actions#outputs-for-composite-actions)”。

    有关如何使用`github.action_path`的更多信息,请参阅“[访问有关工作流运行的上下文信息](/en/actions/learn-github-actions/contexts#github-context)”。

  2. 在您的终端中,检入您的`action.yml`文件。

    Shell
    git add action.yml
    git commit -m "Add action"
    git push
    
  3. 在您的终端中,添加一个标签。此示例使用名为`v1`的标签。有关更多信息,请参阅“[关于自定义操作](/en/actions/creating-actions/about-custom-actions#using-release-management-for-actions)”。

    Shell
    git tag -a -m "Description of this release" v1
    git push --follow-tags
    

在工作流中测试您的操作

以下工作流代码使用您在“[创建复合操作](/en/actions/creating-actions/creating-a-composite-action#creating-an-action-metadata-file)”中创建的已完成的 Hello World 操作。

将工作流代码复制到另一个仓库中的`.github/workflows/main.yml`文件,分别用仓库所有者和您要使用的提交的 SHA 替换`actions`和`SHA`。您还可以用您的姓名替换`who-to-greet`输入。

YAML
on: [push]

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
      - uses: actions/checkout@v4
      - 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”脚本的结果以及一个随机数。

GitHub 上的复合操作示例

您可以在 GitHub 上找到许多复合操作示例。