Skip to content

Commit e0b5c65

Browse files
author
JeanRobin
committed
Fix clean up github action
1 parent 429aa84 commit e0b5c65

File tree

4 files changed

+137
-28
lines changed

4 files changed

+137
-28
lines changed

.github/workflows/cleanup-dev-releases.yml

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,37 @@ on:
77
description: "Taipy version to clean up without extension. Ex: 3.2.1 cleans up all dev releases 3.2.1.devX"
88
required: true
99

10+
dry_run:
11+
description: "Perform a dry run without actually deleting any releases (default: True)"
12+
required: true
13+
type: choice
14+
options:
15+
- True
16+
- False
17+
default: "True"
18+
19+
extension:
20+
description: "Which extension to clean up. (default: dev)"
21+
default: "dev"
22+
1023
jobs:
1124
cleanup:
1225
runs-on: ubuntu-latest
1326
steps:
1427
- name: Display inputs
1528
run: |
1629
echo "Version: ${{ github.event.inputs.version }}"
30+
echo "Dry run: ${{ github.event.inputs.dry_run }}"
31+
echo "Extension: ${{ github.event.inputs.extension }}"
32+
33+
- name: Validate version
34+
run: |
35+
version="${{ github.event.inputs.target_version }}"
36+
if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
37+
echo "❌ Invalid version format: '$version' - <M>.<m>.<p> is mandatory."
38+
exit 1
39+
fi
40+
echo "✅ Valid target version: $version"
1741
1842
- name: Install mandatory Python packages
1943
run: |
@@ -25,4 +49,7 @@ jobs:
2549
env:
2650
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2751
run: |
28-
python tools/release/cleanup_dev_releases.py
52+
python tools/release/cleanup_dev_releases.py \
53+
--version ${{ github.event.inputs.version }} \
54+
--dry-run ${{ github.event.inputs.dry_run }} \
55+
--extension ${{ github.event.inputs.extension }}

tests/tools/release/test_version.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def test_from_string():
4646
assert version.ext == "some_ext.more_ext"
4747

4848

49-
def test_extension():
49+
def test_split_extension():
5050
version = Version.from_string("1.2.3")
5151
extension = version.split_ext()
5252
assert extension == ("", -1)
@@ -154,3 +154,30 @@ def test_order():
154154

155155
versions = [Version(1, 0), Version(2, 1), Version(3, 4), Version(2, 0)]
156156
assert max(versions) == Version(3, 4), "Cannot find max in Version list"
157+
158+
159+
def test_has_extension():
160+
version = Version.from_string("1.2.3")
161+
assert not version.has_extension()
162+
163+
version = Version.from_string("1.2.3.dev")
164+
assert version.has_extension()
165+
166+
version = Version.from_string("1.2.3.dev0")
167+
assert version.has_extension()
168+
169+
170+
def test_validate_extension():
171+
version = Version.from_string("1.2.3")
172+
assert not version.validate_extension("dev")
173+
174+
version = Version.from_string("1.2.3.dev")
175+
assert version.validate_extension("dev")
176+
assert not version.validate_extension("rc")
177+
178+
version = Version.from_string("1.2.3.dev0")
179+
assert version.validate_extension("dev")
180+
181+
version = Version.from_string("1.2.3.rc1")
182+
assert version.validate_extension("rc")
183+
assert not version.validate_extension("dev")

tools/release/cleanup_dev_releases.py

Lines changed: 77 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import argparse
1616

1717
import requests
18+
1819
from common import Git, Version, fetch_github_releases
1920

2021

