Skip to content

Commit

Permalink
Improve fault resilience of release asset uploading
Browse files Browse the repository at this point in the history
  • Loading branch information
bjoluc committed Jul 17, 2024
1 parent 300f199 commit b375001
Showing 1 changed file with 53 additions and 38 deletions.
91 changes: 53 additions & 38 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,55 +53,70 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Pack Dist Archive
if: steps.changesets.outputs.published == 'true'
run: npm run build:archive

- name: Upload Release Assets
uses: actions/github-script@v4
if: steps.changesets.outputs.published == 'true'
uses: actions/github-script@v7
with:
script: |
const fs = require("fs");
const publishedPackages = ${{ steps.changesets.outputs.publishedPackages }};
const { owner, repo } = context.repo;
const distFile = "dist.zip";
const assetName = "jspsych.zip";
let errorMessage;
for (const { name, version } of publishedPackages) {
const tag = `${name}@${version}`;
console.log(`Uploading dist archive release asset for ${tag}`);
try {
// https://docs.github.com/en/rest/reference/repos#get-a-release-by-tag-name
const releaseId = (
await github.request("GET /repos/{owner}/{repo}/releases/tags/{tag}", {
owner,
repo,
tag,
})
).data.id;
// https://octokit.github.io/rest.js/v18#repos-upload-release-asset
await github.repos.uploadReleaseAsset({
owner,
repo,
release_id: releaseId,
name: `jspsych.zip`,
label: "Dist archive (zip)",
headers: {
"content-type": "application/zip",
"content-length": fs.statSync(distFile).size,
},
data: fs.readFileSync(distFile),
});
} catch (error) {
console.log(error);
errorMessage = error.message;
/**
* Returns all recent releases without a dist archive asset, up to (excluding) the first release
* that has a dist archive asset.
**/
async function fetchReleasesWithoutDistArchive() {
const releasesWithoutDistArchive = [];
for await (const response of github.paginate.iterator(github.rest.repos.listReleases, {
owner,
repo,
})) {
for (const release of response.data) {
if (!release.assets.some((asset) => asset.name === assetName)) {
releasesWithoutDistArchive.push(release);
} else {
return releasesWithoutDistArchive;
}
}
}
return releasesWithoutDistArchive;
}
console.log("Collecting recent releases that do not have a dist archive");
const releasesWithoutDistArchive = await fetchReleasesWithoutDistArchive();
if (releasesWithoutDistArchive.length === 0) {
console.log("The most recent release already has a dist archive. Skipping asset upload.");
return;
}
if (errorMessage) {
core.setFailed(errorMessage);
} else {
console.log(`Release assets successfully uploaded`);
console.log(`Found ${releasesWithoutDistArchive.length} recent releases without a dist archive.`);
const distFileSize = fs.statSync(distFile).size;
const distFileContents = fs.readFileSync(distFile);
// Upload dist archive for each release without a dist archive, in reverse order so re-running an
// aborted or failed job will pick up where it left off last time
for (const release of releasesWithoutDistArchive.reverse()) {
console.log(`Uploading dist archive release asset for ${release.tag_name}`);
// https://octokit.github.io/rest.js/v20#repos-upload-release-asset
await github.repos.uploadReleaseAsset({
owner,
repo,
release_id: release.id,
name: assetName,
label: "Dist archive (zip)",
headers: {
"content-type": "application/zip",
"content-length": distFileSize,
},
data: distFileContents,
});
}

0 comments on commit b375001

Please sign in to comment.