@@ -2,10 +2,12 @@ name: Update Central Firmware Repository
2
2
3
3
on :
4
4
release :
5
- types : [published]
5
+ types : [published, edited]
6
+ workflow_dispatch :
6
7
7
8
jobs :
8
9
update-central-repo :
10
+ if : ${{ github.event.release.prerelease == false || github.event_name == 'workflow_dispatch' }}
9
11
runs-on : ubuntu-latest
10
12
steps :
11
13
- name : Checkout Repository
@@ -21,27 +23,33 @@ jobs:
21
23
git clone https://all-solutions:${{ secrets.CENTRAL_REPO_TOKEN }}@github.com/all-solutions/Flash2MQTT.git Flash2MQTT
22
24
23
25
- name : Download Firmware Assets
26
+ id : fetch-release
24
27
uses : actions/github-script@v6
25
28
with :
26
29
github-token : ${{ secrets.GITHUB_TOKEN }}
27
30
script : |
28
31
const fs = require('fs');
29
32
const owner = context.repo.owner;
30
33
const repo = context.repo.repo;
31
- const releaseTag = context.payload.release.tag_name;
32
34
33
- // Get the release by tag name
34
- const release = await github.rest.repos.getReleaseByTag({
35
- owner,
36
- repo,
37
- tag: releaseTag,
38
- });
35
+ let release;
36
+ let releaseTag;
37
+
38
+ 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
+ } 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
+ }
39
47
40
- // Filter assets that end with .bin
41
48
const assets = release.data.assets.filter(asset => asset.name.endsWith('.bin'));
42
49
43
50
if (assets.length === 0) {
44
51
core.setFailed('No .bin assets found in the release.');
52
+ return;
45
53
}
46
54
47
55
for (const asset of assets) {
@@ -53,84 +61,61 @@ jobs:
53
61
Accept: 'application/octet-stream',
54
62
},
55
63
});
56
-
57
- // Write the asset to a file
58
64
fs.writeFileSync(asset.name, Buffer.from(download.data));
59
65
console.log(`Downloaded ${asset.name}`);
60
66
}
61
67
68
+ core.setOutput('tag', releaseTag);
69
+
62
70
- name : List Downloaded Files
63
71
run : ls -la
64
72
65
73
- name : Copy Firmware Files
66
74
run : |
67
75
mkdir -p Flash2MQTT/firmware/${{ github.event.repository.name }}
76
+ rm -f Flash2MQTT/firmware/${{ github.event.repository.name }}/*.bin
68
77
cp *.bin Flash2MQTT/firmware/${{ github.event.repository.name }}/
78
+ echo "Updated at $(date -u)" > Flash2MQTT/firmware/${{ github.event.repository.name }}/last_update.txt
69
79
70
80
- name : Install jq
71
81
run : sudo apt-get update && sudo apt-get install -y jq
72
82
73
83
- name : Update variants.json and firmware_list.json
74
84
env :
75
85
FIRMWARE_NAME : ${{ github.event.repository.name }}
76
- RELEASE_VERSION : ${{ github.event. release.tag_name }}
86
+ RELEASE_VERSION : ${{ steps.fetch- release.outputs.tag }}
77
87
run : |
78
88
cd Flash2MQTT/firmware/${FIRMWARE_NAME}
79
89
ls *.bin > bin_files.txt
80
- # Initialize variables
81
90
total=0
82
91
count=0
83
- # Remove 'v' or 'V' prefix from version if present
84
92
version="${RELEASE_VERSION#v}"
85
93
version="${version#V}"
86
94
echo "Firmware Name: $FIRMWARE_NAME"
87
95
echo "Release Version: $version"
88
- # Determine total number of desired variants
96
+
89
97
echo "Determining total number of desired variants..."
90
98
while read file; do
91
- echo "Processing file: $file"
92
99
if [[ "$file" == *"_${version}.bin" ]]; then
93
- echo "File matches current release version."
94
100
variant_part=$(echo "$file" | sed -E 's/^'"$FIRMWARE_NAME"'_//; s/_'"${version}"'\.bin$//')
95
101
variant_name="${variant_part}"
96
- echo "Extracted variant_name: $variant_name"
97
102
if [[ "$variant_name" == "d1_mini" || "$variant_name" == "esp01_1m" ]]; then
98
- echo "Variant $variant_name is desired. Incrementing total."
99
103
total=$((total + 1))
100
- else
101
- echo "Variant $variant_name is not desired."
102
104
fi
103
- else
104
- echo "File does not match current release version."
105
105
fi
106
106
done < bin_files.txt
107
- echo "Total desired variants: $total"
108
107
109
- # Start building variants.json
110
108
echo '[' > variants.json
111
- # Process files and create variants.json
112
- echo "Building variants.json..."
113
109
while read file; do
114
- echo "Processing file: $file"
115
110
if [[ "$file" == *"_${version}.bin" ]]; then
116
- echo "File matches current release version."
117
111
variant_part=$(echo "$file" | sed -E 's/^'"$FIRMWARE_NAME"'_//; s/_'"${version}"'\.bin$//')
118
112
variant_name="${variant_part}"
119
- echo "Extracted variant_name: $variant_name"
120
113
case "$variant_name" in
121
- "d1_mini")
122
- display_name="D1 Mini"
123
- ;;
124
- "esp01_1m")
125
- display_name="ESP-01"
126
- ;;
127
- *)
128
- echo "Variant $variant_name is not desired. Skipping."
129
- continue
130
- ;;
114
+ "d1_mini") display_name="D1 Mini" ;;
115
+ "esp01_1m") display_name="ESP-01" ;;
116
+ *) continue ;;
131
117
esac
132
118
count=$((count + 1))
133
- echo "Adding variant $display_name to variants.json."
134
119
echo ' {' >> variants.json
135
120
echo ' "displayName": "'"$display_name"'",' >> variants.json
136
121
echo ' "file": "https://all-solutions.github.io/Flash2MQTT/firmware/'"$FIRMWARE_NAME"'/'"$file"'"' >> variants.json
@@ -139,36 +124,29 @@ jobs:
139
124
else
140
125
echo ' }' >> variants.json
141
126
fi
142
- else
143
- echo "File does not match current release version."
144
127
fi
145
128
done < bin_files.txt
146
129
echo ']' >> variants.json
147
130
rm bin_files.txt
148
131
149
- # Update firmware_list.json
150
132
cd ..
151
- # Install jq if not already installed
152
- if ! command -v jq &> /dev/null; then
153
- sudo apt-get update && sudo apt-get install -y jq
154
- fi
155
- # Initialize firmware_list.json if it doesn't exist
156
133
if [ ! -f firmware_list.json ]; then
157
134
echo '[]' > firmware_list.json
158
135
fi
159
- # Update firmware_list.json
160
136
tmpfile=$(mktemp)
161
137
jq --arg name "$FIRMWARE_NAME" --arg version "$version" \
162
138
'if any(.[]; .name == $name) then map(if .name == $name then .version = $version else . end) else . + [{"name": $name, "version": $version}] end' \
163
139
firmware_list.json > "$tmpfile" && mv "$tmpfile" firmware_list.json
164
140
165
141
- name : Commit and Push Changes
142
+ env :
143
+ RELEASE_VERSION : ${{ steps.fetch-release.outputs.tag }}
166
144
run : |
167
145
cd Flash2MQTT
168
146
git add firmware/${{ github.event.repository.name }}
169
147
git add firmware/firmware_list.json
170
- git commit -m "Update firmware for ${{ github.event.repository.name }} to version $version"
148
+ git commit -m "Update firmware for ${{ github.event.repository.name }} to version $RELEASE_VERSION" || \
149
+ git commit --allow-empty -m "Force update for ${{ github.event.repository.name }} to version $RELEASE_VERSION (no file changes)"
171
150
git pull --rebase origin main
172
151
git push https://all-solutions:${{ secrets.CENTRAL_REPO_TOKEN }}@github.com/all-solutions/Flash2MQTT.git HEAD:main
173
152
174
-
0 commit comments