const fs = require('fs'); const _ = require('lodash'); const github = require('@actions/github'); const { Octokit } = require('@octokit/rest'); const core = require('@actions/core'); const { info, error } = core; const pathArr = process.env.CHANGELOG_PATH.replace(/ /g, '').split(','); const { owner, repo } = github.context.repo; const { ref: version } = github.context.payload; const versionNo = version.substr(1); // 'v1.0.0' -> '1.0.0' const genVersionChangeLog = (path, targetVersion) => { const changelogRaw = fs.readFileSync(path, 'utf-8'); const lines = changelogRaw.split('\n'); let changeLogLines = []; const stopPattern = /^#### /; // 前一个版本 let begin = false; for (let i = 0; i < lines.length; i += 1) { const line = lines[i]; if (begin && stopPattern.test(line)) { break; } if (begin) { changeLogLines.push(line); } if (!begin) { if (line.startsWith('####')) { const versionReg = /.*((\d{1,2}\.){2}\d{1,2}(-\w+\.\d+)?)/; let result = versionReg.exec(line); begin = _.get(result, '1', '').trim().toLowerCase() === targetVersion; } } } return changeLogLines.join('\n'); }; async function main() { try { const versionChangelog = pathArr.map((path) => { let changelog = genVersionChangeLog(path, versionNo); return changelog; }).join('\n---\n'); const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN }); await octokit.repos.createRelease({ owner, repo, tag_name: version, name: version, body: versionChangelog, prerelease: version.includes('beta'), }); info(`${version} released`); } catch (err) { error(err); } } main();