diff --git a/.github/actions/fetch-codeql/action.yml b/.github/actions/fetch-codeql/action.yml index de6d50dc12fe..41ffeea81fde 100644 --- a/.github/actions/fetch-codeql/action.yml +++ b/.github/actions/fetch-codeql/action.yml @@ -8,7 +8,7 @@ runs: run: | LATEST=$(gh release list --repo https://github.com/github/codeql-cli-binaries | cut -f 1 | grep -v beta | sort --version-sort | tail -1) gh release download --repo https://github.com/github/codeql-cli-binaries --pattern codeql-linux64.zip "$LATEST" - unzip -q codeql-linux64.zip - echo "${{ github.workspace }}/codeql" >> $GITHUB_PATH + unzip -q -d "${RUNNER_TEMP}" codeql-linux64.zip + echo "${RUNNER_TEMP}/codeql" >> "${GITHUB_PATH}" env: GITHUB_TOKEN: ${{ github.token }} diff --git a/.github/workflows/post-pr-comment.yml b/.github/workflows/post-pr-comment.yml new file mode 100644 index 000000000000..0d92b0af7ebf --- /dev/null +++ b/.github/workflows/post-pr-comment.yml @@ -0,0 +1,31 @@ +name: Post pull-request comment +on: + workflow_run: + workflows: ["Query help preview"] + types: + - completed + +permissions: + pull-requests: write + +jobs: + post_comment: + runs-on: ubuntu-latest + steps: + - name: Download artifact + run: gh run download "${WORKFLOW_RUN_ID}" --repo "${GITHUB_REPOSITORY}" --name "comment" + env: + GITHUB_TOKEN: ${{ github.token }} + WORKFLOW_RUN_ID: ${{ github.event.workflow_run.id }} + - run: | + PR="$(grep -o '^[0-9]\+$' pr.txt)" + PR_HEAD_SHA="$(gh api "/repos/${GITHUB_REPOSITORY}/pulls/${PR}" --jq .head.sha)" + # Check that the pull-request head SHA matches the head SHA of the workflow run + if [ "${WORKFLOW_RUN_HEAD_SHA}" != "${PR_HEAD_SHA}" ]; then + echo "PR head SHA ${PR_HEAD_SHA} does not match workflow_run event SHA ${WORKFLOW_RUN_HEAD_SHA}. Stopping." 1>&2 + exit 1 + fi + gh pr comment "${PR}" --repo "${GITHUB_REPOSITORY}" -F comment.txt + env: + GITHUB_TOKEN: ${{ github.token }} + WORKFLOW_RUN_HEAD_SHA: ${{ github.event.workflow_run.head_commit.id }} diff --git a/.github/workflows/qhelp-pr-preview.yml b/.github/workflows/qhelp-pr-preview.yml index 7e2ea6a10f8f..ade85a730e13 100644 --- a/.github/workflows/qhelp-pr-preview.yml +++ b/.github/workflows/qhelp-pr-preview.yml @@ -1,10 +1,13 @@ name: Query help preview +permissions: + contents: read + on: pull_request: branches: - main - - 'rc/*' + - "rc/*" paths: - "ruby/**/*.qhelp" @@ -12,28 +15,49 @@ jobs: qhelp: runs-on: ubuntu-latest steps: + - run: echo "${{ github.event.number }}" > pr.txt + - uses: actions/upload-artifact@v2 + with: + name: comment + path: pr.txt + retention-days: 1 - uses: actions/checkout@v2 with: fetch-depth: 2 + persist-credentials: false + - uses: ./.github/actions/fetch-codeql - name: Determine changed files id: changes run: | - echo -n "::set-output name=qhelp_files::" - (git diff --name-only --diff-filter=ACMRT HEAD~1 HEAD | grep .qhelp$ | grep -v .inc.qhelp; - git diff --name-only --diff-filter=ACMRT HEAD~1 HEAD | grep .inc.qhelp$ | xargs -d '\n' -rn1 basename | xargs -d '\n' -rn1 git grep -l) | - sort -u | xargs -d '\n' -n1 printf "'%s' " - - - uses: ./.github/actions/fetch-codeql + (git diff -z --name-only --diff-filter=ACMRT HEAD~1 HEAD | grep -z '.qhelp$' | grep -z -v '.inc.qhelp'; + git diff -z --name-only --diff-filter=ACMRT HEAD~1 HEAD | grep -z '.inc.qhelp$' | xargs --null -rn1 basename | xargs --null -rn1 git grep -z -l) | + grep -z '.qhelp$' | grep -z -v '^-' | sort -z -u > "${RUNNER_TEMP}/paths.txt" - name: QHelp preview - if: ${{ steps.changes.outputs.qhelp_files }} run: | - ( echo "QHelp previews:"; - for path in ${{ steps.changes.outputs.qhelp_files }} ; do + EXIT_CODE=0 + echo "QHelp previews:" > comment.txt + while read -r -d $'\0' path; do + if [ ! -f "${path}" ]; then + exit 1 + fi echo "
${path}" echo - codeql generate query-help --format=markdown ${path} + codeql generate query-help --format=markdown -- "./${path}" 2> errors.txt || EXIT_CODE="$?" + if [ -s errors.txt ]; then + echo "# errors/warnings:" + echo '```' + cat errors.txt + cat errors.txt 1>&2 + echo '```' + fi echo "
" - done) | gh pr comment "${{ github.event.pull_request.number }}" -F - - env: - GITHUB_TOKEN: ${{ github.token }} + done < "${RUNNER_TEMP}/paths.txt" >> comment.txt + exit "${EXIT_CODE}" + + - if: always() + uses: actions/upload-artifact@v2 + with: + name: comment + path: comment.txt + retention-days: 1