File: release.yml

package info (click to toggle)
liquidsoap 2.4.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 12,844 kB
  • sloc: ml: 74,136; javascript: 27,320; ansic: 505; sh: 139; xml: 114; lisp: 96; makefile: 26
file content (159 lines) | stat: -rw-r--r-- 6,234 bytes parent folder | download
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' }}