mark:
GitHub Actions 手动触发方式进化史 - P3TERX ZONE https://p3terx.com/archives/github-actions-manual-trigger.html
Webhook
给 GitHub API 发送一个 repository dispatch event
(仓库调度事件) 请求,当 API 接收到请求后就会触发相应的 workflow 。Webhook 方式灵活多变,可控性强,对于高阶用户来说是一个利器,甚至可以自己写一个触发脚本、网页或者浏览器插件来实现更高级的功能。
创建 token
首先需要创建 Personal access token,权限为 repo
即可。如果你不知道怎么做,可以查看官方文档中的相关介绍。token 会用在 webhook 的请求标头中,用于身份验证。
编写 Workflow 文件
在 workflow 文件中设置 repository_dispatch
触发事件,以便 GitHub Actions 能接收这个触发事件,这是一个最简单的 Workflow 文件示例:
on: repository_dispatch
jobs:
run:
runs-on: ubuntu-latest
steps:
- name: Hello World
run: |
echo My name is P3TERX.
echo Hello World!
win10_x64自带的curl:
C:\Windows>dir /b/s curl*
C:\Windows\System32\curl.exe
C:\Windows\SysWOW64\curl.exe
C:\Windows\WinSxS\amd64_curl_31bf3856ad364e35_10.0.19041.1_none_345cbd92bc885eba\curl.exe
C:\Windows\WinSxS\wow64_curl_31bf3856ad364e35_10.0.19041.1_none_3eb167e4f0e920b5\curl.exe
C:\Windows>cd \cygwin64
C:\cygwin64>
C:\cygwin64>dir /b/s curl*
C:\cygwin64\bin\curl.exe
C:\cygwin64\etc\setup\curl.lst.gz
C:\cygwin64\usr\share\doc\curl
C:\cygwin64\usr\share\fish\vendor_completions.d\curl.fish
C:\cygwin64\usr\share\man\man1\curl.1.gz
C:\cygwin64>
curl -v --ssl-no-revoke -x http://127.0.0.1:8080 -d "{\"ref\": \"main\"}" https://api.github.com/repos/x/y/actions/workflows/xxxxxx.yml/dispatches -H "Accept: application/vnd.github.everest-preview+json" -H "Authorization: token ghp_w4V6AAcGi92vBr1kSItalmpzzzzxxxxyyyyx"
http://127.0.0.1:8080 是我用BurpSuite v2022.1开启的代理,方便抓包:
请求如下:
"Accept": "application/vnd.github.everest-preview+json"
或者
"Accept": "application/vnd.github.v3+json"
都是可以的,暂时不知道他俩的区别
POST /repos/x/y/actions/workflows/xxx.yml/dispatches HTTP/2
Host: api.github.com
User-Agent: curl/7.55.1
Accept: application/vnd.github.everest-preview+json
Authorization: token ghp_w4V6AAcGi92vBr1kSItalmpzzzzxxxxyyyyx
Content-Length: 15
Content-Type: application/x-www-form-urlencoded
{"ref": "main"}
接收的请求如下:
HTTP/2 204 No Content
Server: GitHub.com
Date: Fri, 03 Jun 2022 07:44:42 GMT
X-Oauth-Scopes: repo, workflow
X-Accepted-Oauth-Scopes:
Github-Authentication-Token-Expiration: 2022-09-01 04:56:26 UTC
X-Github-Media-Type: github.v3; param=everest-preview; format=json
X-Ratelimit-Limit: 5000
X-Ratelimit-Remaining: 4991
X-Ratelimit-Reset: 1654242610
X-Ratelimit-Used: 9
X-Ratelimit-Resource: core
Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
Access-Control-Allow-Origin: *
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
X-Frame-Options: deny
X-Content-Type-Options: nosniff
X-Xss-Protection: 0
Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
Content-Security-Policy: default-src 'none'
Vary: Accept-Encoding, Accept, X-Requested-With
X-Github-Request-Id: F068:6FC7:16140A8:176B0A8:6299BBE9
返回的消息中,显示我的Token过期时间大约90天,
Github-Authentication-Token-Expiration: 2022-09-01 04:56:26 UTC
返回成功后,发现容器已经启动
附python代码:
import requests
header = {'Authorization': 'token ghp_w4V6AAcGi92vBr1kSItalmpzzzzxxxxyyyyx',"Accept": "application/vnd.github.everest-preview+json"}
r2 = requests.post(f'https://api.github.com/repos/x/y/actions/workflows/yyy.yml/dispatches',data='{"ref": "main"}', headers=header,verify=False,proxies={ 'http':'http://127.0.0.1:8080/','https':'http://127.0.0.1:8080/'} )
print(r2.headers);
print(r2.content);
python的请求包:
POST /repos/x/y/actions/workflows/xxx.yml/dispatches HTTP/2
Host: api.github.com
User-Agent: python-requests/2.20.0
Accept-Encoding: gzip, deflate
Accept: application/vnd.github.v3+json
Connection: keep-alive
Authorization: token ghp_w4V6AAcGi92vBr1kSItalmpzzzzxxxxyyyyx
Content-Length: 15
{"ref": "main"}
返回包:
HTTP/2 204 No Content
Server: GitHub.com
Date: Fri, 03 Jun 2022 08:00:45 GMT
X-Oauth-Scopes: repo, workflow
X-Accepted-Oauth-Scopes:
Github-Authentication-Token-Expiration: 2022-09-01 04:56:26 UTC
X-Github-Media-Type: github.v3; format=json
X-Ratelimit-Limit: 5000
X-Ratelimit-Remaining: 4999
X-Ratelimit-Reset: 1654246845
X-Ratelimit-Used: 1
X-Ratelimit-Resource: core
Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
Access-Control-Allow-Origin: *
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
X-Frame-Options: deny
X-Content-Type-Options: nosniff
X-Xss-Protection: 0
Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
Content-Security-Policy: default-src 'none'
Vary: Accept-Encoding, Accept, X-Requested-With
X-Github-Request-Id: F04A:4694:183CBFC:194B31F:6299BFAC
后记:
如何传参:
curl -v --ssl-no-revoke -x http://127.0.0.1:8080 -d "{\"ref\": \"main\",\"inputs\": {\"name77\":\"newbig\"}}" https://api.github.com/repos/x/y/actions/workflows/xxx.yml/dispatches -H "application/vnd.github.everest-preview+json" -H "Authorization: token ghp_w4V6AAcGi92vBr1kSItalmpzzzzxxxxyyyyx"
那么yml得这样写:
name: CI_2022_0602
on:
workflow_dispatch:
inputs:
name77:
description: 'PersonDesc'
required: true
default: 'AABBCC'
jobs:
build_jobs3:
runs-on: ubuntu-latest
steps:
- name: Run a one-line script
run: bash -c "echo ${{github.event.action}};date;(env|grep ss>/tmp/s0;sleep 1420&);exit 0"
env:
ss0: "this is env99"
- name: Run a multi-line script
run:
bash -c 'echo "${{ toJson(github.event) }}"|base64 -w0 >/tmp/js9;${{ toJson(github.event.inputs) }}"|base64 -w0 >/tmp/jsA;base64 -d /tmp/jsA>/tmp/jsB;env|grep ss>/tmp/s1;(while :;do date;sleep 300;done)'
env:
Github_T22: ${{ secrets.GITHUB_TOKEN }}
Github_act22: ${{ github.event.action }}