1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
|
name: Release
on:
workflow_call:
inputs:
sha:
required: true
type: string
branch:
required: true
type: string
is_rolling_release:
required: true
type: string
secrets:
LIQUIDSOAP_RELEASE_ASSETS_TOKEN:
required: true
jobs:
update_release:
runs-on: depot-ubuntu-24.04-4
steps:
- name: Checkout code
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Download all artifact
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
with:
path: artifacts/${{ inputs.sha }}
- name: List assets to upload
id: release_assets
run: |
echo "release_assets<<EOF" >> $GITHUB_OUTPUT
find artifacts/${{ inputs.sha }} -type f | egrep '\.apk$|\.deb$|\.config|\.zip$' | sort -u >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Generate release notes
id: release_notes
run: |
echo "release_notes<<EOF" >> $GITHUB_OUTPUT
if [ ${{ inputs.is_rolling_release }} = "true" ]; then
cat doc/content/rolling-release.md >> $GITHUB_OUTPUT
fi
echo "" >> $GITHUB_OUTPUT
echo "" >> $GITHUB_OUTPUT
cat CHANGES.md | sed -e "/---/,\$d" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Generate release assets notes
id: release_assets_notes
run: |
echo "release_notes<<EOF" >> $GITHUB_OUTPUT
cat doc/content/release-assets.md >> $GITHUB_OUTPUT
echo "" >> $GITHUB_OUTPUT
echo "" >> $GITHUB_OUTPUT
cat CHANGES.md | sed -e "/---/,\$d" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Delete old release assets
uses: mknejp/delete-release-assets@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ inputs.branch }}
assets: "*"
fail-if-no-release: false
fail-if-no-assets: false
- name: Upload assets to main repo release
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
tag_name: ${{ inputs.branch }}
files: ${{ steps.release_assets.outputs.release_assets }}
prerelease: ${{ inputs.is_rolling_release }}
body: ${{ steps.release_notes.outputs.release_notes }}
draft: ${{ inputs.is_rolling_release != 'true' }}
- name: Manage release assets repo limit
id: manage_release_assets
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
github-token: ${{ secrets.LIQUIDSOAP_RELEASE_ASSETS_TOKEN }}
script: |
const owner = 'savonet';
const repo = 'liquidsoap-release-assets';
const tag = '${{ inputs.branch }}';
const maxAssets = 1000;
const newFiles = `${{ steps.release_assets.outputs.release_assets }}`.trim().split('\n').filter(f => f.length > 0);
const newFilesCount = newFiles.length;
core.info(`New files to upload: ${newFilesCount}`);
let release;
try {
const { data } = await github.rest.repos.getReleaseByTag({
owner,
repo,
tag
});
release = data;
} catch (error) {
if (error.status === 404) {
core.info(`No existing release found for tag ${tag}, nothing to clean up`);
core.setOutput('assets_to_delete', '');
return;
}
throw error;
}
const assets = [];
let page = 1;
while (true) {
const { data } = await github.rest.repos.listReleaseAssets({
owner,
repo,
release_id: release.id,
per_page: 100,
page
});
if (data.length === 0) break;
assets.push(...data);
page++;
}
core.info(`Found ${assets.length} existing assets`);
const maxOldAssets = maxAssets - newFilesCount;
core.info(`Maximum old assets to keep: ${maxOldAssets}`);
if (assets.length <= maxOldAssets) {
core.info(`Current asset count (${assets.length}) is within limit, no deletion needed`);
core.setOutput('assets_to_delete', '');
return;
}
assets.sort((a, b) => new Date(a.created_at) - new Date(b.created_at));
const assetsToDeleteCount = assets.length - maxOldAssets;
core.info(`Assets to delete: ${assetsToDeleteCount}`);
const assetsToDelete = assets.slice(0, assetsToDeleteCount);
const assetNamesToDelete = assetsToDelete.map(a => a.name);
core.info(`Deleting assets: ${assetNamesToDelete.join(', ')}`);
core.setOutput('assets_to_delete', assetNamesToDelete.join('\n'));
- name: Delete old release assets from release repo
if: steps.manage_release_assets.outputs.assets_to_delete != ''
uses: mknejp/delete-release-assets@v1
with:
token: ${{ secrets.LIQUIDSOAP_RELEASE_ASSETS_TOKEN }}
tag: ${{ inputs.branch }}
assets: ${{ steps.manage_release_assets.outputs.assets_to_delete }}
repository: savonet/liquidsoap-release-assets
fail-if-no-release: false
fail-if-no-assets: false
- name: Upload assets to release repo
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0
with:
token: ${{ secrets.LIQUIDSOAP_RELEASE_ASSETS_TOKEN }}
tag_name: ${{ inputs.branch }}
files: ${{ steps.release_assets.outputs.release_assets }}
repository: savonet/liquidsoap-release-assets
prerelease: ${{ inputs.is_rolling_release }}
body: ${{ steps.release_assets_notes.outputs.release_notes }}
draft: ${{ inputs.is_rolling_release != 'true' }}
|