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.
我发现 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.