|
7 | 7 | branches: |
8 | 8 | - main |
9 | 9 | env: |
10 | | - FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: 'true' |
11 | 10 | BACKEND_IMAGE_NAME: ${{ github.event_name == 'release' && 'nowdb-backend' || 'nowdb-backend-staging' }} |
12 | 11 | FRONTEND_IMAGE_NAME: ${{ github.event_name == 'release' && 'nowdb-frontend' || 'nowdb-frontend-staging' }} |
13 | 12 | BACKEND_URL: ${{ github.event_name == 'release' && secrets.BACKEND_URL_PROD || secrets.BACKEND_URL_STAGING }} |
@@ -97,16 +96,153 @@ jobs: |
97 | 96 | delete_old_staging: |
98 | 97 | runs-on: ubuntu-latest |
99 | 98 | if: ${{ github.event_name == 'push' }} |
100 | | - env: |
101 | | - FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: 'true' |
| 99 | + permissions: |
| 100 | + packages: write |
| 101 | + contents: read |
102 | 102 | steps: |
103 | | - - uses: actions/delete-package-versions@v5 |
| 103 | + - uses: actions/github-script@v8 |
| 104 | + env: |
| 105 | + PACKAGE_NAME: nowdb-frontend-staging |
| 106 | + MIN_VERSIONS_TO_KEEP: '3' |
104 | 107 | with: |
105 | | - package-name: 'nowdb-frontend-staging' |
106 | | - min-versions-to-keep: 3 |
107 | | - package-type: 'container' |
108 | | - - uses: actions/delete-package-versions@v5 |
| 108 | + script: | |
| 109 | + const packageName = process.env.PACKAGE_NAME; |
| 110 | + const minVersionsToKeep = Number(process.env.MIN_VERSIONS_TO_KEEP ?? '0'); |
| 111 | + const owner = context.repo.owner; |
| 112 | +
|
| 113 | + const listVersions = async () => { |
| 114 | + try { |
| 115 | + return await github.paginate( |
| 116 | + github.rest.packages.getAllPackageVersionsForPackageOwnedByOrg, |
| 117 | + { |
| 118 | + package_type: 'container', |
| 119 | + package_name: packageName, |
| 120 | + org: owner, |
| 121 | + per_page: 100, |
| 122 | + }, |
| 123 | + ); |
| 124 | + } catch (error) { |
| 125 | + if (error.status !== 404) { |
| 126 | + throw error; |
| 127 | + } |
| 128 | +
|
| 129 | + return github.paginate( |
| 130 | + github.rest.packages.getAllPackageVersionsForPackageOwnedByUser, |
| 131 | + { |
| 132 | + package_type: 'container', |
| 133 | + package_name: packageName, |
| 134 | + username: owner, |
| 135 | + per_page: 100, |
| 136 | + }, |
| 137 | + ); |
| 138 | + } |
| 139 | + }; |
| 140 | +
|
| 141 | + const deleteVersion = async (packageVersionId) => { |
| 142 | + try { |
| 143 | + await github.rest.packages.deletePackageVersionForOrg({ |
| 144 | + package_type: 'container', |
| 145 | + package_name: packageName, |
| 146 | + org: owner, |
| 147 | + package_version_id: packageVersionId, |
| 148 | + }); |
| 149 | + } catch (error) { |
| 150 | + if (error.status !== 404) { |
| 151 | + throw error; |
| 152 | + } |
| 153 | +
|
| 154 | + await github.rest.packages.deletePackageVersionForUser({ |
| 155 | + package_type: 'container', |
| 156 | + package_name: packageName, |
| 157 | + username: owner, |
| 158 | + package_version_id: packageVersionId, |
| 159 | + }); |
| 160 | + } |
| 161 | + }; |
| 162 | +
|
| 163 | + const versions = await listVersions(); |
| 164 | +
|
| 165 | + const versionsToDelete = versions |
| 166 | + .slice() |
| 167 | + .sort((a, b) => new Date(b.created_at) - new Date(a.created_at)) |
| 168 | + .slice(minVersionsToKeep); |
| 169 | +
|
| 170 | + core.info(`Found ${versions.length} versions for ${packageName}. Deleting ${versionsToDelete.length}.`); |
| 171 | +
|
| 172 | + for (const version of versionsToDelete) { |
| 173 | + await deleteVersion(version.id); |
| 174 | + core.info(`Deleted ${packageName} version ${version.id}.`); |
| 175 | + } |
| 176 | + - uses: actions/github-script@v8 |
| 177 | + env: |
| 178 | + PACKAGE_NAME: nowdb-backend-staging |
| 179 | + MIN_VERSIONS_TO_KEEP: '3' |
109 | 180 | with: |
110 | | - package-name: 'nowdb-backend-staging' |
111 | | - min-versions-to-keep: 3 |
112 | | - package-type: 'container' |
| 181 | + script: | |
| 182 | + const packageName = process.env.PACKAGE_NAME; |
| 183 | + const minVersionsToKeep = Number(process.env.MIN_VERSIONS_TO_KEEP ?? '0'); |
| 184 | + const owner = context.repo.owner; |
| 185 | +
|
| 186 | + const listVersions = async () => { |
| 187 | + try { |
| 188 | + return await github.paginate( |
| 189 | + github.rest.packages.getAllPackageVersionsForPackageOwnedByOrg, |
| 190 | + { |
| 191 | + package_type: 'container', |
| 192 | + package_name: packageName, |
| 193 | + org: owner, |
| 194 | + per_page: 100, |
| 195 | + }, |
| 196 | + ); |
| 197 | + } catch (error) { |
| 198 | + if (error.status !== 404) { |
| 199 | + throw error; |
| 200 | + } |
| 201 | +
|
| 202 | + return github.paginate( |
| 203 | + github.rest.packages.getAllPackageVersionsForPackageOwnedByUser, |
| 204 | + { |
| 205 | + package_type: 'container', |
| 206 | + package_name: packageName, |
| 207 | + username: owner, |
| 208 | + per_page: 100, |
| 209 | + }, |
| 210 | + ); |
| 211 | + } |
| 212 | + }; |
| 213 | +
|
| 214 | + const deleteVersion = async (packageVersionId) => { |
| 215 | + try { |
| 216 | + await github.rest.packages.deletePackageVersionForOrg({ |
| 217 | + package_type: 'container', |
| 218 | + package_name: packageName, |
| 219 | + org: owner, |
| 220 | + package_version_id: packageVersionId, |
| 221 | + }); |
| 222 | + } catch (error) { |
| 223 | + if (error.status !== 404) { |
| 224 | + throw error; |
| 225 | + } |
| 226 | +
|
| 227 | + await github.rest.packages.deletePackageVersionForUser({ |
| 228 | + package_type: 'container', |
| 229 | + package_name: packageName, |
| 230 | + username: owner, |
| 231 | + package_version_id: packageVersionId, |
| 232 | + }); |
| 233 | + } |
| 234 | + }; |
| 235 | +
|
| 236 | + const versions = await listVersions(); |
| 237 | +
|
| 238 | + const versionsToDelete = versions |
| 239 | + .slice() |
| 240 | + .sort((a, b) => new Date(b.created_at) - new Date(a.created_at)) |
| 241 | + .slice(minVersionsToKeep); |
| 242 | +
|
| 243 | + core.info(`Found ${versions.length} versions for ${packageName}. Deleting ${versionsToDelete.length}.`); |
| 244 | +
|
| 245 | + for (const version of versionsToDelete) { |
| 246 | + await deleteVersion(version.id); |
| 247 | + core.info(`Deleted ${packageName} version ${version.id}.`); |
| 248 | + } |
0 commit comments