Skip to content

Commit ee37aef

Browse files
authored
cleanup alpha packges (#125)
1 parent 8b546b4 commit ee37aef

8 files changed

Lines changed: 227 additions & 109 deletions

File tree

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
name: Cleanup Alpha Releases
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v[0-9]+.[0-9]+.[0-9]+'
7+
8+
env:
9+
IMAGE_NAME: OpenAlprWebhookProcessor
10+
11+
jobs:
12+
cleanup-alpha-releases:
13+
runs-on: ubuntu-latest
14+
if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') && !contains(github.ref, 'alpha') && !contains(github.ref, 'beta') && !contains(github.ref, 'rc')
15+
16+
steps:
17+
- name: Checkout code
18+
uses: actions/checkout@v4
19+
20+
- name: Find Alpha Versions to Delete
21+
id: find-versions
22+
uses: actions/github-script@v7
23+
with:
24+
script: |
25+
const fullTag = context.ref.replace('refs/tags/', '');
26+
const version = fullTag.replace(/^v/, '');
27+
const majorMinor = version.split('.').slice(0, 2).join('.');
28+
29+
console.log(`Released stable version: ${fullTag}`);
30+
console.log(`Looking for alpha releases for version ${majorMinor}...`);
31+
32+
const alphaPattern = new RegExp(`^v${majorMinor}\\.[0-9]+-alpha[0-9]+$`);
33+
34+
const alphaReleases = [];
35+
const alphaPackageVersions = [];
36+
const alphaDockerTags = [];
37+
38+
try {
39+
console.log('🔍 Fetching GitHub releases...');
40+
const { data: releases } = await github.rest.repos.listReleases({
41+
owner: context.repo.owner,
42+
repo: context.repo.repo,
43+
per_page: 100
44+
});
45+
46+
const matchingReleases = releases.filter(release =>
47+
release.prerelease && alphaPattern.test(release.tag_name)
48+
);
49+
50+
for (const release of matchingReleases) {
51+
alphaReleases.push({
52+
id: release.id,
53+
tag: release.tag_name
54+
});
55+
}
56+
57+
console.log(`Found ${alphaReleases.length} alpha releases to delete`);
58+
} catch (error) {
59+
console.log(`❌ Error fetching releases: ${error.message}`);
60+
}
61+
62+
try {
63+
console.log('📦 Fetching Docker package versions...');
64+
65+
const { data: packageVersions } = await github.rest.packages.getAllPackageVersionsForPackageOwnedByUser({
66+
package_type: 'container',
67+
package_name: process.env.IMAGE_NAME.toLowerCase(),
68+
username: context.repo.owner
69+
});
70+
71+
console.log(`Found ${packageVersions.length} total package versions`);
72+
73+
for (const version of packageVersions) {
74+
if (version.metadata && version.metadata.container && version.metadata.container.tags) {
75+
const matchingTags = version.metadata.container.tags.filter(tag => alphaPattern.test(tag));
76+
if (matchingTags.length > 0) {
77+
alphaPackageVersions.push(version.id);
78+
alphaDockerTags.push(...matchingTags);
79+
}
80+
}
81+
}
82+
83+
console.log(`Found ${alphaPackageVersions.length} alpha package versions to delete`);
84+
console.log(`Found ${alphaDockerTags.length} alpha Docker tags: ${alphaDockerTags.join(', ')}`);
85+
} catch (error) {
86+
console.log(`❌ Error fetching package versions: ${error.message}`);
87+
}
88+
89+
core.setOutput('alpha_releases', JSON.stringify(alphaReleases));
90+
core.setOutput('alpha_package_versions', JSON.stringify(alphaPackageVersions));
91+
core.setOutput('alpha_docker_tags', JSON.stringify(alphaDockerTags));
92+
core.setOutput('major_minor', majorMinor);
93+
core.setOutput('full_tag', fullTag);
94+
95+
return {
96+
releases: alphaReleases.length,
97+
packageVersions: alphaPackageVersions.length,
98+
dockerTags: alphaDockerTags.length
99+
};
100+
101+
- name: Delete Alpha GitHub Releases
102+
if: steps.find-versions.outputs.alpha_releases != '[]'
103+
uses: actions/github-script@v7
104+
with:
105+
script: |
106+
const alphaReleases = JSON.parse('${{ steps.find-versions.outputs.alpha_releases }}');
107+
108+
console.log(`🗑️ Deleting ${alphaReleases.length} GitHub releases...`);
109+
110+
for (const release of alphaReleases) {
111+
try {
112+
console.log(`Deleting GitHub release: ${release.tag}`);
113+
await github.rest.repos.deleteRelease({
114+
owner: context.repo.owner,
115+
repo: context.repo.repo,
116+
release_id: release.id
117+
});
118+
119+
try {
120+
console.log(`Deleting git tag: ${release.tag}`);
121+
await github.rest.git.deleteRef({
122+
owner: context.repo.owner,
123+
repo: context.repo.repo,
124+
ref: `tags/${release.tag}`
125+
});
126+
} catch (tagError) {
127+
console.log(`⚠️ Failed to delete git tag ${release.tag}: ${tagError.message}`);
128+
}
129+
} catch (releaseError) {
130+
console.log(`⚠️ Failed to delete release ${release.tag}: ${releaseError.message}`);
131+
}
132+
}
133+
134+
- name: Delete Docker Hub Alpha Images
135+
env:
136+
DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }}
137+
DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_PASSWORD }}
138+
if: steps.find-versions.outputs.alpha_docker_tags != '[]'
139+
uses: actions/github-script@v7
140+
with:
141+
script: |
142+
const alphaDockerTags = JSON.parse('${{ steps.find-versions.outputs.alpha_docker_tags }}');
143+
const majorMinor = '${{ steps.find-versions.outputs.major_minor }}';
144+
145+
console.log(`🐳 Cleaning up ${alphaDockerTags.length} alpha images from Docker Hub...`);
146+
console.log(`Tags to delete: ${alphaDockerTags.join(', ')}`);
147+
148+
try {
149+
const loginResponse = await fetch('https://hub.docker.com/v2/users/login/', {
150+
method: 'POST',
151+
headers: {
152+
'Content-Type': 'application/json',
153+
},
154+
body: JSON.stringify({
155+
username: process.env.DOCKER_HUB_USERNAME,
156+
password: process.env.DOCKER_HUB_PASSWORD
157+
})
158+
});
159+
160+
if (!loginResponse.ok) {
161+
throw new Error(`Docker Hub login failed: ${loginResponse.status}`);
162+
}
163+
164+
const loginData = await loginResponse.json();
165+
const token = loginData.token;
166+
167+
if (!token) {
168+
throw new Error('No token received from Docker Hub');
169+
}
170+
171+
console.log('✅ Successfully authenticated with Docker Hub');
172+
173+
const repoName = 'mlapaglia/openalprwebhookprocessor';
174+
175+
for (const tagName of alphaDockerTags) {
176+
try {
177+
console.log(`🗑️ Deleting Docker Hub tag: ${tagName}`);
178+
179+
const deleteResponse = await fetch(`https://hub.docker.com/v2/repositories/${repoName}/tags/${tagName}/`, {
180+
method: 'DELETE',
181+
headers: {
182+
'Authorization': `JWT ${token}`
183+
}
184+
});
185+
186+
if (!deleteResponse.ok) {
187+
console.log(`⚠️ Failed to delete tag ${tagName}: ${deleteResponse.status}`);
188+
} else {
189+
console.log(`✅ Successfully deleted tag ${tagName}`);
190+
}
191+
} catch (tagError) {
192+
console.log(`⚠️ Error deleting tag ${tagName}: ${tagError.message}`);
193+
}
194+
}
195+
196+
} catch (error) {
197+
console.log(`❌ Error cleaning up Docker Hub: ${error.message}`);
198+
}
199+
200+
- name: Summary
201+
uses: actions/github-script@v7
202+
with:
203+
script: |
204+
const fullTag = '${{ steps.find-versions.outputs.full_tag }}';
205+
const majorMinor = '${{ steps.find-versions.outputs.major_minor }}';
206+
const alphaReleases = JSON.parse('${{ steps.find-versions.outputs.alpha_releases }}');
207+
const alphaPackageVersions = JSON.parse('${{ steps.find-versions.outputs.alpha_package_versions }}');
208+
const alphaDockerTags = JSON.parse('${{ steps.find-versions.outputs.alpha_docker_tags }}');
209+
210+
console.log('🎉 Cleanup Summary');
211+
console.log('==================');
212+
console.log(`✅ Cleanup completed for stable release ${fullTag}`);
213+
console.log(`🗑️ Removed alpha releases matching pattern: v${majorMinor}.X-alphaX`);
214+
console.log('');
215+
console.log('📊 Items cleaned up:');
216+
console.log(` - GitHub Releases: ${alphaReleases.length}`);
217+
console.log(` - GitHub Packages: ${alphaPackageVersions.length}`);
218+
console.log(` - Docker Hub Tags: ${alphaDockerTags.length}`);
219+
console.log('');
220+
console.log('📦 Cleaned up from:');
221+
console.log(' - GitHub Releases');
222+
console.log(' - GitHub Container Registry (ghcr.io)');
223+
console.log(' - Docker Hub (if configured)');

