1+ name : cron-update
2+
3+ on :
4+ workflow_dispatch :
5+ schedule :
6+ - cron : " 0 5 * * *"
7+
8+ jobs :
9+ cron-update :
10+ runs-on : ubuntu-latest
11+
12+ permissions :
13+ actions : read
14+ contents : write
15+
16+ steps :
17+ - name : init / checkout
18+ uses : actions/checkout@85e6279cec87321a52edac9c87bce653a07cf6c2
19+ with :
20+ ref : ' master'
21+ fetch-depth : 0
22+
23+ - name : cron-update / get latest version
24+ run : |
25+ echo "LATEST_VERSION=$(curl -s https://api.github.com/repos/11notes/fork-py-kms/releases/latest | jq -r '.tag_name' | sed 's/v//')" >> "${GITHUB_ENV}"
26+ echo "LATEST_TAG=$(git describe --abbrev=0 --tags `git rev-list --tags --max-count=1` | sed 's/v//')" >> "${GITHUB_ENV}"
27+
28+ - name : cron-update / setup node
29+ uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
30+ with :
31+ node-version : ' 20'
32+ - run : npm i semver
33+
34+ - name : cron-update / compare latest with current version
35+ uses : actions/github-script@62c3794a3eb6788d9a2a72b219504732c0c9a298
36+ with :
37+ script : |
38+ const { existsSync, readFileSync, writeFileSync } = require('node:fs');
39+ const { resolve } = require('node:path');
40+ const { inspect } = require('node:util');
41+ const semver = require('semver')
42+ const repository = {dot:{}};
43+
44+ try{
45+ const path = resolve('.json');
46+ if(existsSync(path)){
47+ try{
48+ repository.dot = JSON.parse(readFileSync(path).toString());
49+ }catch(e){
50+ throw new Error('could not parse .json');
51+ }
52+ }else{
53+ throw new Error('.json does not exist');
54+ }
55+ }catch(e){
56+ core.setFailed(e);
57+ }
58+
59+ const latest = semver.valid(semver.coerce('${{ env.LATEST_VERSION }}'));
60+ const current = semver.valid(semver.coerce(repository.dot.semver.version));
61+ const tag = semver.valid(semver.coerce('${{ env.LATEST_TAG }}'));
62+
63+ if(latest && latest !== current){
64+ core.info(`new ${semver.diff(current, latest)} release found (${latest})!`)
65+ repository.dot.semver.version = latest;
66+ if(tag){
67+ core.exportVariable('WORKFLOW_NEW_TAG', semver.inc(tag, semver.diff(current, latest)));
68+ }
69+
70+ if(repository.dot.semver?.latest){
71+ repository.dot.semver.latest = repository.dot.semver.version;
72+ }
73+
74+ if(repository.dot?.readme?.comparison?.image){
75+ repository.dot.readme.comparison.image = repository.dot.readme.comparison.image.replace(current, repository.dot.semver.version);
76+ }
77+
78+ try{
79+ writeFileSync(resolve('.json'), JSON.stringify(repository.dot, null, 2));
80+ core.exportVariable('WORKFLOW_AUTO_UPDATE', true);
81+ }catch(e){
82+ core.setFailed(e);
83+ }
84+ }else{
85+ core.info('no new release found');
86+ }
87+
88+ core.info(inspect(repository.dot, {showHidden:false, depth:null, colors:true}));
89+
90+ - name : cron-update / checkout
91+ id : checkout
92+ if : env.WORKFLOW_AUTO_UPDATE == 'true'
93+ run : |
94+ git config user.name "github-actions[bot]"
95+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
96+ git add .json
97+ git commit -m "[upgrade] ${{ env.LATEST_VERSION }}"
98+ git push origin HEAD:master
99+
100+ - name : cron-update / tag
101+ if : env.WORKFLOW_AUTO_UPDATE == 'true' && steps.checkout.outcome == 'success'
102+ run : |
103+ SHA256=$(git rev-list --branches --max-count=1)
104+ git tag -a v${{ env.WORKFLOW_NEW_TAG }} -m "v${{ env.WORKFLOW_NEW_TAG }}" ${SHA256}
105+ git push --follow-tags
106+
107+ - name : cron-update / build docker image
108+ if : env.WORKFLOW_AUTO_UPDATE == 'true' && steps.checkout.outcome == 'success'
109+ uses : the-actions-org/workflow-dispatch@3133c5d135c7dbe4be4f9793872b6ef331b53bc7
110+ with :
111+ workflow : docker.yml
112+ wait-for-completion : false
113+ token : " ${{ secrets.REPOSITORY_TOKEN }}"
114+ inputs : ' { "release":"true", "readme":"true" }'
115+ ref : " v${{ env.WORKFLOW_NEW_TAG }}"
0 commit comments