Skip to content

Commit 6112648

Browse files
committed
🔄 created local '.github/workflows/update-releases-properties.yml' from remote '.releases/update-releases-properties.yml'
1 parent a673b38 commit 6112648

File tree

1 file changed

+219
-0
lines changed

1 file changed

+219
-0
lines changed
Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
name: Update Releases Properties
2+
3+
# This workflow runs in individual module repositories (e.g., module-php)
4+
# It automatically updates releases.properties file when a release is published
5+
6+
on:
7+
release:
8+
types: [prereleased, released, edited]
9+
10+
# Manual trigger for testing
11+
workflow_dispatch:
12+
inputs:
13+
release_tag:
14+
description: 'Release tag to process (e.g., 2025.10.31)'
15+
required: true
16+
17+
jobs:
18+
update-properties:
19+
runs-on: ubuntu-latest
20+
21+
steps:
22+
- name: Checkout repository
23+
uses: actions/checkout@v4
24+
with:
25+
token: ${{ secrets.GH_PAT }}
26+
27+
- name: Set up Python
28+
uses: actions/setup-python@v5
29+
with:
30+
python-version: '3.11'
31+
32+
- name: Install dependencies
33+
run: |
34+
pip install requests packaging
35+
36+
- name: Extract module name from repository
37+
id: extract_module
38+
run: |
39+
# Extract module name from repo name (e.g., "module-php" -> "php")
40+
REPO_NAME="${{ github.event.repository.name }}"
41+
MODULE_NAME="${REPO_NAME#module-}"
42+
echo "module_name=${MODULE_NAME}" >> $GITHUB_OUTPUT
43+
echo "Module name: ${MODULE_NAME}"
44+
45+
- name: Update releases properties
46+
env:
47+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
48+
RELEASE_TAG: ${{ github.event.release.tag_name || github.event.inputs.release_tag }}
49+
REPO_OWNER: ${{ github.repository_owner }}
50+
REPO_NAME: ${{ github.event.repository.name }}
51+
MODULE_NAME: ${{ steps.extract_module.outputs.module_name }}
52+
run: |
53+
python << 'EOF'
54+
import os
55+
import re
56+
import requests
57+
from packaging import version
58+
from collections import OrderedDict
59+
60+
# Get environment variables
61+
release_tag = os.environ['RELEASE_TAG']
62+
repo_owner = os.environ['REPO_OWNER']
63+
repo_name = os.environ['REPO_NAME']
64+
module_name = os.environ['MODULE_NAME']
65+
github_token = os.environ['GITHUB_TOKEN']
66+
67+
print(f"Processing release: {release_tag}")
68+
print(f"Module name: {module_name}")
69+
70+
# Construct API URL
71+
api_url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/releases/tags/{release_tag}"
72+
73+
headers = {
74+
'Authorization': f'token {github_token}',
75+
'Accept': 'application/vnd.github.v3+json'
76+
}
77+
78+
print(f"Fetching release information from: {api_url}")
79+
80+
# Fetch release data
81+
response = requests.get(api_url, headers=headers)
82+
response.raise_for_status()
83+
release_data = response.json()
84+
85+
# Extract assets that end with .7z only
86+
assets = []
87+
for asset in release_data.get('assets', []):
88+
filename = asset['name']
89+
90+
# Check if file ends with .7z
91+
if filename.endswith('.7z'):
92+
download_url = asset['browser_download_url']
93+
94+
# Extract version number (flexible pattern)
95+
version_match = re.search(r'(\d+\.\d+\.\d+(?:\.\d+)?)', filename)
96+
if version_match:
97+
ver = version_match.group(1)
98+
assets.append({
99+
'version': ver,
100+
'url': download_url,
101+
'filename': filename
102+
})
103+
print(f"Found: {filename} -> Version: {ver}")
104+
else:
105+
print(f"Warning: Could not extract version from: {filename}")
106+
107+
if not assets:
108+
print(f"No .7z assets found in release")
109+
exit(0)
110+
111+
# Read existing properties file
112+
properties_file = "releases.properties"
113+
114+
if not os.path.exists(properties_file):
115+
print(f"Properties file not found: {properties_file}")
116+
print(f"Creating new properties file...")
117+
with open(properties_file, 'w', encoding='utf-8') as f:
118+
f.write(f"# {module_name.upper()} Releases Properties\n")
119+
f.write(f"# Auto-generated and maintained by automation\n\n")
120+
121+
with open(properties_file, 'r', encoding='utf-8') as f:
122+
lines = f.readlines()
123+
124+
# Parse existing properties
125+
properties = OrderedDict()
126+
header_lines = []
127+
in_header = True
128+
129+
for line in lines:
130+
stripped = line.strip()
131+
if in_header and (stripped.startswith('#') or stripped == ''):
132+
header_lines.append(line)
133+
else:
134+
in_header = False
135+
if '=' in line and not stripped.startswith('#'):
136+
key, value = line.split('=', 1)
137+
properties[key.strip()] = value.strip()
138+
139+
# Add new versions
140+
for asset in assets:
141+
ver = asset['version']
142+
url = asset['url']
143+
144+
# Create property key (just version number)
145+
key = ver
146+
properties[key] = url
147+
print(f"Added/Updated: {key} = {url}")
148+
149+
# Sort properties by version (semver)
150+
def extract_version(key):
151+
# Parse version directly from key
152+
try:
153+
return version.parse(key)
154+
except:
155+
return version.parse("0.0.0")
156+
157+
sorted_properties = OrderedDict(
158+
sorted(properties.items(), key=lambda x: extract_version(x[0]), reverse=True)
159+
)
160+
161+
# Write back to file
162+
with open(properties_file, 'w', encoding='utf-8') as f:
163+
# Write header
164+
for line in header_lines:
165+
f.write(line)
166+
167+
# Write sorted properties with spaces around equals sign
168+
for key, value in sorted_properties.items():
169+
f.write(f"{key} = {value}\n")
170+
171+
print(f"\nSuccessfully updated {properties_file}")
172+
print(f"Total versions: {len(sorted_properties)}")
173+
174+
EOF
175+
176+
- name: Create Pull Request
177+
id: create_pr
178+
uses: peter-evans/create-pull-request@v6
179+
with:
180+
token: ${{ secrets.GH_PAT }}
181+
commit-message: |
182+
Update releases.properties
183+
184+
Auto-generated from release ${{ github.event.release.tag_name || github.event.inputs.release_tag }}
185+
branch: update-releases-${{ github.event.release.tag_name || github.event.inputs.release_tag }}
186+
delete-branch: true
187+
title: 'Update releases.properties from release ${{ github.event.release.tag_name || github.event.inputs.release_tag }}'
188+
body: |
189+
## 🤖 Automated Releases Properties Update
190+
191+
This PR updates the `releases.properties` file with new versions from release `${{ github.event.release.tag_name || github.event.inputs.release_tag }}`.
192+
193+
### Changes:
194+
- Extracted .7z assets from the release
195+
- Added version entries with download URLs
196+
- Maintained semver ordering (newest first)
197+
198+
**Release URL:** ${{ github.event.release.html_url || format('https://github.com/{0}/{1}/releases/tag/{2}', github.repository_owner, github.event.repository.name, github.event.inputs.release_tag) }}
199+
200+
### Next Steps:
201+
1. ⏳ Link validation will run automatically
202+
2. ✅ Once validation passes, this PR will auto-merge
203+
3. ❌ If validation fails, please review and fix invalid URLs
204+
labels: |
205+
automated
206+
releases-update
207+
208+
- name: Wait for validation checks
209+
if: steps.create_pr.outputs.pull-request-number != ''
210+
run: |
211+
echo "Waiting for link validation to complete..."
212+
sleep 10
213+
214+
- name: Enable auto-merge
215+
if: steps.create_pr.outputs.pull-request-number != ''
216+
run: |
217+
gh pr merge ${{ steps.create_pr.outputs.pull-request-number }} --auto --squash
218+
env:
219+
GH_TOKEN: ${{ secrets.GH_PAT }}

0 commit comments

Comments
 (0)