.github/workflows/docker-publish.yml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,13 @@ jobs:
126126
if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
127127
steps:
128128
- name: Check out the repo
129-
uses: actions/checkout@v2
129+
uses: actions/checkout@v4
130130

131131
- name: Setup Buildx
132-
uses: docker/setup-buildx-action@v1
132+
uses: docker/setup-buildx-action@v3
133133

134134
- name: Login to DockerHub
135-
uses: docker/login-action@v1
135+
uses: docker/login-action@v3
136136
with:
137137
username: ${{ secrets.DOCKER_HUB_USERNAME }}
138138
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
@@ -149,14 +149,13 @@ jobs:
149149
echo "ASSEMBLY_VERSION=$assembly_version" >> $GITHUB_OUTPUT
150150
151151
- name: Push to Docker Hub
152-
uses: docker/build-push-action@v2
152+
uses: docker/build-push-action@v5
153153
with:
154154
build-args: |
155155
GIT_VERSION=${{ steps.get_version.outputs.GIT_VERSION }}
156156
GIT_ASSEMBLY_VERSION=${{ steps.get_version.outputs.ASSEMBLY_VERSION }}
157157
GIT_FILE_VERSION=${{ steps.get_version.outputs.ASSEMBLY_VERSION }}
158158
file: ./OpenAlprWebhookProcessor.Server/Dockerfile
159-
github-token: ${{ secrets.GITHUB_TOKEN }}
160159
push: true
161160
tags: |
162161
mlapaglia/openalprwebhookprocessor:${{ steps.get_version.outputs.VERSION }}

