2424 - name : Checkout
2525 uses : actions/checkout@v4
2626
27+ # Derive repo name safely for all events (release/workflow_dispatch)
28+ - name : Derive REPO_NAME
29+ id : repoinfo
30+ run : |
31+ echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> "$GITHUB_ENV"
32+ echo "OWNER_NAME=${GITHUB_REPOSITORY%%/*}" >> "$GITHUB_ENV"
33+ echo "Repo resolved to: ${GITHUB_REPOSITORY##*/}"
34+
2735 - name : Resolve release (release event or manual by tag)
2836 id : rel
2937 uses : actions/github-script@v7
6775 core.setOutput('name', name);
6876 core.setOutput('published_at', release.published_at || new Date().toISOString());
6977 core.setOutput('assets', JSON.stringify(assets));
78+
7079 - name : Prepare assets directory
7180 run : mkdir -p out meta
7281
82+ - name : Configure AWS credentials
83+ uses : aws-actions/configure-aws-credentials@v4
84+ with :
85+ aws-access-key-id : ${{ secrets.CATALOG_AWS_ACCESS_KEY_ID }}
86+ aws-secret-access-key : ${{ secrets.CATALOG_AWS_SECRET_ACCESS_KEY }}
87+ aws-region : ${{ env.AWS_REGION }}
88+
7389 - name : Download assets from GitHub
7490 run : |
7591 echo '${{ steps.rel.outputs.assets }}' \
@@ -80,13 +96,29 @@ jobs:
8096 curl -L --fail -o "$f" "$url"
8197 done
8298
99+ - name : Fetch existing releases.json from S3 (if any)
100+ env :
101+ BUCKET : ${{ env.BUCKET }}
102+ REPO_NAME : ${{ env.REPO_NAME }}
103+ run : |
104+ mkdir -p meta
105+ KEY="$REPO_NAME/releases/releases.json"
106+ if aws s3api head-object --bucket "$BUCKET" --key "$KEY" >/dev/null 2>&1; then
107+ echo "Found $KEY in S3. Downloading..."
108+ aws s3 cp "s3://$BUCKET/$KEY" meta/releases.json
109+ else
110+ echo "No $KEY in S3. Initializing with empty array."
111+ echo '[]' > meta/releases.json
112+ fi
113+
83114 - name : Build/merge releases.json (keep max N entries)
84115 env :
85116 TAG : ${{ steps.rel.outputs.tag }}
86117 NAME : ${{ steps.rel.outputs.name }}
87118 PUBLISHED_AT : ${{ steps.rel.outputs.published_at }}
88119 CDN_HOST : ${{ env.CDN_HOST }}
89120 MAX_HISTORY : ${{ env.MAX_HISTORY }}
121+ REPO_NAME : ${{ env.REPO_NAME }}
90122 run : |
91123 test -f meta/releases.json || echo '[]' > meta/releases.json
92124 node - <<'NODE'
98130 const PUBLISHED_AT = process.env.PUBLISHED_AT || new Date().toISOString()
99131 const CDN = process.env.CDN_HOST
100132 const MAX = parseInt(process.env.MAX_HISTORY || '20', 10)
133+ const REPO = process.env.REPO_NAME
101134
102135 const files = fs.readdirSync('out')
103136 const sizeOf = f => fs.statSync(path.join('out', f)).size
@@ -109,7 +142,8 @@ jobs:
109142 assets: files.map(f => ({
110143 name: f,
111144 size: sizeOf(f),
112- browser_download_url: `https://${CDN}/releases/${TAG}/${f}`
145+ // URL now includes repo prefix
146+ browser_download_url: `https://${CDN}/${REPO}/releases/${TAG}/${f}`
113147 }))
114148 }
115149
@@ -127,34 +161,34 @@ jobs:
127161 fs.writeFileSync(p, JSON.stringify(arr, null, 2))
128162 NODE
129163
130- - name : Configure AWS credentials
131- uses : aws-actions/configure-aws-credentials@v4
132- with :
133- aws-access-key-id : ${{ secrets.CATALOG_AWS_ACCESS_KEY_ID }}
134- aws-secret-access-key : ${{ secrets.CATALOG_AWS_SECRET_ACCESS_KEY }}
135- aws-region : ${{ env.AWS_REGION }}
136-
137- - name : Upload assets to S3
164+ - name : Upload assets to S3 (repo-scoped path)
138165 env :
139166 TAG : ${{ steps.rel.outputs.tag }}
140167 BUCKET : ${{ env.BUCKET }}
168+ REPO_NAME : ${{ env.REPO_NAME }}
141169 run : |
142- echo "Uploading assets for tag $TAG to s3://$BUCKET/releases/$TAG/"
143- aws s3 sync out "s3://$BUCKET/releases/$TAG/"
170+ DEST="s3://$BUCKET/$REPO_NAME/releases/$TAG/"
171+ echo "Uploading assets for tag $TAG to $DEST"
172+ aws s3 sync out "$DEST"
144173
145- - name : Update 'latest' alias in S3
174+ - name : Update 'latest' alias in S3 (repo-scoped)
146175 env :
147176 TAG : ${{ steps.rel.outputs.tag }}
148177 BUCKET : ${{ env.BUCKET }}
178+ REPO_NAME : ${{ env.REPO_NAME }}
149179 run : |
180+ LATEST_PREFIX="s3://$BUCKET/$REPO_NAME/releases/latest/"
181+ TAG_PREFIX="s3://$BUCKET/$REPO_NAME/releases/$TAG/"
150182 echo "Updating 'latest' alias to point to tag $TAG"
151- aws s3 rm "s3://$BUCKET/releases/latest/ " --recursive || true
152- aws s3 sync "s3://$BUCKET/releases/$TAG/ " "s3://$BUCKET/releases/latest/ "
183+ aws s3 rm "$LATEST_PREFIX " --recursive || true
184+ aws s3 sync "$TAG_PREFIX " "$LATEST_PREFIX "
153185
154- - name : Upload releases.json
186+ - name : Upload releases.json (repo-scoped)
155187 env :
156188 BUCKET : ${{ env.BUCKET }}
189+ REPO_NAME : ${{ env.REPO_NAME }}
157190 run : |
158- echo "Uploading releases.json"
159- aws s3 cp meta/releases.json "s3://$BUCKET/releases/releases.json" \
191+ KEY="$REPO_NAME/releases/releases.json"
192+ echo "Uploading releases.json to s3://$BUCKET/$KEY"
193+ aws s3 cp meta/releases.json "s3://$BUCKET/$KEY" \
160194 --content-type 'application/json' --cache-control 'no-store'
0 commit comments