|
1 | 1 | name: Promote Pre-release to Release
|
2 | 2 |
|
3 | 3 | on:
|
4 |
| - workflow_run: |
5 |
| - workflows: [Release] |
6 |
| - types: |
7 |
| - - completed |
| 4 | + schedule: |
| 5 | + - cron: '30 23 * * *' |
8 | 6 |
|
9 | 7 | jobs:
|
10 | 8 | promote:
|
11 | 9 | runs-on: ubuntu-latest
|
12 |
| - if: github.event.workflow_run.conclusion == 'success' |
13 |
| - |
14 | 10 | steps:
|
15 |
| - - name: Wait 24 hours |
16 |
| - run: sleep 86400 |
17 |
| - |
18 |
| - - name: Checkout repository |
19 |
| - uses: actions/checkout@v4 |
20 |
| - |
21 |
| - - name: Get latest pre-release |
22 |
| - id: get_release |
| 11 | + - name: Check pre-release age |
| 12 | + id: check_release |
23 | 13 | uses: actions/github-script@v7
|
24 | 14 | with:
|
25 | 15 | script: |
|
26 |
| - const response = await github.rest.repos.getLatestRelease({ |
27 |
| - owner: context.repo.owner, |
28 |
| - repo: context.repo.repo |
29 |
| - }); |
30 |
| - if (!response.data.prerelease) { |
31 |
| - console.log('Latest release is not a pre-release. Skipping.'); |
32 |
| - return; |
| 16 | + try { |
| 17 | + const releases = await github.rest.repos.listReleases({ |
| 18 | + owner: context.repo.owner, |
| 19 | + repo: context.repo.repo, |
| 20 | + per_page: 1 |
| 21 | + }); |
| 22 | + if (releases.data.length === 0) { |
| 23 | + core.setFailed('No releases found'); |
| 24 | + return; |
| 25 | + } |
| 26 | + const latestRelease = releases.data[0]; |
| 27 | + if (!latestRelease.prerelease) { |
| 28 | + core.setFailed('Latest release is not a pre-release'); |
| 29 | + return; |
| 30 | + } |
| 31 | + const releaseDate = new Date(latestRelease.published_at); |
| 32 | + const now = new Date(); |
| 33 | + const hoursDiff = (now - releaseDate) / (1000 * 60 * 60); |
| 34 | + if (hoursDiff < 24) { |
| 35 | + core.setFailed(`Pre-release is only ${Math.floor(hoursDiff)} hours old. Need to wait ${Math.ceil(24 - hoursDiff)} more hours.`); |
| 36 | + return; |
| 37 | + } |
| 38 | + core.setOutput('release_id', latestRelease.id); |
| 39 | + core.setOutput('tag_name', latestRelease.tag_name); |
| 40 | + console.log(`Pre-release ${latestRelease.tag_name} is ${Math.floor(hoursDiff)} hours old - proceeding with promotion...`); |
| 41 | + } catch (error) { |
| 42 | + core.setFailed(`Error checking release: ${error.message}`); |
33 | 43 | }
|
34 |
| - return response.data; |
35 |
| - result-encoding: string |
36 |
| - |
| 44 | +
|
37 | 45 | - name: Update to full release
|
38 |
| - if: steps.get_release.outputs.result != '' |
| 46 | + if: steps.check_release.outputs.release_id != '' |
39 | 47 | uses: actions/github-script@v7
|
40 | 48 | with:
|
41 | 49 | script: |
|
42 |
| - const release = JSON.parse('${{ steps.get_release.outputs.result }}'); |
| 50 | + const releaseId = '${{ steps.check_release.outputs.release_id }}'; |
43 | 51 | await github.rest.repos.updateRelease({
|
44 | 52 | owner: context.repo.owner,
|
45 | 53 | repo: context.repo.repo,
|
46 |
| - release_id: release.id, |
| 54 | + release_id: releaseId, |
47 | 55 | prerelease: false
|
48 | 56 | });
|
0 commit comments