我正在尝试构建一个 GitHub 工作流,该工作流将在另一个存储库创建新版本时触发。
在文档中,有一段:on.event_name.types
event_name
将被release
。
问题是:有没有办法引用另一个仓库的release
事件?
有没有办法引用另一个仓库的发布事件?
相当确定此功能不存在。
如果您有权访问创建版本的存储库,则可以调用 webhook 事件来触发on: repository_dispatch
工作流以在另一个存储库中运行。 在这种情况下,存储库调度操作会有所帮助。
如果您无权访问创建版本的存储库(我假设这里就是这种情况(,那么这将是我的建议。首先,创建以下工作流,定期检查要跟踪的存储库的发布版本标记。如果它与您当前保存在存储库中的发布版本不同,则将提交新版本。
请注意,您必须先准备目标文件(例如发布版本/swagger-ui-latest.txt(,修改后的文件检查才能正常工作。 此外,必须使用repo
范围的令牌,而不是默认GITHUB_TOKEN
。有关此内容的更多详细信息,请参阅从 GitHub 推送到源操作
name: Get latest release version
on:
schedule:
- cron: '0 10 * * *'
jobs:
get-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
token: ${{ secrets.REPO_SCOPED_TOKEN }}
- name: Fetch release version
run: |
curl -sL https://api.github.com/repos/swagger-api/swagger-ui/releases/latest |
jq -r ".tag_name" > release-versions/swagger-ui-latest.txt
- name: Check for modified files
id: git-check
run: echo ::set-output name=modified::$([ -z "`git status --porcelain`" ] && echo "false" || echo "true")
- name: Commit latest release version
if: steps.git-check.outputs.modified == 'true'
run: |
git config --global user.name 'Your Name'
git config --global user.email 'your-email@users.noreply.github.com'
git commit -am "New release version"
git push
然后,您可以创建第二个工作流,该工作流仅在看到目录release-versions
的任何更改时才运行。
on:
push:
paths:
- 'release-versions/*'
在此工作流中,您可以使用保存的版本来获取所需的资产并执行所需的任何处理。
下面是一个类似的示例,它引发拉取请求而不是立即提交。
name: Trigger automation tests
steps:
- uses: actions/github-script@v6
with:
github-token: ${{ secrets.PERSONAL_TOKEN }}
script: |
await github.rest.actions.createWorkflowDispatch({
owner: '*****',
repo: '*****',
workflow_id: '*****.yml',
ref: 'main'
})
- 在目标存储库中创建个人访问令牌。
- 将此个人访问令牌添加为两个存储库中的机密。
- 创建一个新的工作流或编辑一个已经存在的工作流(yml 文件(。
- 将上述步骤添加到 yml 文件。
所有者=组织/个人gitHub。 存储库 = 要运行的目标存储库。 workflow_id = 目标工作流的 yml 文件名。 ref = 要在目标存储库中运行的 brench
与@peterevans答案类似,我建议创建两个工作流 - 一个定期检查更新,另一个在检测到新版本时触发。
检查更新的工作流可能如下所示:
name: Check for new release of xyz
on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:
jobs:
check:
runs-on: ubuntu-latest
steps:
- name: Download previous release info
id: download-artifact
uses: dawidd6/action-download-artifact@v2 # It's not possible to use actions/upload-artifact as of the time of writing
with:
name: xyz-release-info
workflow_conclusion: success
workflow: publish.yml
if_no_artifact_found: warn
- name: Get latest release
id: get_release
run: |
# Fetch release information and extract the release tag
RELEASE_TAG=$(curl -s https://api.github.com/repos/USER/xyz/releases/latest | jq -r '.tag_name')
echo "release_tag=$RELEASE_TAG" >> $GITHUB_OUTPUT
echo "latest release: $RELEASE_TAG"
- name: Compare with previous release
id: compare_release
run: |
# Read the release info from the downloaded artifact
PREVIOUS_RELEASE=$(cat xyz-release-info 2> /dev/null || echo "NONE")
echo "previous release: $PREVIOUS_RELEASE"
# Compare the fetched release tag with the previous release tag
if [ "${{ steps.get_release.outputs.RELEASE_TAG }}" != "$PREVIOUS_RELEASE" ]; then
echo "release_changed=true" >> $GITHUB_OUTPUT
echo "Release changed: true"
else
echo "release_changed=false" >> $GITHUB_OUTPUT
echo "Release changed: false"
fi
- name: Call workflow to build code
if: steps.compare_release.outputs.release_changed == 'true'
uses: benc-uk/workflow-dispatch@v1
with:
workflow: publish.yml
以及要触发的工作流 (publish.yml(,如下所示:
name: Build
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
...
steps:
...
- name: Get latest release
id: get_release
run: |
# Fetch release information and extract the release tag
RELEASE_TAG=$(curl -s https://api.github.com/repos/USER/xyz/releases/latest | jq -r '.tag_name')
echo "release_tag=$RELEASE_TAG" >> $GITHUB_OUTPUT
echo "latest release: $RELEASE_TAG"
- name: Store artifacts
run: |
# Store the newly fetched release version in a file
echo "${{ steps.get_release.outputs.RELEASE_TAG }}" > xyz-release-info
echo "Saved ${{ steps.get_release.outputs.RELEASE_TAG }} to xyz-release-info"
- name: Upload new artifacts
uses: actions/upload-artifact@v3
with:
name: xyz-release-info
path: xyz-release-info