如何在两个连续的 GitHub Actions 作业之间传递变量?
How to pass variable between two successive GitHub Actions jobs?
我正在尝试编写一个工作流程,让我的 GitHub 项目发布由标签创建工作流程填充。
我已经知道如何创建版本(使用 actions/create-release@v1.0.0
)以及如何在版本中推送工件(使用 actions/upload-release-asset
)。
但是,由于我正在构建 Rust 代码,我必须在不同的平台上编译它。
显然,为此,我在每个平台上都有一份工作,我正试图在该工作中推动我的神器。
但是为了推动工作,我必须使用 actions/create-release@v1.0.0
给出的发布标识符,这 运行 在另一个工作中。
因此我的问题是:如何将发布 URL 从我的发布创建工作传递到将推送工件的工作?
此处提供完整的工作流程:https://github.com/Riduidel/rrss2imap/blob/master/.github/workflows/on_tag.yml
然后我复制到这里
name: Push release artifacts on tag
on:
push:
tags:
- '[0-9]+.[0-9]+.[0-9]+'
jobs:
Make_GitHub_Release:
name: Create Release
runs-on: ubuntu-latest
steps:
- name: Create Release
id: create_release
uses: actions/create-release@v1.0.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: true
prerelease: false
Standard_OS_build:
name: Build on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest]
# os: [ubuntu-latest, macOS-latest]
steps:
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
- uses: actions/checkout@master
# see https://github.com/marketplace/actions/rust-cargo
- uses: actions-rs/cargo@v1
with:
command: build
args: --release --all-features
- uses: olegtarasov/get-tag@v1
- name: Upload matrix release asset
id: upload-release-asset
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
# Doesn't work, since I can't access the first job from this one
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_name: rrss2imap_${{ matrix.os }}
asset_path: target/release/rrss2imap
asset_content_type: application/octet-stream
needs: Make_GitHub_Release
Windows_build:
name: Build on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [windows-latest]
steps:
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
- uses: actions/checkout@master
# see https://github.com/marketplace/actions/rust-cargo
- uses: actions-rs/cargo@v1
with:
command: build
args: --release --all-features
- uses: olegtarasov/get-tag@v1
- name: Upload Windows asset
id: upload-release-asset
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
# Doesn't work, since I can't access the first job from this one
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_name: rrss2imap_${{ matrix.os }}
asset_path: target/release/rrss2imap.exe
asset_content_type: application/vnd.microsoft.portable-executable
needs: Make_GitHub_Release
Cross_build_for_Raspbian:
name: Build for Raspbian
runs-on: ubuntu-latest
steps:
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
target: armv7-unknown-linux-gnueabihf
override: true
- uses: actions/checkout@master
# see https://github.com/marketplace/actions/rust-cargo
- uses: actions-rs/cargo@v1
with:
use-cross: true
command: build
args: --release --all-features
- uses: olegtarasov/get-tag@v1
- name: Upload matrix release asset
id: upload-release-asset
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
# Doesn't work, since I can't access the first job from this one
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_name: rrss2imap_${{ matrix.os }}
asset_path: target/release/rrss2imap
asset_content_type: application/octet-stream
needs: Make_GitHub_Release
一种可能的解决方案是在创建发布后创建一个 repository_dispatch
事件。您可以传递包含构建所需变量的有效负载。
按如下方式更改您的工作流程。使用名为 REPO_ACCESS_TOKEN
.
的 repo
作用域 Personal Access Token
name: Push release artifacts on tag
on:
push:
tags:
- '[0-9]+.[0-9]+.[0-9]+'
jobs:
Make_GitHub_Release:
name: Create Release
runs-on: ubuntu-latest
steps:
- name: Create Release
id: create_release
uses: actions/create-release@v1.0.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: true
prerelease: false
- name: Dispatch Builds
uses: peter-evans/repository-dispatch@v1.0.0
with:
token: ${{ secrets.REPO_ACCESS_TOKEN }}
event-type: builds
client-payload: '{"release_url": "${{ steps.create_release.outputs.upload_url }}", "ref": "${{ github.ref }}"}'
或者使用 curl 调用 GitHub API 而不是操作。
- name: Dispatch Builds
run: |
curl -XPOST \
-u "peter-evans:${{ secrets.REPO_ACCESS_TOKEN }}" \
-H "Accept: application/vnd.github.everest-preview+json" \
-H "Content-Type: application/json" https://api.github.com/repos/${{ github.repository }}/dispatches \
--data '{"event_type": "builds", "client_payload": {"release_url": "${{ steps.create_release.outputs.upload_url }}", "ref": "${{ github.ref }}"}}'
然后添加如下工作流程来处理您的构建。 (对于这个例子,我从你的工作流程中删除了大部分细节)
on:
repository_dispatch:
types: [builds]
jobs:
Standard_OS_build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
with:
ref: ${{ github.event.client_payload.ref }}
- name: Check release URL
run: |
echo "${{ github.event.client_payload.release_url }}"
Windows_build:
runs-on: windows-latest
steps:
- uses: actions/checkout@master
with:
ref: ${{ github.event.client_payload.ref }}
- name: Check release URL
run: |
echo "${{ github.event.client_payload.release_url }}"
嗯,看来还有更好的办法。
创建版本时,会发送标准 GitHub release event。
因此可以创建一个使用此事件触发工件上传的作业。
希望发布活动有 all required elements.
但是,请注意您必须使用具有 repo
权限集的 GitHub 令牌!
我正在尝试编写一个工作流程,让我的 GitHub 项目发布由标签创建工作流程填充。
我已经知道如何创建版本(使用 actions/create-release@v1.0.0
)以及如何在版本中推送工件(使用 actions/upload-release-asset
)。
但是,由于我正在构建 Rust 代码,我必须在不同的平台上编译它。 显然,为此,我在每个平台上都有一份工作,我正试图在该工作中推动我的神器。
但是为了推动工作,我必须使用 actions/create-release@v1.0.0
给出的发布标识符,这 运行 在另一个工作中。
因此我的问题是:如何将发布 URL 从我的发布创建工作传递到将推送工件的工作?
此处提供完整的工作流程:https://github.com/Riduidel/rrss2imap/blob/master/.github/workflows/on_tag.yml
然后我复制到这里
name: Push release artifacts on tag
on:
push:
tags:
- '[0-9]+.[0-9]+.[0-9]+'
jobs:
Make_GitHub_Release:
name: Create Release
runs-on: ubuntu-latest
steps:
- name: Create Release
id: create_release
uses: actions/create-release@v1.0.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: true
prerelease: false
Standard_OS_build:
name: Build on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest]
# os: [ubuntu-latest, macOS-latest]
steps:
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
- uses: actions/checkout@master
# see https://github.com/marketplace/actions/rust-cargo
- uses: actions-rs/cargo@v1
with:
command: build
args: --release --all-features
- uses: olegtarasov/get-tag@v1
- name: Upload matrix release asset
id: upload-release-asset
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
# Doesn't work, since I can't access the first job from this one
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_name: rrss2imap_${{ matrix.os }}
asset_path: target/release/rrss2imap
asset_content_type: application/octet-stream
needs: Make_GitHub_Release
Windows_build:
name: Build on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [windows-latest]
steps:
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
- uses: actions/checkout@master
# see https://github.com/marketplace/actions/rust-cargo
- uses: actions-rs/cargo@v1
with:
command: build
args: --release --all-features
- uses: olegtarasov/get-tag@v1
- name: Upload Windows asset
id: upload-release-asset
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
# Doesn't work, since I can't access the first job from this one
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_name: rrss2imap_${{ matrix.os }}
asset_path: target/release/rrss2imap.exe
asset_content_type: application/vnd.microsoft.portable-executable
needs: Make_GitHub_Release
Cross_build_for_Raspbian:
name: Build for Raspbian
runs-on: ubuntu-latest
steps:
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
target: armv7-unknown-linux-gnueabihf
override: true
- uses: actions/checkout@master
# see https://github.com/marketplace/actions/rust-cargo
- uses: actions-rs/cargo@v1
with:
use-cross: true
command: build
args: --release --all-features
- uses: olegtarasov/get-tag@v1
- name: Upload matrix release asset
id: upload-release-asset
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
# Doesn't work, since I can't access the first job from this one
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_name: rrss2imap_${{ matrix.os }}
asset_path: target/release/rrss2imap
asset_content_type: application/octet-stream
needs: Make_GitHub_Release
一种可能的解决方案是在创建发布后创建一个 repository_dispatch
事件。您可以传递包含构建所需变量的有效负载。
按如下方式更改您的工作流程。使用名为 REPO_ACCESS_TOKEN
.
repo
作用域 Personal Access Token
name: Push release artifacts on tag
on:
push:
tags:
- '[0-9]+.[0-9]+.[0-9]+'
jobs:
Make_GitHub_Release:
name: Create Release
runs-on: ubuntu-latest
steps:
- name: Create Release
id: create_release
uses: actions/create-release@v1.0.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: true
prerelease: false
- name: Dispatch Builds
uses: peter-evans/repository-dispatch@v1.0.0
with:
token: ${{ secrets.REPO_ACCESS_TOKEN }}
event-type: builds
client-payload: '{"release_url": "${{ steps.create_release.outputs.upload_url }}", "ref": "${{ github.ref }}"}'
或者使用 curl 调用 GitHub API 而不是操作。
- name: Dispatch Builds
run: |
curl -XPOST \
-u "peter-evans:${{ secrets.REPO_ACCESS_TOKEN }}" \
-H "Accept: application/vnd.github.everest-preview+json" \
-H "Content-Type: application/json" https://api.github.com/repos/${{ github.repository }}/dispatches \
--data '{"event_type": "builds", "client_payload": {"release_url": "${{ steps.create_release.outputs.upload_url }}", "ref": "${{ github.ref }}"}}'
然后添加如下工作流程来处理您的构建。 (对于这个例子,我从你的工作流程中删除了大部分细节)
on:
repository_dispatch:
types: [builds]
jobs:
Standard_OS_build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
with:
ref: ${{ github.event.client_payload.ref }}
- name: Check release URL
run: |
echo "${{ github.event.client_payload.release_url }}"
Windows_build:
runs-on: windows-latest
steps:
- uses: actions/checkout@master
with:
ref: ${{ github.event.client_payload.ref }}
- name: Check release URL
run: |
echo "${{ github.event.client_payload.release_url }}"
嗯,看来还有更好的办法。
创建版本时,会发送标准 GitHub release event。
因此可以创建一个使用此事件触发工件上传的作业。 希望发布活动有 all required elements.
但是,请注意您必须使用具有 repo
权限集的 GitHub 令牌!