@@ -2,16 +2,12 @@ name: Mirror Releases to S3
22
33on :
44 release :
5- types : [published] # Auto trigger when a release is published
6- workflow_dispatch : # Manual trigger
5+ types : [published]
6+ workflow_dispatch :
77 inputs :
88 tag_name :
9- description : " Release tag (e.g. v0.6.9). Takes precedence if both provided."
10- required : false
11- type : string
12- release_name :
13- description : " Release name (e.g. Jan 0.6.9). Used when tag_name is not provided."
14- required : false
9+ description : " Release tag to mirror (e.g. v0.6.9). Required for manual runs."
10+ required : true
1511 type : string
1612
1713jobs :
@@ -20,48 +16,42 @@ jobs:
2016 permissions :
2117 contents : read
2218 env :
23- CDN_HOST : catalog.jan.ai # CDN domain pointing to S3 (CloudFront/Cloudflare/R2)
19+ CDN_HOST : catalog.jan.ai # CDN domain pointing to S3 (CloudFront/Cloudflare/R2)
2420 BUCKET : ${{ secrets.CATALOG_AWS_S3_BUCKET_NAME }}
2521 AWS_REGION : ${{ secrets.CATALOG_AWS_REGION }}
2622 MAX_HISTORY : " 20"
2723 steps :
2824 - name : Checkout
2925 uses : actions/checkout@v4
3026
31- - name : Resolve release (automatic or manual)
27+ - name : Resolve release (release event or manual by tag )
3228 id : rel
3329 uses : actions/github-script@v7
3430 with :
3531 script : |
3632 const { owner, repo } = context.repo;
37- const tagInput = core.getInput('tag_name') ;
38- const nameInput = core.getInput('release_name') ;
39- let release ;
33+ const eventName = context.eventName ;
34+ const evInputs = (context.payload && context.payload.inputs) || {} ;
35+ const tagInput = String(core.getInput('tag_name') || evInputs.tag_name || '').trim() ;
4036
41- // Prefer tag_name if provided
42- if (tagInput) {
43- try {
44- release = await github.rest.repos.getReleaseByTag({ owner, repo, tag: tagInput });
45- release = release.data;
46- } catch (e) {
47- core.setFailed(`Release not found for tag '${tagInput}'.`);
48- return;
49- }
50- } else if (nameInput) {
51- // GitHub does not support get-by-name directly → list and search
52- const rels = await github.paginate(github.rest.repos.listReleases, { owner, repo, per_page: 100 });
53- release = rels.find(r => (r.name || r.tag_name) === nameInput);
54- if (!release) {
55- core.setFailed(`Release not found for name '${nameInput}'.`);
37+ let release = null;
38+
39+ if (eventName === 'release' && context.payload.release) {
40+ // Auto: use release payload
41+ release = context.payload.release;
42+ } else {
43+ // Manual: require tag_name (no latest fallback)
44+ if (!tagInput) {
45+ core.setFailed('No tag_name provided. Please specify a release tag.');
5646 return;
5747 }
58- } else {
59- // Triggered by release event
60- if (!context.payload.release) {
61- core.setFailed('No release found in payload and no manual input provided.');
48+ try {
49+ const r = await github.rest.repos.getReleaseByTag({ owner, repo, tag: tagInput });
50+ release = r.data;
51+ } catch {
52+ core.setFailed(`Release not found for tag '${tagInput}'.`);
6253 return;
6354 }
64- release = context.payload.release;
6555 }
6656
6757 const tag = release.tag_name;
@@ -72,11 +62,11 @@ jobs:
7262 gh_url: a.browser_download_url
7363 }));
7464
65+ core.info(`Resolved release: tag=${tag}, name=${name}, assets=${assets.length}`);
7566 core.setOutput('tag', tag);
7667 core.setOutput('name', name);
7768 core.setOutput('published_at', release.published_at || new Date().toISOString());
7869 core.setOutput('assets', JSON.stringify(assets));
79-
8070 - name : Prepare assets directory
8171 run : mkdir -p out meta
8272
9080 curl -L --fail -o "$f" "$url"
9181 done
9282
93- - name : Build/merge releases.json (keep max 100 entries)
83+ - name : Build/merge releases.json (keep max N entries)
9484 env :
9585 TAG : ${{ steps.rel.outputs.tag }}
9686 NAME : ${{ steps.rel.outputs.name }}
10797 const NAME = process.env.NAME || TAG
10898 const PUBLISHED_AT = process.env.PUBLISHED_AT || new Date().toISOString()
10999 const CDN = process.env.CDN_HOST
110- const MAX = parseInt(process.env.MAX_HISTORY || '100 ', 10)
100+ const MAX = parseInt(process.env.MAX_HISTORY || '20 ', 10)
111101
112102 const files = fs.readdirSync('out')
113103 const sizeOf = f => fs.statSync(path.join('out', f)).size
0 commit comments