OpenAlprWebhookProcessor.Server/Features/LicensePlates/Commands/UpdatePlateNumber/UpdatePlateNumberCommand.cs

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,3 @@ public class UpdatePlateNumberCommand : ICommand
99

1010
public string PlateNumber { get; set; }
1111
}
12-
13-
14-
15-
16-
17-
18-
19-
20-
21-
22-
23-
24-
25-
26-
27-
28-
29-
30-
31-

OpenAlprWebhookProcessor.Server/Features/LicensePlates/Commands/UpdatePlateNumber/UpdatePlateNumberCommandHandler.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,3 @@ public async ValueTask<Unit> Handle(UpdatePlateNumberCommand request, Cancellati
3232
return Unit.Value;
3333
}
3434
}
35-

openalprwebhookprocessor.client/src/app/settings/machine-learning/configuration-card/configuration-card.component.less

Lines changed: 0 additions & 24 deletions
This file was deleted.

openalprwebhookprocessor.client/src/app/settings/machine-learning/configuration-card/configuration-card.component.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import { OnPushBaseComponent } from 'app/_helpers/onpush-base.component';
1111
@Component({
1212
selector: 'app-configuration-card',
1313
templateUrl: './configuration-card.component.html',
14-
styleUrls: ['./configuration-card.component.less'],
1514
changeDetection: ChangeDetectionStrategy.OnPush,
1615
imports: [
1716
CommonModule,
@@ -100,15 +99,3 @@ export class ConfigurationCardComponent extends OnPushBaseComponent implements O
10099
this.editConfiguration.emit();
101100
}
102101
}
103-
104-
105-
106-
107-
108-
109-
110-
111-
112-
113-
114-

openalprwebhookprocessor.client/src/app/settings/machine-learning/machine-learning/machine-learning.component.less

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,3 @@
1616
.refresh-button {
1717
margin-left: 8px;
1818
}
19-
20-
21-
22-
23-
24-
25-
26-
27-
28-
29-
30-
31-
32-
33-
34-
35-
36-
37-
38-
39-
40-
41-

openalprwebhookprocessor.client/src/app/settings/machine-learning/model-metrics-card/model-metrics-card.component.less

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,3 @@
66
text-align: center;
77
padding: 20px;
88
}
9-
10-
11-
12-
13-
14-
15-
16-
17-
18-
19-
20-
21-
22-
23-
24-
25-
26-
27-
28-
29-
30-
31-

0 commit comments

Comments
 (0)