name: PR_COMMENT_CI on: issue_comment: types: [created] env: HUSKY: '0' jobs: check: runs-on: ubuntu-latest outputs: next_action: ${{ steps.get-action.outputs.next_action }} if: ${{ github.event.issue.pull_request }} steps: - uses: actions/checkout@v4 with: repository: Tencent/tdesign sparse-checkout: | .github/.pr-comment-ci-whitelist sparse-checkout-cone-mode: false - uses: actions/github-script@v7 id: get-action with: script: | const user = context.payload.comment.user.login core.info(`user: ${user}`) const fs = require('fs'); const whitelist = fs.readFileSync('.github/.pr-comment-ci-whitelist', 'utf8'); let isWhitelist = false; whitelist.split('\n').forEach((owner) => { if (owner === user) { isWhitelist = true; } }); let next_action = '' if (isWhitelist) { const body = context.payload.comment.body core.info(`body: ${body}`) if (body.startsWith('/update-common')) { next_action='update-common' } if (body.startsWith('/update-snapshot')) { next_action='update-snapshot' } if (body.startsWith('/update-coverage')) { next_action='update-coverage' } if(next_action){ await github.rest.reactions.createForIssueComment({ owner: context.repo.owner, repo: context.repo.repo, comment_id: context.payload.comment.id, content: 'rocket', }) } } else { core.warning('You are not collaborator'); } core.info(`next_action: ${next_action}`) core.setOutput('next_action', next_action) update-common: needs: check runs-on: ubuntu-latest if: ${{ needs.check.outputs.next_action == 'update-common' }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.PERSONAL_TOKEN }} - name: gh checkout pr env: GH_TOKEN: ${{ secrets.PERSONAL_TOKEN }} run: gh pr checkout ${{ github.event.issue.number }} - name: git config run: | git config --local user.email "github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" - name: submodule init and sync remote run: | git submodule update --init --remote - name: Commit common run: | git status working_tree_clean=$(git status | grep -c 'nothing to commit, working tree clean') || true if [ "$working_tree_clean" -eq "0" ]; then git add . git commit -m "chore: update common" fi git status - name: merge develop run: | git merge develop --no-commit || true - name: check conflicts run: | git status conflict_count=$(git status | grep -c 'both modified:') || true working_tree_clean=$(git status | grep -c 'nothing to commit, working tree clean') || true common_conflict=$(git status | grep 'both modified:' | grep -c '_common') || true conflicts_sum=$((common_conflict)) echo "conflict_count: $conflict_count" echo "working_tree_clean: $working_tree_clean" echo "common_conflict: $common_conflict" echo "conflicts_sum: $conflicts_sum" if [ "$working_tree_clean" -eq "1" ]; then echo "nothing to commit, working tree clean" exit 0 fi if [ "$conflict_count" -gt "0" ]&&[ "$conflicts_sum" -eq "0" ]; then echo "Unknown conflict " git status exit 1 fi if [ "$common_conflict" -eq "1" ];then git checkout --ours src/_common git add src/_common echo "resolve conflict _common" fi git status git commit -am "chore: merge develop" - name: git push run: | git status git push || true update-snapshot: needs: check runs-on: ubuntu-latest if: ${{ needs.check.outputs.next_action == 'update-snapshot' }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.PERSONAL_TOKEN }} - name: gh checkout pr env: GH_TOKEN: ${{ secrets.PERSONAL_TOKEN }} run: gh pr checkout ${{ github.event.issue.number }} --recurse-submodules - name: bot commtent id: bot-comment uses: actions/github-script@v7 with: script: | const url = `${context.serverUrl}//${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}` const urlLink = `[Open](${url})` const { data: comment } = await github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: `⏳ 正在运行快照更新。。。 CI: ${urlLink}` }) return comment.id - name: git config run: | git config --local user.email "github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" - name: merge develop run: | git merge develop --no-commit || true - name: check conflicts run: | git status conflict_count=$(git status | grep -c 'both modified:') || true working_tree_clean=$(git status | grep -c 'nothing to commit, working tree clean') || true csr_snap_conflict=$(git status | grep 'both modified:' | grep -c 'csr.test.js.snap') || true ssr_snap_conflict=$(git status | grep 'both modified:' | grep -c 'ssr.test.js.snap') || true common_conflict=$(git status | grep 'both modified:' | grep -c '_common') || true conflicts_sum=$((csr_snap_conflict + ssr_snap_conflict + common_conflict)) echo "conflict_count: $conflict_count" echo "working_tree_clean: $working_tree_clean" echo "csr_snap_conflict: $csr_snap_conflict" echo "ssr_snap_conflict: $ssr_snap_conflict" echo "common_conflict: $common_conflict" echo "conflicts_sum: $conflicts_sum" if [ "$working_tree_clean" -eq "1" ]; then echo "nothing to commit, working tree clean" exit 0 fi if [ "$conflict_count" -gt "0" ]&&[ "$conflicts_sum" -eq "0" ]; then echo "Unknown conflict " git status exit 1 fi if [ "$csr_snap_conflict" -eq "1" ];then git checkout --theirs test/snap/__snapshots__/csr.test.js.snap git add test/snap/__snapshots__/csr.test.js.snap echo "resolve conflict csr.test.js.snap" fi if [ "$ssr_snap_conflict" -eq "1" ];then git checkout --theirs test/snap/__snapshots__/ssr.test.js.snap git add test/snap/__snapshots__/ssr.test.js.snap echo "resolve conflict ssr.test.js.snap" fi if [ "$common_conflict" -eq "1" ];then git checkout --theirs src/_common git add src/_common echo "resolve conflict _common" fi git status git commit -am "chore: merge develop" - uses: actions/setup-node@v4 with: node-version: 18 - run: npm install - run: npm run test:update - name: Commit Snapshot run: | git status working_tree_clean=$(git status | grep -c 'nothing to commit, working tree clean') || true if [ "$working_tree_clean" -eq "0" ]; then git add . git commit -m "chore: update snapshot" fi git status - name: git push run: | git status git push || true update-coverage: needs: check runs-on: ubuntu-latest if: ${{ needs.check.outputs.next_action == 'update-coverage' }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.PERSONAL_TOKEN }} - name: gh checkout pr env: GH_TOKEN: ${{ secrets.PERSONAL_TOKEN }} run: gh pr checkout ${{ github.event.issue.number }} --recurse-submodules - name: git config run: | git config --local user.email "github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" - name: bot commtent id: bot-comment uses: actions/github-script@v7 with: script: | const url = `${context.serverUrl}//${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}` const urlLink = `[Open](${url})` const { data: comment } = await github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: `⏳ 正在运行 coverage badge 更新。。。 CI: ${urlLink}` }) return comment.id - uses: actions/setup-node@v4 with: node-version: 18 - run: npm install - run: npm run generate:coverage-badge - name: commit coverage badge run: | git status working_tree_clean=$(git status | grep -c 'nothing to commit, working tree clean') || true if [ "$working_tree_clean" -eq "0" ]; then git add . git commit -m "chore: update coverage badge" fi git status - name: git push run: | git status git push || true