Skip to content

Commit 5e933f3

Browse files
committed
ci: auto upgrade deps and create pr
1 parent c4d9a09 commit 5e933f3

3 files changed

Lines changed: 179 additions & 0 deletions

File tree

.github/scripts/upgrade-deps.mjs

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
import fs from 'node:fs';
2+
import path from 'node:path';
3+
4+
const ROOT = process.cwd();
5+
6+
// ============ GitHub API ============
7+
async function getLatestTagCommit(owner, repo) {
8+
const res = await fetch(`https://api.github.com/repos/${owner}/${repo}/tags`, {
9+
headers: {
10+
Authorization: `token ${process.env.GITHUB_TOKEN}`,
11+
Accept: 'application/vnd.github.v3+json',
12+
},
13+
});
14+
const tags = await res.json();
15+
if (!tags.length) throw new Error(`No tags found for ${owner}/${repo}`);
16+
return tags[0].commit.sha;
17+
}
18+
19+
// ============ npm Registry ============
20+
async function getLatestNpmVersion(packageName) {
21+
const res = await fetch(`https://registry.npmjs.org/${packageName}/latest`);
22+
const data = await res.json();
23+
return data.version;
24+
}
25+
26+
// ============ Update .upstream-versions.json ============
27+
async function updateUpstreamVersions() {
28+
const filePath = path.join(ROOT, 'packages/tools/.upstream-versions.json');
29+
const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));
30+
31+
// rolldown -> rolldown/rolldown
32+
data.rolldown.hash = await getLatestTagCommit('rolldown', 'rolldown');
33+
34+
// rolldown-vite -> vitejs/vite
35+
data['rolldown-vite'].hash = await getLatestTagCommit('vitejs', 'vite');
36+
37+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n');
38+
console.log('Updated .upstream-versions.json');
39+
}
40+
41+
// ============ Update pnpm-workspace.yaml ============
42+
async function updatePnpmWorkspace(vitestVersion, tsdownVersion) {
43+
const filePath = path.join(ROOT, 'pnpm-workspace.yaml');
44+
let content = fs.readFileSync(filePath, 'utf8');
45+
46+
// Update vitest-dev override
47+
content = content.replace(
48+
/vitest-dev: npm:vitest@\^[\d.]+/,
49+
`vitest-dev: npm:vitest@^${vitestVersion}`,
50+
);
51+
52+
// Update tsdown in catalog
53+
content = content.replace(/tsdown: \^[\d.]+/, `tsdown: ^${tsdownVersion}`);
54+
55+
fs.writeFileSync(filePath, content);
56+
console.log('Updated pnpm-workspace.yaml');
57+
}
58+
59+
// ============ Update packages/test/package.json ============
60+
async function updateTestPackage(vitestVersion) {
61+
const filePath = path.join(ROOT, 'packages/test/package.json');
62+
const pkg = JSON.parse(fs.readFileSync(filePath, 'utf8'));
63+
64+
// Update all @vitest/* devDependencies
65+
for (const dep of Object.keys(pkg.devDependencies)) {
66+
if (dep.startsWith('@vitest/')) {
67+
pkg.devDependencies[dep] = vitestVersion;
68+
}
69+
}
70+
71+
// Update vitest-dev devDependency
72+
if (pkg.devDependencies['vitest-dev']) {
73+
pkg.devDependencies['vitest-dev'] = `^${vitestVersion}`;
74+
}
75+
76+
// Update @vitest/ui peerDependency if present
77+
if (pkg.peerDependencies?.['@vitest/ui']) {
78+
pkg.peerDependencies['@vitest/ui'] = vitestVersion;
79+
}
80+
81+
fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\n');
82+
console.log('Updated packages/test/package.json');
83+
}
84+
85+
// ============ Main ============
86+
async function main() {
87+
console.log('Fetching latest versions...');
88+
89+
const [vitestVersion, tsdownVersion] = await Promise.all([
90+
getLatestNpmVersion('vitest'),
91+
getLatestNpmVersion('tsdown'),
92+
]);
93+
94+
console.log(`vitest: ${vitestVersion}`);
95+
console.log(`tsdown: ${tsdownVersion}`);
96+
97+
await updateUpstreamVersions();
98+
await updatePnpmWorkspace(vitestVersion, tsdownVersion);
99+
await updateTestPackage(vitestVersion);
100+
101+
console.log('Done!');
102+
}
103+
104+
main().catch((err) => {
105+
console.error(err);
106+
process.exit(1);
107+
});

.github/workflows/e2e-test.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ on:
77
push:
88
branches:
99
- main
10+
- deps/upstream-update
1011
paths-ignore:
1112
- '**/*.md'
1213

.github/workflows/upgrade-deps.yml

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
name: Upgrade Upstream Dependencies
2+
3+
on:
4+
schedule:
5+
- cron: '0 0 * * *' # Daily at midnight UTC
6+
workflow_dispatch: # Manual trigger
7+
8+
permissions: {}
9+
10+
jobs:
11+
upgrade:
12+
runs-on: ubuntu-latest
13+
permissions:
14+
contents: write
15+
pull-requests: write
16+
steps:
17+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
18+
- uses: ./.github/actions/clone
19+
20+
- name: Configure Git for access to vite-task
21+
run: git config --global url."https://x-access-token:${{ secrets.VITE_TASK_TOKEN }}@github.com/".insteadOf "https://github.com/"
22+
23+
- uses: oxc-project/setup-rust@d286d43bc1f606abbd98096666ff8be68c8d5f57 # v1.0.0
24+
with:
25+
save-cache: ${{ github.ref_name == 'main' }}
26+
cache-key: upgrade-deps
27+
28+
- uses: oxc-project/setup-node@fdbf0dfd334c4e6d56ceeb77d91c76339c2a0885 # v1.0.4
29+
30+
- name: Rustup Adds Target
31+
run: rustup target add x86_64-unknown-linux-gnu
32+
33+
- name: Rustup Adds Target for rolldown
34+
working-directory: rolldown
35+
run: rustup target add x86_64-unknown-linux-gnu
36+
37+
- name: Upgrade dependencies
38+
id: upgrade
39+
env:
40+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
41+
run: node .github/scripts/upgrade-deps.mjs
42+
43+
- name: Sync remote and build
44+
id: build
45+
continue-on-error: true # Create PR even if build fails
46+
run: |
47+
pnpm install --no-frozen-lockfile
48+
pnpm tool sync-remote
49+
pnpm install --no-frozen-lockfile
50+
51+
- name: Build
52+
uses: ./.github/actions/build-upstream
53+
with:
54+
target: x86_64-unknown-linux-gnu
55+
build-rolldown-native: 'true'
56+
57+
- name: Create/Update PR
58+
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
59+
with:
60+
branch: deps/upstream-update
61+
title: 'feat(deps): upgrade upstream dependencies'
62+
body: |
63+
Automated daily upgrade of upstream dependencies:
64+
- rolldown (latest tag)
65+
- rolldown-vite (latest tag)
66+
- vitest (latest npm version)
67+
- tsdown (latest npm version)
68+
69+
Build status: ${{ steps.build.outcome }}
70+
commit-message: 'feat(deps): upgrade upstream dependencies'
71+
delete-branch: true

0 commit comments

Comments
 (0)