@@ -2,12 +2,14 @@ name: Update Central Firmware Repository
22
33on :
44 release :
5- types : [published, edited ]
5+ types : [published]
66 workflow_dispatch :
7+ schedule :
8+ - cron : " */20 * * * *" # alle 20 Minuten
79
810jobs :
911 update-central-repo :
10- if : ${{ github.event.release.prerelease == false || github.event_name == 'workflow_dispatch ' }}
12+ if : ${{ ( github.event_name == 'release' && github. event.release.prerelease == false) || github.event_name != 'release ' }}
1113 runs-on : ubuntu-latest
1214 steps :
1315 - name : Checkout Repository
@@ -22,30 +24,48 @@ jobs:
2224 run : |
2325 git clone https://all-solutions:${{ secrets.CENTRAL_REPO_TOKEN }}@github.com/all-solutions/Flash2MQTT.git Flash2MQTT
2426
25- - name : Download Firmware Assets
27+ - name : Check and Download Firmware Assets
2628 id : fetch-release
2729 uses : actions/github-script@v6
2830 with :
2931 github-token : ${{ secrets.GITHUB_TOKEN }}
3032 script : |
3133 const fs = require('fs');
34+ const path = require('path');
3235 const owner = context.repo.owner;
3336 const repo = context.repo.repo;
3437
3538 let release;
3639 let releaseTag;
3740
3841 if (context.eventName === 'release') {
39- releaseTag = context.payload.release.tag_name ;
40- console.log(`Using release tag from event: ${releaseTag}`) ;
41- release = await github.rest.repos.getReleaseByTag({ owner, repo, tag: releaseTag } );
42+ release = context.payload.release;
43+ releaseTag = release.tag_name ;
44+ console.log(`Using release from event: ${ releaseTag}` );
4245 } else {
43- release = await github.rest.repos.getLatestRelease({ owner, repo });
44- releaseTag = release.data.tag_name;
45- console.log(`Using latest release tag: ${releaseTag}`);
46+ const res = await github.rest.repos.getLatestRelease({ owner, repo });
47+ release = res.data;
48+ releaseTag = release.tag_name;
49+ console.log(`Using latest release: ${releaseTag}`);
50+
51+ if (context.eventName === 'schedule') {
52+ const cachePath = path.join(process.cwd(), 'Flash2MQTT', 'release_check.json');
53+ let last = {};
54+ if (fs.existsSync(cachePath)) {
55+ last = JSON.parse(fs.readFileSync(cachePath, 'utf8'));
56+ }
57+
58+ if (last.id === release.id && last.updated_at === release.updated_at) {
59+ console.log('Release unchanged. Skipping.');
60+ core.setOutput('skip', 'true');
61+ return;
62+ }
63+
64+ fs.writeFileSync(cachePath, JSON.stringify({ id: release.id, updated_at: release.updated_at }));
65+ }
4666 }
4767
48- const assets = release.data. assets.filter(asset => asset.name.endsWith('.bin'));
68+ const assets = release.assets.filter(asset => asset.name.endsWith('.bin'));
4969
5070 if (assets.length === 0) {
5171 core.setFailed('No .bin assets found in the release.');
@@ -61,26 +81,35 @@ jobs:
6181 Accept: 'application/octet-stream',
6282 },
6383 });
84+
6485 fs.writeFileSync(asset.name, Buffer.from(download.data));
6586 console.log(`Downloaded ${asset.name}`);
6687 }
6788
6889 core.setOutput('tag', releaseTag);
6990
91+ - name : Skip if not updated
92+ if : ${{ steps.fetch-release.outputs.skip == 'true' }}
93+ run : echo "Release has not changed, skipping workflow."
94+
7095 - name : List Downloaded Files
96+ if : ${{ steps.fetch-release.outputs.skip != 'true' }}
7197 run : ls -la
7298
7399 - name : Copy Firmware Files
100+ if : ${{ steps.fetch-release.outputs.skip != 'true' }}
74101 run : |
75102 mkdir -p Flash2MQTT/firmware/${{ github.event.repository.name }}
76103 rm -f Flash2MQTT/firmware/${{ github.event.repository.name }}/*.bin
77104 cp *.bin Flash2MQTT/firmware/${{ github.event.repository.name }}/
78105 echo "Updated at $(date -u)" > Flash2MQTT/firmware/${{ github.event.repository.name }}/last_update.txt
79106
80107 - name : Install jq
108+ if : ${{ steps.fetch-release.outputs.skip != 'true' }}
81109 run : sudo apt-get update && sudo apt-get install -y jq
82110
83111 - name : Update variants.json and firmware_list.json
112+ if : ${{ steps.fetch-release.outputs.skip != 'true' }}
84113 env :
85114 FIRMWARE_NAME : ${{ github.event.repository.name }}
86115 RELEASE_VERSION : ${{ steps.fetch-release.outputs.tag }}
@@ -91,10 +120,7 @@ jobs:
91120 count=0
92121 version="${RELEASE_VERSION#v}"
93122 version="${version#V}"
94- echo "Firmware Name: $FIRMWARE_NAME"
95- echo "Release Version: $version"
96123
97- echo "Determining total number of desired variants..."
98124 while read file; do
99125 if [[ "$file" == *"_${version}.bin" ]]; then
100126 variant_part=$(echo "$file" | sed -E 's/^'"$FIRMWARE_NAME"'_//; s/_'"${version}"'\.bin$//')
@@ -139,6 +165,7 @@ jobs:
139165 firmware_list.json > "$tmpfile" && mv "$tmpfile" firmware_list.json
140166
141167 - name : Commit and Push Changes
168+ if : ${{ steps.fetch-release.outputs.skip != 'true' }}
142169 env :
143170 RELEASE_VERSION : ${{ steps.fetch-release.outputs.tag }}
144171 run : |
0 commit comments