Skip to content

Commit 1c8680f

Browse files
feat(upgrade): Create a github action to yarn upgrade
1 parent 4a957d9 commit 1c8680f

File tree

6 files changed

+99
-20
lines changed

6 files changed

+99
-20
lines changed

actions/upgrade/Dockerfile

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
FROM node:12
2+
3+
COPY package.json /package.json
4+
RUN yarn
5+
COPY entrypoint.sh /entrypoint.sh
6+
COPY upgrade.js /upgrade.js
7+
ENTRYPOINT ["/entrypoint.sh"]

actions/upgrade/action.yml

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: 'Upgrade dependencies'
2+
description: 'Upgrade dependencies'
3+
inputs:
4+
deptype:
5+
description: 'dependencies or devDependencies'
6+
required: true
7+
default: 'dependencies'
8+
exclude:
9+
description: 'packages to exclude'
10+
required: false
11+
latest:
12+
description: 'if `true`, uses yarn upgrade --latest'
13+
required: true
14+
default: 'false'
15+
outputs:
16+
upgrades: # id of output
17+
description: 'The packages@versions that were updated'
18+
runs:
19+
using: 'docker'
20+
image: 'Dockerfile'
21+
args:
22+
- ${{ inputs.deptype }}
23+
- ${{ inputs.exclude }}
24+
- ${{ inputs.latest }}

actions/upgrade/entrypoint.sh

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/usr/bin/env bash
2+
3+
/upgrade.js

actions/upgrade/package.json

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"name": "upgrade",
3+
"private": true,
4+
"version": "1.0.0",
5+
"dependencies": {
6+
"@yarnpkg/lockfile": "^1.1.0"
7+
}
8+
}

actions/upgrade/upgrade.js

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/usr/bin/env node
2+
const fs = require("fs");
3+
const childProcess = require("child_process");
4+
const lockfile = require("@yarnpkg/lockfile");
5+
6+
// dependencies or devDependencies
7+
const depType = process.env.INPUT_DEPTYPE || "dependencies";
8+
const exclude = (process.env.INPUT_EXCLUDE || "").split("s*,s*").filter(x=>x);
9+
const latest = process.env.INPUT_LATEST === 'true' ? " --latest" : "";
10+
console.log({ depType, exclude, latest });
11+
12+
function getDeclaredDeps() {
13+
const pkg = JSON.parse(fs.readFileSync("package.json").toString());
14+
return (depObject = pkg[depType] || {});
15+
}
16+
17+
function getResolvedDeps() {
18+
const file = fs.readFileSync("yarn.lock", "utf8");
19+
const lockJson = lockfile.parse(file);
20+
return lockJson.object;
21+
}
22+
23+
console.log({ declared: getDeclaredDeps() });
24+
const packages = Object.keys(getDeclaredDeps()).filter(
25+
(pkg) => !exclude.includes(pkg)
26+
);
27+
28+
function getResolvedSemverMapping() {
29+
const declaredDeps = getDeclaredDeps();
30+
const resolvedDeps = getResolvedDeps();
31+
return packages.reduce((acc, pkg) => {
32+
const declared = declaredDeps[pkg];
33+
const semver = `${pkg}@${declaredDeps[pkg]}`;
34+
const resolved = resolvedDeps[semver].version;
35+
acc[pkg] = { declared, resolved };
36+
return acc;
37+
}, {});
38+
}
39+
40+
const before = getResolvedSemverMapping();
41+
42+
const cmd = `yarn upgrade ${packages.join(" ")} ${latest}`;
43+
console.log(cmd);
44+
childProcess.execSync(`${cmd}`, { stdio: "inherit" });
45+
46+
const after = getResolvedSemverMapping();
47+
48+
const changed = packages.filter(
49+
(pkg) => before[pkg].resolved !== after[pkg].resolved
50+
);
51+
52+
const upgrades = changed
53+
.map((pkg) => `${pkg}@${after[pkg].resolved}`)
54+
.join(" ");
55+
56+
childProcess.execSync(`git status`, { stdio: "inherit" });
57+
console.log(`::set-output name=upgrades::${upgrades}`);

docker/Dockerfile

-20
This file was deleted.

0 commit comments

Comments
 (0)