1313 description : " Release name (e.g. Jan 0.6.9). Used when tag_name is not provided."
1414 required : false
1515 type : string
16+ push : # Auto trigger on push for a specific test branch
17+ branches :
18+ - feat/release-to-aws-s3 # ← change to your PR branch name
1619
1720jobs :
1821 mirror :
1922 runs-on : ubuntu-latest
2023 permissions :
2124 contents : read
2225 env :
23- CDN_HOST : catalog.jan.ai # CDN domain pointing to S3 (CloudFront/Cloudflare/R2)
26+ CDN_HOST : catalog.jan.ai # CDN domain pointing to S3 (CloudFront/Cloudflare/R2)
2427 BUCKET : ${{ secrets.CATALOG_AWS_S3_BUCKET_NAME }}
2528 AWS_REGION : ${{ secrets.CATALOG_AWS_REGION }}
2629 MAX_HISTORY : " 20"
30+ # Hardcoded test values used only on push (optional)
31+ TEST_TAG : b4951 # ← put a real existing tag to test
32+ TEST_NAME : " " # or a release name if you prefer to match by name
2733 steps :
2834 - name : Checkout
2935 uses : actions/checkout@v4
3036
31- - name : Resolve release (automatic or manual)
37+ - name : Resolve release (automatic/ manual/push-test )
3238 id : rel
3339 uses : actions/github-script@v7
3440 with :
3541 script : |
3642 const { owner, repo } = context.repo;
43+
44+ // Inputs from workflow_dispatch
3745 const tagInput = core.getInput('tag_name');
3846 const nameInput = core.getInput('release_name');
39- let release;
40-
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
47+ // Env for push-test
48+ const testTag = process.env.TEST_TAG && process.env.TEST_TAG.trim() ? process.env.TEST_TAG.trim() : '';
49+ const testName = process.env.TEST_NAME && process.env.TEST_NAME.trim() ? process.env.TEST_NAME.trim() : '';
50+
51+ // Resolution order:
52+ // 1) tag_name input
53+ // 2) TEST_TAG env (for push test)
54+ // 3) release_name input
55+ // 4) TEST_NAME env (for push test)
56+ // 5) context.payload.release (release event)
57+ let release = null;
58+ let chosen = null;
59+
60+ async function getByTag(tag) {
61+ const r = await github.rest.repos.getReleaseByTag({ owner, repo, tag });
62+ return r.data;
63+ }
64+
65+ async function getByName(name) {
5266 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}'.`);
56- return;
57- }
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.');
67+ return rels.find(r => (r.name || r.tag_name) === name) || null;
68+ }
69+
70+ try {
71+ if (tagInput) {
72+ chosen = `tag_input:${tagInput}`;
73+ release = await getByTag(tagInput);
74+ } else if (testTag) {
75+ chosen = `test_tag:${testTag}`;
76+ release = await getByTag(testTag);
77+ } else if (nameInput) {
78+ chosen = `name_input:${nameInput}`;
79+ release = await getByName(nameInput);
80+ } else if (testName) {
81+ chosen = `test_name:${testName}`;
82+ release = await getByName(testName);
83+ } else if (context.payload.release) {
84+ chosen = 'payload_release_event';
85+ release = context.payload.release;
86+ } else {
87+ core.setFailed('No release reference provided: set tag_name, TEST_TAG, release_name, TEST_NAME, or trigger from a release event.');
6288 return;
6389 }
64- release = context.payload.release;
90+ } catch (e) {
91+ core.setFailed(`Failed to resolve release (${chosen}). ${e.message}`);
92+ return;
93+ }
94+
95+ if (!release) {
96+ core.setFailed(`Release not found (${chosen}).`);
97+ return;
6598 }
6699
67100 const tag = release.tag_name;
72105 gh_url: a.browser_download_url
73106 }));
74107
108+ core.info(`Resolved release via ${chosen}: tag=${tag}, name=${name}, assets=${assets.length}`);
75109 core.setOutput('tag', tag);
76110 core.setOutput('name', name);
77111 core.setOutput('published_at', release.published_at || new Date().toISOString());
90124 curl -L --fail -o "$f" "$url"
91125 done
92126
93- - name : Build/merge releases.json (keep max 100 entries)
127+ - name : Build/merge releases.json (keep max N entries)
94128 env :
95129 TAG : ${{ steps.rel.outputs.tag }}
96130 NAME : ${{ steps.rel.outputs.name }}
@@ -107,7 +141,7 @@ jobs:
107141 const NAME = process.env.NAME || TAG
108142 const PUBLISHED_AT = process.env.PUBLISHED_AT || new Date().toISOString()
109143 const CDN = process.env.CDN_HOST
110- const MAX = parseInt(process.env.MAX_HISTORY || '100 ', 10)
144+ const MAX = parseInt(process.env.MAX_HISTORY || '20 ', 10)
111145
112146 const files = fs.readdirSync('out')
113147 const sizeOf = f => fs.statSync(path.join('out', f)).size
0 commit comments