浏览代码

chore: github action & template

朱文龙 4 年之前
父节点
当前提交
ec4d7c201f

+ 41 - 0
.github/ISSUE_TEMPLATE/1.bug_report.md

@@ -0,0 +1,41 @@
+---
+name: " 🐛 Bug report"
+about: Report a bug
+title: ''
+labels: 'bug'
+assignees: ''
+
+---
+
+### Which Component 出现bug的组件
+  - Button
+
+### semi-ui version
+  - latest
+    
+### Expected result 期望的结果是什么
+  - 
+
+### Actual result 实际的结果是什么
+  - 
+
+### Steps to reproduce 复现步骤
+  - 1
+
+
+### Reproducible code 复现代码
+```
+class Demo extends React.component {
+
+    render() {
+        return (
+            <Button>bug</Button>
+        )
+    }
+
+}
+
+```
+
+### Additional information 补充说明
+- 遇到这个bug的业务场景、上下文、或者你的需求场景

+ 17 - 0
.github/ISSUE_TEMPLATE/2.feature_request.md

@@ -0,0 +1,17 @@
+---
+name: "🎁 Feature request"
+about: Suggest an idea to make the project better
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+### Which Component Need Enhancement 期望新增功能的组件
+- Button
+
+### What does the proposed API look like 期望支持的API
+
+### Feature Description 功能描述
+
+### Additional information 补充说明

+ 5 - 0
.github/ISSUE_TEMPLATE/config.yml

@@ -0,0 +1,5 @@
+blank_issues_enabled: false
+contact_links:
+  - name: Frequently Asked Questions
+    url: https://semi.design/en-US/start/faq
+    about: Please search questions here.

+ 48 - 0
.github/workflows/publish.yml

@@ -0,0 +1,48 @@
+name: "publish"
+
+on:
+  workflow_dispatch:
+    inputs:
+      release_type:
+        description: 'release type: minor | patch | beta'
+        required: true
+
+jobs:
+  publish-new-version:
+    name: "publish a new version"
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+        with:
+          token: ${{ secrets.PAT }}
+
+      - name: npm install
+        run: npm i -g lerna && npm run bootstrap
+
+      - name: get version list
+        run: |
+          PKG_NAME=@douyinfe/semi-ui
+          echo "VERSION_LIST="$(npm view $PKG_NAME versions --json)"" >> $GITHUB_ENV
+        
+
+      - name: get version
+        run: echo "RELEASE_VERSION="$(node script/version.js)"" >> $GITHUB_ENV
+        env:
+            RELEASE_TYPE: ${{ github.event.inputs.release_type }}
+
+      - name: publish
+        run: |
+          git config --global user.name 'semi-bot'
+          git config --global user.email '[email protected]'
+          npm config set registry=https://registry.npmjs.org/
+          npm config set //registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}
+          npm whoami
+          DIST_TAG=latest
+          if [ $RELEASE_TYPE == 'beta' ]; then
+            DIST_TAG=beta
+          fi
+          echo "$RELEASE_VERSION"
+          echo "$DIST_TAG"
+          lerna version $RELEASE_VERSION --exact --force-publish --yes --no-push
+          lerna publish from-package --dist-tag $DIST_TAG --yes
+          git push -o ci.skip --follow-tags --no-verify --atomic

+ 21 - 0
.github/workflows/release.yml

@@ -0,0 +1,21 @@
+name: release
+
+on:
+  create
+
+jobs:
+  release:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+      - name: release
+        if: github.event.ref_type == 'tag'
+        uses: actions/setup-node@v2
+        with:
+          node-version: 14
+      - run: |
+            npm i -g lerna && npm run bootstrap
+            node script/release.js
+        env:
+            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+            CHANGELOG_PATH: content/start/changelog/index.md, content/start/changelog/index-en-US.md

+ 23 - 0
.github/workflows/test.yml

@@ -0,0 +1,23 @@
+# This is a basic workflow to help you get started with Actions
+
+name: test
+
+on:
+  push:
+    branches: [ main, release-beta ]
+  pull_request:
+    branches: [ main, release-beta ]
+
+  workflow_dispatch:
+
+jobs:
+  test:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+
+      - name: Run install
+        run: npm i -g lerna && npm run bootstrap
+
+      - name: Run test
+        run: npm run test:unit

+ 62 - 0
scripts/release.js

@@ -0,0 +1,62 @@
+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()

+ 79 - 0
scripts/version.js

@@ -0,0 +1,79 @@
+const semver = require('semver');
+
+
+const findLatestVersion = (versionSet) => {
+    return [...versionSet].find(v => v === semver.coerce(v).raw);
+}
+
+const getAlphaVersion = (versionSet) => {
+    let latestVersion = findLatestVersion(versionSet);
+    const nextBetaVersion = semver.inc(latestVersion, 'preminor', 'beta');
+    // 如果已经有beta版本了,那么就得发下个版本的alplh版
+    if (versionSet.has(nextBetaVersion)) {
+        latestVersion = semver.inc(latestVersion, 'minor');
+    }
+    let nextVersion = semver.inc(latestVersion, 'preminor', 'alpha');
+    while (versionSet.has(nextVersion)) {
+        nextVersion = semver.inc(nextVersion, 'prerelease', 'alpha')
+    }
+    return nextVersion;
+}
+
+const getBetaVersion = (versionSet) => {
+    const latestVersion = findLatestVersion(versionSet);
+    let nextVersion = semver.inc(latestVersion, 'preminor', 'beta');
+    while (versionSet.has(nextVersion)) {
+        nextVersion = semver.inc(nextVersion, 'prerelease', 'beta')
+    }
+    return nextVersion;
+}
+
+const getHotfixVersion = (versionSet) => {
+    const latestVersion = findLatestVersion(versionSet);
+    let nextVersion = semver.inc(latestVersion, 'prepatch', 'beta');
+    while (versionSet.has(nextVersion)) {
+        nextVersion = semver.inc(nextVersion, 'prerelease', 'beta');
+    }
+    return nextVersion
+}
+
+const getMinorVersion = (versionSet) => {
+    const latestVersion = findLatestVersion(versionSet);
+    const nextVersion = semver.inc(latestVersion, 'minor');
+    return nextVersion
+}
+
+const getPatchVersion = (versionSet) => {
+    const latestVersion = findLatestVersion(versionSet);
+    const nextVersion = semver.inc(latestVersion, 'patch');
+    return nextVersion
+}
+
+
+const generateVersions = (versionSet, releaseType) => {
+    switch (releaseType) {
+        case "minor":
+            return getMinorVersion(versionSet);
+        case "patch":
+            return getPatchVersion(versionSet);
+        case "alpha":
+            return getAlphaVersion(versionSet);
+        case "beta":
+            return getBetaVersion(versionSet);
+        case "hotfix":
+            return getHotfixVersion(versionSet);
+        default:
+            return '';
+    }
+};
+
+
+function main() {
+    const versionList = JSON.parse(process.env.VERSION_LIST)
+    const releaseType = process.env.RELEASE_TYPE
+    const sortedVersionList = versionList.sort(semver.rcompare);
+    const sortedVersionSet = new Set(sortedVersionList);
+    return generateVersions(sortedVersionSet, releaseType);
+}
+
+console.log(main())