Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ci: add next tag #61

Merged
merged 12 commits into from
Apr 3, 2024
6 changes: 3 additions & 3 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,12 @@ jobs:
GITHUB_TOKEN: ${{ secrets.REPO_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

- name: Release to @dev tag
- name: Release to @next tag
if: steps.changesets.outputs.published != 'true'
run: |
git checkout main
pnpm changeset version --snapshot dev
pnpm changeset publish --tag dev
pnpm changeset version --snapshot next
pnpm changeset publish --tag next
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand Down
28 changes: 28 additions & 0 deletions .github/workflows/unpublish-npm.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: "Unpublish old versions"

on:
workflow_dispatch:
inputs:
delete_packages:
type: boolean
description: Delete packages? otherwise dry-run mode will be used
default: false

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
clean-npm-versions:
name: Unpublish versions next, preview, main...
runs-on: buildjet-4vcpu-ubuntu-2204
steps:
- uses: actions/checkout@v3
- uses: FuelLabs/github-actions/setups/node@master
- uses: FuelLabs/github-actions/setups/npm@master
with:
npm-token: ${{ secrets.NPM_TOKEN }}
- run: |
node ./scripts/unpublish.js
env:
DELETE_PACKAGES: ${{ github.event.inputs.delete_packages}}
87 changes: 87 additions & 0 deletions scripts/unpublish.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
const { readFile, readdir } = require('node:fs').promises;
const { join } = require('node:path');
const util = require('node:util');
const { compare } = require('compare-versions');
helciofranco marked this conversation as resolved.
Show resolved Hide resolved
const exec = util.promisify(require('node:child_process').exec);
const { version } = require('../packages/react/package.json');

const DELETE_TAGS = /next|dev|rc|main/;
const CURRENT_VERSION = version;
const DELETE_PACKAGES = process.env.DELETE_PACKAGES === 'true';
const dryRun = DELETE_PACKAGES ? '' : '--dry-run';

async function getPublicPackages() {
const packages = await readdir(join(__dirname, '../packages'), {
withFileTypes: true,
});
const packagesNames = await Promise.all(
packages.map(async (p) => {
try {
const packageContent = await readFile(
join(p.path, p.name, 'package.json'),
'utf8',
);
const pkg = JSON.parse(packageContent.toString());

if (pkg.private) return null;
return pkg.name;
} catch (_err) {
return null;
}
}),
);
return packagesNames.filter((p) => !!p);
}

async function main() {
console.log('Get public packages');
const packages = await getPublicPackages();

for (const packageName of packages) {
console.log(
[
'\n',
'##############################################',
`➡️ ${packageName}`,
'##############################################',
'\n',
].join('\n'),
);
console.log(`📦 Fetching ${packageName} versions`);
const { versions } = await fetch(
`https://registry.npmjs.org/${packageName}`,
).then((resp) => resp.json());
const versionsToDelete = Object.keys(versions).filter((version) => {
// Filter all versions that have tags like next, master, preview but are not related to the current version.
// This avoids for current WIP versions to be deleted during test.
return (
version.search(DELETE_TAGS) > -1 &&
!compare(version, CURRENT_VERSION, '>=')
);
});
console.log('The following versions will be deleted:');
console.log(versionsToDelete.map((v) => ` - ${v}`).join('\n'));
for (const versionDelete of versionsToDelete) {
console.log(`\n🗑️ Deleting ${packageName}@${versionDelete}...`);
console.log(dryRun);
const { stderr } = await exec(
`npm unpublish ${packageName}@${versionDelete} ${dryRun}`,
);
if (stderr) {
console.log(`❌ Error ${packageName}@${versionDelete} not deleted!\n`);
console.log(stderr);
} else {
console.log(`✅ Package ${packageName}@${versionDelete} deleted!\n`);
}
}
}
}

main()
.then(() => {
console.log('✅ Packages versions removed successfully');
})
.catch((err) => {
console.error(err);
process.exit(1);
});
Loading