Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion canary-publish/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ jobs:
npm_tag: canary # npm 배포 시 달아줄 태그는 무엇으로 할지적어주세요
npm_token: ${{ secrets.NPM_TOKEN }} # npm 배포시 필요한 publish token 을 넣어주세요
publish_script: pnpm run deploy:canary # canary 배포 실행 script 를 넣어주세요
packages_dir: packages # 변경을 탐지할 패키지들의 폴더명을 추가해주세요. (default: packages,share)
packages_dir: packages # 변경을 탐지할 패키지들의 폴더명을 추가해주세요. (default: packages,share)
excludes: ".turbo,.github" # 변경감지를 제외하고싶은 파일 또는 폴더 경로
```

## 실행 결과
Expand Down
4 changes: 4 additions & 0 deletions canary-publish/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,7 @@ inputs:
description: "패키지 디렉터리"
required: false
default: "packages,share"
excludes:
description: "제외할 경로"
required: false
default: ".github,.changeset"
74 changes: 59 additions & 15 deletions canary-publish/dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -53253,12 +53253,14 @@ const read_1 = __importDefault(__nccwpck_require__(1746));
const fs_extra_1 = __importDefault(__nccwpck_require__(77));
const resolve_from_1 = __importDefault(__nccwpck_require__(1345));
const apis_1 = __importDefault(__nccwpck_require__(6500));
const utils_1 = __nccwpck_require__(3927);
const file_1 = __nccwpck_require__(398);
const npm_1 = __nccwpck_require__(6824);
const publish_1 = __nccwpck_require__(9459);
const cwd = process.cwd();
function main() {
return __awaiter(this, void 0, void 0, function* () {
var _a;
// npmrc 설정
yield (0, npm_1.setNpmRc)();
const { pullFetchers, issueFetchers } = (0, apis_1.default)();
Expand All @@ -53271,18 +53273,27 @@ function main() {
yield issueFetchers.addComment('올바른 카나리 버전 배포를 위해 detect version을 명시해주세요');
return;
}
const changedFiles = yield (0, utils_1.getChangedAllFiles)({
pullNumber: pullRequestInfo.number,
});
// 변경된 패키지 파일을 가져온다
const packagesDir = core.getInput('packages_dir');
const excludes = (_a = core.getInput('excludes')) !== null && _a !== void 0 ? _a : '';
const changedPackageInfos = yield (0, file_1.getChangedPackages)({
pullNumber: pullRequestInfo.number,
packagesDir: packagesDir.split(','),
excludes: excludes.split(','),
changedFiles,
});
if (changedPackageInfos.length === 0) {
core.info('변경된 패키지가 없습니다.');
return;
}
// 변경사항외 다른 패키지들의 배포를 막습니다.
yield (0, file_1.protectUnchangedPackages)(changedPackageInfos);
yield Promise.all([
// 이번 변경건과 관련없는 모든 .changeset/*.md 파일을 제거한다.
(0, file_1.removeChangesetMdFiles)({ changedFiles }),
// 변경사항외 다른 패키지들의 배포를 막습니다.
(0, file_1.protectUnchangedPackages)(changedPackageInfos),
]);
// 패키지 변경 버전 반영
yield (0, exec_1.exec)('node', [(0, resolve_from_1.default)(cwd, '@changesets/cli/bin.js'), 'version'], {
cwd,
Expand Down Expand Up @@ -53383,26 +53394,31 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getChangedPackages = getChangedPackages;
exports.getAllPackageJSON = getAllPackageJSON;
exports.protectUnchangedPackages = protectUnchangedPackages;
exports.removeChangesetMdFiles = removeChangesetMdFiles;
const core = __importStar(__nccwpck_require__(6108));
const fast_glob_1 = __importDefault(__nccwpck_require__(6014));
const fs_extra_1 = __importDefault(__nccwpck_require__(77));
const utils_1 = __nccwpck_require__(3927);
function getChangedPackages(_a) {
return __awaiter(this, arguments, void 0, function* ({ pullNumber, packagesDir }) {
const changedFiles = yield (0, utils_1.getChangedAllFiles)({
pullNumber,
});
return __awaiter(this, arguments, void 0, function* ({ changedFiles, packagesDir, excludes, }) {
const isIncludedRoot = packagesDir.includes('.') === true;
const targetDirectories = packagesDir.filter((packagename) => packagename !== '.');
const changedPackages = changedFiles.reduce((acc, { filename }) => {
const isTargetDirectories = packagesDir.some((packageDir) => filename.includes(`${packageDir}/`));
const isMarkdownFile = filename.endsWith('.md');
if (isTargetDirectories && !isMarkdownFile) {
const [packageRoot, packageName] = filename.split('/');
const packageJsonPath = [packageRoot, packageName, 'package.json'].join('/');
acc.push(packageJsonPath);
const 패키지대상인가 = isIncludedRoot || targetDirectories.some((packageDir) => filename.includes(`${packageDir}/`));
const 마크다운파일인가 = filename.endsWith('.md');
const 제외대상인가 = excludes.some((exclude) => {
return filename === exclude || filename.startsWith(`${exclude}`);
});
if (패키지대상인가 && !마크다운파일인가 && !제외대상인가) {
const packageJsonPath = isIncludedRoot ? 'package.json' : (0, utils_1.findNearestPackageJson)(filename);
if (packageJsonPath != null) {
acc.add(packageJsonPath);
}
}
return acc;
}, []);
return [...new Set(changedPackages)];
}, new Set());
console.log('필터링된 packages', Array.from(changedPackages)); // eslint-disable-line
return Array.from(changedPackages);
});
}
function getAllPackageJSON() {
Expand All @@ -53426,6 +53442,17 @@ function protectUnchangedPackages(changedPackages) {
}
});
}
function removeChangesetMdFiles(_a) {
return __awaiter(this, arguments, void 0, function* ({ changedFiles, }) {
const markdownPaths = yield (0, fast_glob_1.default)('.changeset/*.md');
return Promise.all(markdownPaths.map((markdownPath) => __awaiter(this, void 0, void 0, function* () {
if (changedFiles.find(({ filename }) => filename === markdownPath) == null) {
console.log(`PR과 관련없는 ${markdownPath} 제거`); // eslint-disable-line
yield fs_extra_1.default.remove(markdownPath);
}
})));
});
}


/***/ }),
Expand Down Expand Up @@ -53818,10 +53845,16 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getChangedAllFiles = getChangedAllFiles;
exports.findNearestPackageJson = findNearestPackageJson;
const path_1 = __importDefault(__nccwpck_require__(1017));
const core = __importStar(__nccwpck_require__(6108));
const github = __importStar(__nccwpck_require__(1645));
const fs_extra_1 = __importDefault(__nccwpck_require__(77));
const utils_1 = __nccwpck_require__(3927);
function getChangedAllFiles(_a) {
return __awaiter(this, arguments, void 0, function* ({ pullNumber }) {
Expand Down Expand Up @@ -53853,6 +53886,17 @@ function getChangedAllFiles(_a) {
return changedFiles;
});
}
function findNearestPackageJson(filePath) {
let currentDir = path_1.default.dirname(filePath);
while (currentDir !== path_1.default.parse(currentDir).root) {
const packageJsonPath = path_1.default.join(currentDir, 'package.json');
if (fs_extra_1.default.existsSync(packageJsonPath)) {
return packageJsonPath;
}
currentDir = path_1.default.dirname(currentDir);
}
return undefined;
}


/***/ }),
Expand Down
2 changes: 0 additions & 2 deletions canary-publish/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,9 @@
"@changesets/read": "^0.6.0",
"@vercel/ncc": "^0.38.1",
"fast-glob": "^3.3.2",
"fs-extra": "^8.1.0",
"resolve-from": "^5.0.0"
},
"devDependencies": {
"@types/fs-extra": "^8.0.0",
"@types/node": "^20.14.9"
}
}
20 changes: 16 additions & 4 deletions canary-publish/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ import fs from 'fs-extra'
import resolveFrom from 'resolve-from'

import createFetchers from '$actions/apis'
import {getChangedAllFiles} from '$actions/utils'

import {getChangedPackages, protectUnchangedPackages} from './utils/file'
import {getChangedPackages, protectUnchangedPackages, removeChangesetMdFiles} from './utils/file'
import {setNpmRc} from './utils/npm'
import {getPublishedPackageInfos} from './utils/publish'

Expand All @@ -30,20 +31,31 @@ async function main() {
return
}

const changedFiles = await getChangedAllFiles({
pullNumber: pullRequestInfo.number,
})

// 변경된 패키지 파일을 가져온다
const packagesDir = core.getInput('packages_dir')
const excludes = core.getInput('excludes') ?? ''

const changedPackageInfos = await getChangedPackages({
pullNumber: pullRequestInfo.number,
packagesDir: packagesDir.split(',') as string[],
excludes: excludes.split(',') as string[],
changedFiles,
})

if (changedPackageInfos.length === 0) {
core.info('변경된 패키지가 없습니다.')
return
}

// 변경사항외 다른 패키지들의 배포를 막습니다.
await protectUnchangedPackages(changedPackageInfos)
await Promise.all([
// 이번 변경건과 관련없는 모든 .changeset/*.md 파일을 제거한다.
removeChangesetMdFiles({changedFiles}),
// 변경사항외 다른 패키지들의 배포를 막습니다.
protectUnchangedPackages(changedPackageInfos),
])

// 패키지 변경 버전 반영
await exec('node', [resolveFrom(cwd, '@changesets/cli/bin.js'), 'version'], {
Expand Down
60 changes: 47 additions & 13 deletions canary-publish/src/utils/file.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,43 @@ import * as core from '@actions/core'
import fg from 'fast-glob'
import fs from 'fs-extra'

import {getChangedAllFiles} from '$actions/utils'
import {findNearestPackageJson, getChangedAllFiles} from '$actions/utils'

export async function getChangedPackages({pullNumber, packagesDir}: {pullNumber: number; packagesDir: string[]}) {
const changedFiles = await getChangedAllFiles({
pullNumber,
})
export async function getChangedPackages({
changedFiles,
packagesDir,
excludes,
}: {
changedFiles: Awaited<ReturnType<typeof getChangedAllFiles>>
packagesDir: string[]
excludes: string[]
}) {
const isIncludedRoot = packagesDir.includes('.') === true
const targetDirectories = packagesDir.filter((packagename) => packagename !== '.')

const changedPackages = changedFiles.reduce((acc, {filename}) => {
const isTargetDirectories = packagesDir.some((packageDir) => filename.includes(`${packageDir}/`))
const isMarkdownFile = filename.endsWith('.md')
const 패키지대상인가 =
isIncludedRoot || targetDirectories.some((packageDir) => filename.includes(`${packageDir}/`))

const 마크다운파일인가 = filename.endsWith('.md')
const 제외대상인가 = excludes.some((exclude) => {
return filename === exclude || filename.startsWith(`${exclude}`)
})

if (isTargetDirectories && !isMarkdownFile) {
const [packageRoot, packageName] = filename.split('/')
const packageJsonPath = [packageRoot, packageName, 'package.json'].join('/')
if (패키지대상인가 && !마크다운파일인가 && !제외대상인가) {
const packageJsonPath = isIncludedRoot ? 'package.json' : findNearestPackageJson(filename)

acc.push(packageJsonPath)
if (packageJsonPath != null) {
acc.add(packageJsonPath)
}
}

return acc
}, [] as string[])
}, new Set<string>())

console.log('필터링된 packages', Array.from(changedPackages)) // eslint-disable-line

return [...new Set(changedPackages)]
return Array.from(changedPackages)
}

export async function getAllPackageJSON() {
Expand All @@ -48,3 +64,21 @@ export async function protectUnchangedPackages(changedPackages: string[]) {
}
}
}

export async function removeChangesetMdFiles({
changedFiles,
}: {
changedFiles: Awaited<ReturnType<typeof getChangedAllFiles>>
}) {
const markdownPaths = await fg('.changeset/*.md')

return Promise.all(
markdownPaths.map(async (markdownPath) => {
if (changedFiles.find(({filename}) => filename === markdownPath) == null) {
console.log(`PR과 관련없는 ${markdownPath} 제거`) // eslint-disable-line

await fs.remove(markdownPath)
}
}),
)
}
1 change: 1 addition & 0 deletions detect-add/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ jobs:
skip_label: skip_detect_label # 해당 액션을 skip할 label의 이름을 적어주세요. (default: skip-detect-change)
packages_dir: packages # 변경을 탐지할 패키지들의 폴더명을 추가해주세요. (default: packages,share)
formatting_script: pnpm run markdownlint:fix # 생성되는 md 파일의 formatting이 필요하다면 추가해주세요
excludes: ".turbo,.github" # 변경감지를 제외하고싶은 파일 또는 폴더 경로
```

## 실행 결과
Expand Down
4 changes: 4 additions & 0 deletions detect-add/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,7 @@ inputs:
formatting_script:
description: ".changeset/*.md 파일 포매팅이 필요하다면 script 명령어를 추가해주세요"
required: false
excludes:
description: "제외할 경로"
required: false
default: ".github,.changeset"
Loading
Loading