Skip to content

Commit 560850c

Browse files
committed
Update release workflow
1 parent 297cce5 commit 560850c

File tree

1 file changed

+171
-20
lines changed

1 file changed

+171
-20
lines changed

.github/workflows/release.yml

Lines changed: 171 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,95 +9,242 @@ on:
99
version_number:
1010
description: 'Release Version Number (Eg, v1.0.0)'
1111
required: true
12+
delete_existing_tag_release:
13+
description: 'Is this a re-release of existing tag/release? (Default: false)'
14+
default: 'false'
15+
required: false
16+
17+
env:
18+
repository_compressed_name: ${{ github.event.repository.name }}-${{ github.event.inputs.version_number }}
19+
repository_zip_name: ${{ github.event.repository.name }}-${{ github.event.inputs.version_number }}.zip
20+
# Some library use different name for library and repository. Version number may use library_name in source file.
21+
library_name: "FreeRTOS+TCP"
22+
# Source folder list for version number updates
23+
source_folder_list: "source test"
1224

1325
jobs:
14-
tag-commit:
26+
clean-existing-tag-and-release:
27+
if: ${{ github.event.inputs.delete_existing_tag_release == 'true' }}
28+
runs-on: ubuntu-latest
29+
env:
30+
VERSION_NUM: ${{ github.event.inputs.version_number }}
31+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
32+
steps:
33+
- name: Checkout code
34+
uses: actions/checkout@v4
35+
36+
- name: Check if tag exists
37+
run: |
38+
git fetch origin
39+
if git tag --list $VERSION_NUM
40+
then
41+
echo "Deleting existing tag for $VERSION_NUM"
42+
git push origin --delete tags/$VERSION_NUM
43+
fi
44+
45+
- name: Check if release exists
46+
run: |
47+
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key 23F3D4EA75716059
48+
sudo apt-add-repository https://cli.github.com/packages
49+
sudo apt update
50+
sudo apt-get install gh
51+
if gh release list | grep $VERSION_NUM
52+
then
53+
echo "Deleting existing release for $VERSION_NUM"
54+
gh release delete --yes $VERSION_NUM
55+
fi
56+
57+
add-sbom-and-tag-commit:
58+
if: ${{ ( github.event.inputs.delete_existing_tag_release == 'true' && success() ) || ( github.event.inputs.delete_existing_tag_release == 'false' && always() ) }}
59+
needs: clean-existing-tag-and-release
1560
name: Tag commit
1661
runs-on: ubuntu-latest
1762
steps:
1863
- name: Checkout code
1964
uses: actions/checkout@v4
2065
with:
2166
ref: ${{ github.event.inputs.commit_id }}
67+
2268
- name: Configure git identity
2369
run: |
2470
git config --global user.name ${{ github.actor }}
2571
git config --global user.email ${{ github.actor }}@users.noreply.github.com
72+
2673
- name: create a new branch that references commit id
2774
run: git checkout -b ${{ github.event.inputs.version_number }} ${{ github.event.inputs.commit_id }}
75+
76+
- name: Update version number in source files
77+
run: |
78+
echo "${{ env.source_folder_list }}" | \
79+
xargs -n 1 sh -c \
80+
'find $1 -type f \( -name "*.c" -o -name "*.h" \) \
81+
-exec sed -i -b -E "0,/^ \* ${{ env.library_name }}/s/^ \* ${{ env.library_name }}.*/ \* ${{ env.library_name }} ${{ github.event.inputs.version_number }}/g" {} +'
82+
git add .
83+
git commit -m '[AUTO][RELEASE]: Update version number in source files'
84+
git push -u origin ${{ github.event.inputs.version_number }}
85+
86+
- name : Update version number in manifest.yml
87+
run: |
88+
sed -i -b '0,/^version/s/^version.*/version: "${{ github.event.inputs.version_number }}"/g' ./manifest.yml
89+
git add .
90+
git commit -m '[AUTO][RELEASE]: Update version number in manifest.yml'
91+
git push -u origin ${{ github.event.inputs.version_number }}
92+
93+
- name : Update version number in doxygen
94+
run: |
95+
sed -i -b 's/PROJECT_NUMBER *=.*/PROJECT_NUMBER = ${{ github.event.inputs.version_number }}/g' ./docs/doxygen/config.doxyfile
96+
git add .
97+
git commit -m '[AUTO][RELEASE]: Update version number in doxygen'
98+
git push -u origin ${{ github.event.inputs.version_number }}
99+
100+
- name : Update MQTT version number macro
101+
if: ${{ github.event.repository.name == 'coreMQTT' }}
102+
run: |
103+
sed -i -b 's/^\#define MQTT_LIBRARY_VERSION .*/\#define MQTT_LIBRARY_VERSION "${{ github.event.inputs.version_number }}"/g' source/include/core_mqtt.h
104+
git add .
105+
git commit -m '[AUTO][RELEASE]: Update version number macro in source/include/core_mqtt.h'
106+
git push -u origin ${{ github.event.inputs.version_number }}
107+
28108
- name: Generate SBOM
29109
uses: FreeRTOS/CI-CD-Github-Actions/sbom-generator@main
30110
with:
31111
repo_path: ./
32112
source_path: ./source
113+
33114
- name: commit SBOM file
34115
run: |
35116
git add .
36117
git commit -m 'Update SBOM'
37118
git push -u origin ${{ github.event.inputs.version_number }}
119+
38120
- name: Tag Commit and Push to remote
39121
run: |
40-
git tag ${{ github.event.inputs.version_number }} -a -m "FreeRTOS-Plus-TCP Library ${{ github.event.inputs.version_number }}"
122+
git tag ${{ github.event.inputs.version_number }} -a -m "${{ github.event.repository.name }} Library ${{ github.event.inputs.version_number }}"
41123
git push origin --tags
124+
42125
- name: Verify tag on remote
43126
run: |
44127
git tag -d ${{ github.event.inputs.version_number }}
45128
git remote update
46129
git checkout tags/${{ github.event.inputs.version_number }}
47130
git diff ${{ github.event.inputs.commit_id }} tags/${{ github.event.inputs.version_number }}
131+
48132
create-zip:
49-
needs: tag-commit
133+
if: ${{ ( github.event.inputs.delete_existing_tag_release == 'true' && success() ) || ( github.event.inputs.delete_existing_tag_release == 'false' && always() ) }}
134+
needs: add-sbom-and-tag-commit
50135
name: Create ZIP and verify package for release asset.
51136
runs-on: ubuntu-latest
52137
steps:
53138
- name: Install ZIP tools
54139
run: sudo apt-get install zip unzip
140+
55141
- name: Checkout code
56142
uses: actions/checkout@v4
57143
with:
58-
ref: ${{ github.event.inputs.commit_id }}
59-
path: FreeRTOS-Plus-TCP
144+
ref: ${{ github.event.inputs.version_number }}
145+
path: ${{ github.event.repository.name }}
60146
submodules: recursive
147+
61148
- name: Checkout disabled submodules
62149
run: |
63-
cd FreeRTOS-Plus-TCP
150+
cd ${{ github.event.repository.name }}
64151
git submodule update --init --checkout --recursive
152+
65153
- name: Create ZIP
66154
run: |
67-
zip -r FreeRTOS-Plus-TCP-${{ github.event.inputs.version_number }}.zip FreeRTOS-Plus-TCP -x "*.git*"
155+
zip -r ${{ env.repository_zip_name }} ${{ github.event.repository.name }} -x "*.git*"
68156
ls ./
157+
69158
- name: Validate created ZIP
70159
run: |
71160
mkdir zip-check
72-
mv FreeRTOS-Plus-TCP-${{ github.event.inputs.version_number }}.zip zip-check
161+
mv ${{ env.repository_zip_name }} zip-check
73162
cd zip-check
74-
unzip FreeRTOS-Plus-TCP-${{ github.event.inputs.version_number }}.zip -d FreeRTOS-Plus-TCP-${{ github.event.inputs.version_number }}
75-
ls FreeRTOS-Plus-TCP-${{ github.event.inputs.version_number }}
76-
diff -r -x "*.git*" FreeRTOS-Plus-TCP-${{ github.event.inputs.version_number }}/FreeRTOS-Plus-TCP/ ../FreeRTOS-Plus-TCP/
163+
unzip ${{ env.repository_zip_name }} -d ${{ env.repository_compressed_name }}
164+
ls ${{ env.repository_compressed_name }}
165+
diff -r -x "*.git*" ${{ env.repository_compressed_name }}/${{ github.event.repository.name }}/ ../${{ github.event.repository.name }}/
77166
cd ../
167+
168+
- name: Check version number in source files
169+
run: |
170+
cd zip-check/${{ env.repository_compressed_name }}/${{ github.event.repository.name }}
171+
172+
# List all the *.h *.c files in <source_folder_list>
173+
SOURCE_FILE_LIST=$( echo "${{ env.source_folder_list }}" | \
174+
xargs -n 1 sh -c 'find $1 -type f \( -name "*.c" -o -name "*.h" \)' )
175+
176+
# List all the files which contain " * <repository_name>.*" in SOURCE_FILE_LIST
177+
SOURCE_FILE_WITH_VERSION_LIST=$( grep -l " \* ${{ github.event.repository.name }}.*" $SOURCE_FILE_LIST )
178+
179+
# Compare the <version_number> with input version number in files in SOURCE_FILE_LIST
180+
echo $SOURCE_FILE_WITH_VERSION_LIST | xargs -I{} sh -c \
181+
'grep -x " \* ${{ github.event.repository.name }} ${{ github.event.inputs.version_number }}" {} && \
182+
echo {} : match ${{ github.event.repository.name }} ${{ github.event.inputs.version_number }} || \
183+
{ echo "{} : ${{ github.event.repository.name }} ${{ github.event.inputs.version_number }} not found"; exit 255; }'
184+
185+
- name: Check version number in doxygen
186+
run: |
187+
cd zip-check/${{ env.repository_compressed_name }}/${{ github.event.repository.name }}
188+
189+
# find "PROJECT_NUMBER = <version_number>"
190+
DOXYGEN_VERSION_NUMBER=$(grep -x "[ ]*PROJECT_NUMBER[ ]*=[ ]*[^ ]*[ ]*" docs/doxygen/config.doxyfile | awk -F= '{gsub(" ","",$2); print $2 }');
191+
192+
# compare the <version_number> with input version number
193+
[[ $DOXYGEN_VERSION_NUMBER == "${{ github.event.inputs.version_number }}" ]] \
194+
&& echo "config.doxyfile : match ${{ github.event.inputs.version_number }}" \
195+
|| { echo "config.doxyfile : $DOXYGEN_VERSION_NUMBER doesn't match ${{ github.event.inputs.version_number }}"; exit 255; }
196+
197+
- name: Check version number in manifest.yml
198+
run: |
199+
cd zip-check/${{ env.repository_compressed_name }}/${{ github.event.repository.name }}
200+
201+
# find the first occurence of "version: <version_number>" and comare the <version_number> with input version number
202+
MANIFEST_VESION_NUMBER=$( grep -m 1 -E "^version:[ ]*\".*\"[ ]*" manifest.yml | awk -F: '{ gsub(" ","",$2); gsub("\"","",$2); print $2 }' );
203+
204+
# compare the <version_number> with input version number
205+
[[ $MANIFEST_VESION_NUMBER == "${{ github.event.inputs.version_number }}" ]] \
206+
&& echo "manifest.yml : match ${{ github.event.inputs.version_number }}" \
207+
|| { echo "manifest.yml : $MANIFEST_VESION_NUMBER doesn't match ${{ github.event.inputs.version_number }}"; exit 255; }
208+
209+
- name: Check MQTT version number macro in header file
210+
if: ${{ github.event.repository.name == 'coreMQTT' }}
211+
run: |
212+
cd zip-check/${{ env.repository_compressed_name }}/${{ github.event.repository.name }}
213+
214+
# find "#define MQTT_LIBRARY_VERSION <version_number>" in core_mqtt.h
215+
MACRO_VERSION_NUMBER=$(grep -x "^\#define[ ]*MQTT_LIBRARY_VERSION[ ]*\".*\"[ ]*" source/include/core_mqtt.h | awk '{gsub("\"","",$3); print $3 }');
216+
217+
# compare the <version_number> with input version number
218+
[[ $MACRO_VERSION_NUMBER == "${{ github.event.inputs.version_number }}" ]] \
219+
&& echo "core_mqtt.h : match ${{ github.event.inputs.version_number }}" \
220+
|| { echo "core_mqtt.h : $MACRO_VERSION_NUMBER doesn't match ${{ github.event.inputs.version_number }}"; exit 255; }
221+
78222
- name: Build
79223
run: |
80-
cd zip-check/FreeRTOS-Plus-TCP-${{ github.event.inputs.version_number }}/FreeRTOS-Plus-TCP
224+
cd zip-check/${{ env.repository_compressed_name }}/${{ github.event.repository.name }}
81225
sudo apt-get install -y lcov
82226
sudo apt-get install unifdef
83227
cmake -S test/unit-test -B test/unit-test/build/
84228
make -C test/unit-test/build/ all
85229
- name: Test
86230
run: |
87-
cd zip-check/FreeRTOS-Plus-TCP-${{ github.event.inputs.version_number }}/FreeRTOS-Plus-TCP
231+
cd zip-check/${{ env.repository_compressed_name }}/${{ github.event.repository.name }}
88232
pushd test/unit-test/build/
89233
ctest -E system --output-on-failure
90234
popd
91235
make -C test/unit-test/build/ coverage
92236
lcov --list --rc lcov_branch_coverage=1 test/unit-test/build/coverage.info
93237
cd ..
238+
94239
- name: Create artifact of ZIP
95240
uses: actions/upload-artifact@v4
96241
with:
97-
name: FreeRTOS-Plus-TCP-${{ github.event.inputs.version_number }}.zip
98-
path: zip-check/FreeRTOS-Plus-TCP-${{ github.event.inputs.version_number }}.zip
242+
name: ${{ env.repository_zip_name }}
243+
path: zip-check/${{ env.repository_zip_name }}
244+
99245
deploy-doxygen:
100-
needs: tag-commit
246+
needs: add-sbom-and-tag-commit
247+
if: ${{ ( github.event.inputs.delete_existing_tag_release == 'true' && success() ) || ( github.event.inputs.delete_existing_tag_release == 'false' && always() ) }}
101248
name: Deploy doxygen documentation
102249
runs-on: ubuntu-latest
103250
steps:
@@ -106,10 +253,12 @@ jobs:
106253
with:
107254
ref: ${{ github.event.inputs.version_number }}
108255
add_release: "true"
256+
109257
create-release:
110258
needs:
111259
- create-zip
112260
- deploy-doxygen
261+
if: ${{ ( github.event.inputs.delete_existing_tag_release == 'true' && success() ) || ( github.event.inputs.delete_existing_tag_release == 'false' && always() ) }}
113262
name: Create Release and Upload Release Asset
114263
runs-on: ubuntu-latest
115264
steps:
@@ -121,22 +270,24 @@ jobs:
121270
with:
122271
tag_name: ${{ github.event.inputs.version_number }}
123272
release_name: ${{ github.event.inputs.version_number }}
124-
body: Release ${{ github.event.inputs.version_number }} of the FreeRTOS-Plus-TCP Library.
273+
body: Release ${{ github.event.inputs.version_number }} of the ${{ github.event.repository.name }} Library.
125274
draft: false
126275
prerelease: false
276+
127277
- name: Download ZIP artifact
128278
uses: actions/download-artifact@v4
129279
with:
130-
name: FreeRTOS-Plus-TCP-${{ github.event.inputs.version_number }}.zip
280+
name: ${{ env.repository_zip_name }}
281+
131282
- name: Upload Release Asset
132283
id: upload-release-asset
133284
uses: actions/upload-release-asset@v1
134285
env:
135286
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
136287
with:
137288
upload_url: ${{ steps.create_release.outputs.upload_url }}
138-
asset_path: ./FreeRTOS-Plus-TCP-${{ github.event.inputs.version_number }}.zip
139-
asset_name: FreeRTOS-Plus-TCP-${{ github.event.inputs.version_number }}.zip
289+
asset_path: ./${{ env.repository_zip_name }}
290+
asset_name: ${{ env.repository_zip_name }}
140291
asset_content_type: application/zip
141292
cleanup:
142293
needs:

0 commit comments

Comments
 (0)