GitHub 操作:如何根据部署步骤输出动态设置环境 url?

GitHub Actions: How to dynamically set environment url based on deployment step output?

我发现 a really nice GitHub Actions Feature called Environments. Using the appropriate syntax a Environment could also be created inside a GitHub Action workflow.yml 是这样的:

environment:
  name: test_environment
  url: https://your-apps-url-here.com

As the docs state 这是创建 GitHub 动作环境的有效方法:

Running a workflow that references an environment that does not exist will create an environment with the referenced name.

但在我当前的 GitHub 操作工作流程中,有没有一种方法可以根据部署步骤输出动态设置 url?我有一个动态的 URL 是由部署到 AWS 的过程产生的,我无法预先定义。

工作流程文档告诉我们 there's also a way of using expressions inside the url field:

environment:
  name: test_environment
  url: ${{ steps.step_name.outputs.url_output }}

现在想象一个 ci.yml 工作流文件,它使用 AWS CLI 将静态网站部署到 S3,我们在其中使用 Pulumi 等工具在我们的 AWS 账户中动态创建 S3 存储桶。我们可以使用以下命令 pulumi stack output bucketName 读取动态创建的 S3 url。 ci.yml 中的部署步骤可能如下所示:

  - name: Deploy Nuxt.js generated static site to S3 Bucket via AWS CLI
    id: aws-sync
    run: |
      aws s3 sync ../dist/ s3://$(pulumi stack output bucketName) --acl public-read
      echo "::set-output name=s3_url::http://$(pulumi stack output bucketUrl)"
    working-directory: ./deployment

这里有两个关键点:首先我们应该在部署步骤中使用 id 来定义一个我们可以通过 environment:url 中的 step_name 轻松访问的步骤名称。第二个 使用 echo "::set-output name=s3_url::http://$(pulumi stack output bucketUrl)"。在此示例中,我创建了一个变量 s3_url。您可以将 pulumi stack output bucketUrl 替换为您喜欢的任何其他命令或您使用的工具,它会响应您的动态环境 url.

还要确保添加 http://https:// 以防止出现如下错误消息:

Environment URL 'microservice-ui-nuxt-js-hosting-bucket-bc75fce.s3-website.eu-central-1.amazonaws.com' is not a valid http(s) URL, so it will not be shown as a link in the workflow graph.

现在 ci.yml 顶部的 environment 定义可以访问部署步骤中的 s3_url 输出变量,如下所示:

jobs:
  ci:
    runs-on: ubuntu-latest

    environment:
      name: microservice-ui-nuxt-js-deployment
      url: ${{ steps.aws-sync.outputs.s3_url }}

    steps:
      - name: Checkout
        ...

使用 steps.aws-sync 我们直接引用部署步骤,因为我们使用 id 定义了它。附加的 .outputs.s3_url 然后直接引用包含我们的 S3 url 的变量。如果您正确定义了所有内容,GitHub 操作 UI 将直接在完成的作业下方渲染环境 URL:

这里还有a fully working workflow embedded inside a example project.