@@ -31,43 +32,93 @@ def main(arg_strings=None):
3132
The indicated version must not have extensions.""",
3233
)
3334

35+
parser.add_argument(
36+
"--dry_run",
37+
type=bool,
38+
default="True",
39+
help="A boolean flag indicating whether to perform a dry run (default: True). " +
40+
"If set to True, the script will only print the releases and tags that would " +
41+
"be deleted without actually deleting them. This can be useful for verifying " +
42+
" which releases and tags would be affected before performing the actual deletion.")
43+
44+
parser.add_argument(
45+
"--extension",
46+
type=str,
47+
default="dev",
48+
help="The extension to look for in the releases to be deleted (default: 'dev'). ")
49+
3450
args = parser.parse_args(arg_strings)
51+
version = args.version
52+
dry_run = args.dry_run
53+
extension = args.extension
3554

3655
github_path = Git.get_github_path()
3756
all_releases = fetch_github_releases(github_path)
38-
found_dev_version_to_delete = False
57+
found = []
58+
found_wrong_version = []
59+
found_wrong_extension = []
60+
errors = []
3961
if all_releases:
4062
for package, releases in all_releases.items():
4163
for release in releases:
4264
release_version: Version = release["version"]
43-
release_id = release["id"]
44-
release_tag = release["tag"]
45-
if release_version.validate_extension() and args.version.match(release_version):
46-
pkg = package.name
47-
found_dev_version_to_delete = True
65+
if release_version.has_extension():
66+
release_id = release["id"]
67+
release_tag = release["tag"]
68+
if version.matches(release_version) and release_version.validate_extension(ext=extension):
69+
found.append(release_id)
70+
if not __delete_release(dry_run, github_path, package.name, release_id, release_version):
71+
errors.append(f"Release {release_version}-{package.name} (id: {release_id})")
72+
if not __delete_tag(dry_run, github_path, release_tag):
73+
errors.append(f"Tag {release_tag}")
74+
elif not version.matches(release_version) and release_version.validate_extension(ext=extension):
75+
found_wrong_version.append(release_tag)
76+
elif version.matches(release_version) :
77+
found_wrong_extension.append(release_tag)
78+
print() # noqa: T201
79+
if len(found) == 0:
80+
print(f"No dev releases found for version {version}.") # noqa: T201
81+
else:
82+
print(f"✅ Successfully deleted {len(found)} releases {version} with extension '{extension}'") # noqa: T201
83+
if len(errors) > 0:
84+
print(f"❌ Failed to delete {len(errors)} items: {sorted(errors)}") # noqa: T201
85+
if len(found_wrong_extension) > 0:
86+
print(f"Found {len(found_wrong_extension)} releases matching version {version} but with another extension:") # noqa: T201
87+
print(sorted(found_wrong_extension)) # noqa: T201
88+
if len(found_wrong_version) > 0:
89+
print(f"Found {len(found_wrong_version)} releases matching extension '{extension}' but with another version:") # noqa: T201
90+
print(sorted(found_wrong_version)) # noqa: T201
4891

49-
# Delete release
50-
url = f"https://api.github.com/repos/{github_path}/releases/{release_id}"
51-
response = requests.delete(url, headers={"Accept": "application/vnd.github+json"})
52-
if response.status_code == 204:
53-
print(f"✅ Successfully deleted '{pkg}-{release_version}'.") # noqa: T201
54-
else:
55-
status = response.status_code
56-
txt = response.text
57-
print(f"❌ Failed to delete '{pkg}-{release_version}': {status} - {txt}")# noqa: T201
92+
def __delete_release(dry_run, github_path: str, pkg: str, release_id: str, release_version: Version) -> bool:
93+
url = f"https://api.github.com/repos/{github_path}/releases/{release_id}"
94+
if dry_run:
95+
print(f'requests.delete("{url}", ' + # noqa: T201
96+
'headers={"Accept": "application/vnd.github+json"})') # noqa: T201
97+
return True
98+
else:
99+
response = requests.delete(url, headers={"Accept": "application/vnd.github+json"})
100+
if response.status_code == 204:
101+
print(f"Successfully deleted '{pkg}-{release_version}'.") # noqa: T201
102+
return True
103+
else:
104+
print(f"❌ Failed to delete '{pkg}-{release_version}': {response.status_code} - {response.text}") # noqa: T201
105+
return False
58106

59-
# Delete tag
60-
url = f"https://api.github.com/repos/{github_path}/git/refs/tags/{release_tag}'"
61-
response = requests.delete(url, headers={"Accept": "application/vnd.github+json"})
62-
if response.status_code == 204:
63-
print(f"✅ Successfully deleted tag {release_tag}.") # noqa: T201
64-
else:
65-
status = response.status_code
66-
txt = response.text
67-
print(f"❌ Failed to delete tag {release_tag}: {status} - {txt}") # noqa: T201
68107

69-
if not found_dev_version_to_delete:
70-
print(f"No dev releases found for version {args.version}.") # noqa: T201
108+
def __delete_tag(dry_run, github_path: str, release_tag: str) -> bool:
109+
url = f"https://api.github.com/repos/{github_path}/git/refs/tags/{release_tag}"
110+
if dry_run:
111+
print(f'requests.delete("{url}", ' + # noqa: T201
112+
'headers={"Accept": "application/vnd.github+json"})') # noqa: T201
113+
return True
114+
else:
115+
response = requests.delete(url, headers={"Accept": "application/vnd.github+json"})
116+
if response.status_code == 204:
117+
print(f"Successfully deleted tag {release_tag}.") # noqa: T201
118+
return True
119+
else:
120+
print(f"❌ Failed to delete tag {release_tag}: {response.status_code} - {response.text}") # noqa:
121+
return False
71122

72123

73124
if __name__ == "__main__":

tools/release/common.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ def check_argument(value: str) -> "Version":
100100
raise argparse.ArgumentTypeError(f"'{value}' is not a valid version number.") from e
101101
return version
102102

103+
def has_extension(self) -> bool:
104+
"""Returns True if this Version has an extension part."""
105+
return self.ext is not None
106+
103107
def validate_extension(self, ext="dev"):
104108
"""Returns True if the extension part of this Version is the one queried."""
105109
return self.split_ext()[0] == ext

0 commit comments

Comments
 (0)