diff --git a/.github/workflows/wiby.yaml b/.github/workflows/wiby.yaml new file mode 100644 index 0000000..c1a4553 --- /dev/null +++ b/.github/workflows/wiby.yaml @@ -0,0 +1,216 @@ +name: wiby + +on: + issue_comment: + types: [ created ] + +env: + WIBY_NODE_VERSION: 14 + +jobs: + + permissions: + + runs-on: ubuntu-latest + + if: ${{ github.event.issue.pull_request && startsWith(github.event.comment.body, 'wiby ') && (github.event.comment.author_association == 'OWNER' || github.event.comment.author_association == 'COLLABORATOR') }} + + steps: + - run: 'echo "Author association: ${{ github.event.comment.author_association }}"' + + test: + + runs-on: ubuntu-latest + + needs: permissions + + if: ${{ startsWith(github.event.comment.body, 'wiby test') }} + + steps: + + - name: Load PR + uses: octokit/request-action@v2.0.0 + with: + route: ${{ github.event.issue.pull_request.url }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + id: load_pr + + - name: Get PR information + run: | + echo "::set-output name=branch::${{ fromJson(steps.load_pr.outputs.data).head.ref }}" + echo "::set-output name=head_sha::${{ fromJson(steps.load_pr.outputs.data).head.sha }}" + echo "::set-output name=repo_name::${{ fromJson(steps.load_pr.outputs.data).base.repo.full_name }}" + echo "::set-output name=repo_url::${{ fromJson(steps.load_pr.outputs.data).base.repo.html_url }}" + id: pr + + - name: Set "queued" status + uses: octokit/request-action@v2.x + with: + route: POST /repos/:repository/check-runs + repository: ${{ steps.pr.outputs.repo_name }} + mediaType: | + previews: + - antiope + name: "wiby" + details_url: "${{ steps.pr.outputs.repo_url }}/actions/runs/${{ github.run_id }}" + head_sha: ${{ steps.pr.outputs.head_sha }} + status: "queued" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Checkout PR Branch + uses: actions/checkout@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + repository: ${{ steps.pr.outputs.repo_name }} + ref: ${{ steps.pr.outputs.branch }} + + - name: Prepare Node.js + uses: actions/setup-node@v1 + with: + node-version: ${{ env.WIBY_NODE_VERSION }} + + - name: wiby test + run: | + if cat package.json | jq -e '.scripts["action-wiby-test"]'; then + # this is primarily so that wiby can test itself using itself + npm run action-wiby-test + else + npm install + npx wiby test + fi + env: + GITHUB_TOKEN: ${{ secrets.WIBY_TOKEN }} + + - name: Handle errors + uses: octokit/request-action@v2.x + if: ${{ failure() }} + with: + route: POST /repos/:repository/check-runs + repository: ${{ steps.pr.outputs.repo_name }} + mediaType: | + previews: + - antiope + name: "wiby" + details_url: "${{ steps.pr.outputs.repo_url }}/actions/runs/${{ github.run_id }}" + head_sha: ${{ steps.pr.outputs.head_sha }} + conclusion: "failure" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Set "in_progress" status + uses: octokit/request-action@v2.x + with: + route: POST /repos/:repository/check-runs + repository: ${{ steps.pr.outputs.repo_name }} + mediaType: | + previews: + - antiope + name: "wiby" + details_url: "${{ steps.pr.outputs.repo_url }}/actions/runs/${{ github.run_id }}" + head_sha: ${{ steps.pr.outputs.head_sha }} + status: "in_progress" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + result: + + runs-on: ubuntu-latest + + needs: permissions + + if: ${{ startsWith(github.event.comment.body, 'wiby result') }} + + steps: + + - name: Load PR + uses: octokit/request-action@v2.0.0 + with: + route: ${{ github.event.issue.pull_request.url }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + id: load_pr + + - name: Get PR information + run: | + echo "::set-output name=branch::${{ fromJson(steps.load_pr.outputs.data).head.ref }}" + echo "::set-output name=head_sha::${{ fromJson(steps.load_pr.outputs.data).head.sha }}" + echo "::set-output name=repo_name::${{ fromJson(steps.load_pr.outputs.data).base.repo.full_name }}" + echo "::set-output name=repo_url::${{ fromJson(steps.load_pr.outputs.data).base.repo.html_url }}" + id: pr + + - name: Checkout PR Branch + uses: actions/checkout@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + repository: ${{ steps.pr.outputs.repo_name }} + ref: ${{ steps.pr.outputs.branch }} + + - name: Prepare Node.js + uses: actions/setup-node@v1 + with: + node-version: ${{ env.WIBY_NODE_VERSION }} + + - name: wiby result + run: | + # execute wiby result and set action result + + handle_result() { + + WIBY_RESULT_CODE=$1 + + if [ ${WIBY_RESULT_CODE} -eq 64 ]; then + echo "`wiby` exited with code 64 - results are still pending" + else + echo "::set-output name=wiby_conclusion::failure" + fi + + } + + if cat package.json | jq -e '.scripts["action-wiby-result"]'; then + # this is primarily so that wiby can test itself using itself + npm run action-wiby-result || handle_result $? + else + npm install + npx wiby result || handle_result $? + fi + + # if we got here - there was no error + echo "::set-output name=wiby_conclusion::success" + + env: + GITHUB_TOKEN: ${{ secrets.WIBY_TOKEN }} + id: wiby_result + + - name: Handle errors + uses: octokit/request-action@v2.x + if: ${{ failure() }} + with: + route: POST /repos/:repository/check-runs + repository: ${{ steps.pr.outputs.repo_name }} + mediaType: | + previews: + - antiope + name: "wiby" + details_url: "${{ steps.pr.outputs.repo_url }}/actions/runs/${{ github.run_id }}" + head_sha: ${{ steps.pr.outputs.head_sha }} + conclusion: "failure" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Set status from result + uses: octokit/request-action@v2.x + if: ${{ steps.wiby_result.outputs.wiby_conclusion != '' }} + with: + route: POST /repos/:repository/check-runs + repository: ${{ steps.pr.outputs.repo_name }} + mediaType: | + previews: + - antiope + name: "wiby" + details_url: "${{ steps.pr.outputs.repo_url }}/actions/runs/${{ github.run_id }}" + head_sha: ${{ steps.pr.outputs.head_sha }} + conclusion: ${{ steps.wiby_result.outputs.wiby_conclusion }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/package.json b/package.json index c24fb02..b4ade0d 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,8 @@ "test": "test" }, "scripts": { + "action-wiby-test": "npm install --production && ./bin/wiby test", + "action-wiby-result": "npm install --production && ./bin/wiby result", "lint": "standard", "pretest": "npm run lint", "test": "npm run tests-only",