diff --git a/.github/actions/next-stats-action/package.json b/.github/actions/next-stats-action/package.json index 4d2e88dae3e3e66..3949a110476ff35 100644 --- a/.github/actions/next-stats-action/package.json +++ b/.github/actions/next-stats-action/package.json @@ -1,6 +1,9 @@ { "private": true, "main": "src/index.js", + "scripts": { + "turbo": "turbo" + }, "dependencies": { "async-sema": "^3.1.0", "fs-extra": "^8.1.0", @@ -12,6 +15,7 @@ "prettier": "^1.18.2", "pretty-bytes": "^5.3.0", "pretty-ms": "^5.0.0", - "semver": "7.3.4" + "semver": "7.3.4", + "turbo": "1.6.3" } } diff --git a/.github/actions/next-stats-action/src/prepare/repo-setup.js b/.github/actions/next-stats-action/src/prepare/repo-setup.js index f490a48ba3daa10..f2de937a30597b4 100644 --- a/.github/actions/next-stats-action/src/prepare/repo-setup.js +++ b/.github/actions/next-stats-action/src/prepare/repo-setup.js @@ -10,6 +10,18 @@ const mockTrace = () => ({ traceChild: () => mockTrace(), }) +let turboRepoRoot = path.join(__dirname, '..', '..', '..', '..', '..') + +// stats-action runs this code without access to the original repo. +// In that case we just use the temporary directory (everything is temporary anyway in CI) +if (turboRepoRoot === '/') { + turboRepoRoot = path.join(__dirname, '..', '..') +} + +/** Save turbo cache to persistent storage */ +const turboCacheLocation = path.join(turboRepoRoot, 'node_modules/.cache/turbo') +const packedPkgsDir = path.join(turboRepoRoot, 'test/tmp/packedPkgs') + module.exports = (actionInfo) => { return { async cloneRepo(repoPath = '', dest = '') { @@ -81,9 +93,15 @@ module.exports = (actionInfo) => { await rootSpan .traceChild('prepare packages for packing') .traceAsyncFn(async () => { + await fs.ensureDir(packedPkgsDir) + const repoData = require(path.join(repoDir, 'package.json')) + for (const pkg of pkgs) { const pkgPath = path.join(repoDir, 'packages', pkg) - const packedPkgPath = path.join(pkgPath, `${pkg}-packed.tgz`) + const packedPkgPath = path.join( + packedPkgsDir, + `${pkg}-packed.tgz` + ) const pkgDataPath = path.join(pkgPath, 'package.json') if (!fs.existsSync(pkgDataPath)) { @@ -103,7 +121,8 @@ module.exports = (actionInfo) => { } for (const pkg of pkgDatas.keys()) { - const { pkgDataPath, pkgData } = pkgDatas.get(pkg) + const { pkgDataPath, pkgData, pkgPath, packedPkgPath } = + pkgDatas.get(pkg) for (const pkg of pkgDatas.keys()) { const { packedPkgPath } = pkgDatas.get(pkg) @@ -139,6 +158,27 @@ module.exports = (actionInfo) => { } } + // Turbo requires package manager specification + pkgData.packageManager = + pkgData.packageManager || repoData.packageManager + + pkgData.scripts = { + ...pkgData.scripts, + 'test-pack': `yarn pack -f ${packedPkgPath}`, + } + + await fs.writeJSON(path.join(pkgPath, 'turbo.json'), { + pipeline: { + 'test-pack': { + outputs: [packedPkgPath], + inputs: ['*', '!node_modules/', '!.turbo/'], + }, + }, + }) + + // Turbo requires pnpm-lock.yaml that is not empty + await fs.writeFile(path.join(pkgPath, 'pnpm-lock.yaml'), '') + await fs.writeFile( pkgDataPath, JSON.stringify(pkgData, null, 2), @@ -157,9 +197,9 @@ module.exports = (actionInfo) => { await packingSpan .traceChild(`pack ${pkgName}`) .traceAsyncFn(async () => { - const { pkg, pkgPath } = pkgDatas.get(pkgName) + const { pkgPath } = pkgDatas.get(pkgName) await exec( - `cd ${pkgPath} && yarn pack -f '${pkg}-packed.tgz'`, + `pnpm run --dir="${turboRepoRoot}" turbo run test-pack --cache-dir="${turboCacheLocation}" --cwd="${pkgPath}"`, true ) }) diff --git a/package.json b/package.json index c2bdd60d026b97f..fac64903af2e8d9 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "build": "turbo run build", "lerna": "lerna", "dev": "turbo run dev --parallel", + "turbo": "turbo", "test-types": "pnpm tsc", "test-unit": "pnpm jest test/unit/", "test-dev": "cross-env NEXT_TEST_MODE=dev pnpm testheadless",