ci(check-urls): fix push crash on new branch creation + render awesome_bot report (#7046)

* format: expand events

* format: add blank lines between steps of check job

* format: to run steps using multiline format

* feat: group for each output

* fix: solve crash on first push (trilom 2 tj action)

* chore: upload ab-results as `awesomebot-results.zip` artifact

* feat: changed files as workflow output

* feat: Generate GitHub Summary using `ab-results-*.json`s

* security: limit access rights with `contents: read`

Seen at PR #7043
Cherry picked from 50300ca119

Co-authored-by: Alex <93376818+sashashura@users.noreply.github.com>

* chore: setup concurrency policy

* chore: modularize using composite actions

Co-authored-by: Alex <93376818+sashashura@users.noreply.github.com>
This commit is contained in:
David Ordás 2022-08-31 17:53:22 +02:00 committed by GitHub
parent a5c106c812
commit 57cc3173da
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 162 additions and 11 deletions

View File

@ -0,0 +1,94 @@
name: 'AwesomeBot Markdown Summary Report'
description: 'Composes the summary report using JSON results of any AwesomeBot execution'
inputs:
ab-root:
description: 'Path where AwesomeBot result files are written.'
required: true
files:
description: 'A delimited string containing the filenames to process.'
required: true
separator:
description: 'Token used to delimit each filename. Default: " ".'
required: false
default: ' '
append-heading:
description: 'When should append report heading.'
required: false
default: "false"
write:
description: 'When should append the report to GITHUB_STEP_SUMMARY file descriptor.'
required: false
default: "true"
outputs:
text:
description: Generated Markdown text.
value: ${{ steps.generate.outputs.text }}
runs:
using: "composite"
steps:
- name: Generate markdown
id: generate
# Using PowerShell
shell: pwsh
# sec: sanatize inputs using environment variables
env:
GITHUB_ACTION_PATH: ${{ github.action_path }}
GITHUB_WORKSPACE: ${{ github.workspace }}
# INPUT_<VARIABLE_NAME> is not available in Composite run steps
# https://github.community/t/input-variable-name-is-not-available-in-composite-run-steps/127611
INPUT_AB_ROOT: ${{ inputs.ab-root }}
INPUT_FILES: ${{ inputs.files }}
INPUT_SEPARATOR: ${{ inputs.separator }}
INPUT_APPEND_HEADING: ${{ inputs.append-heading }}
run: |
$text = ""
# Handle optional heading
if ("true" -eq $env:INPUT_APPEND_HEADING) {
$text += "### Report of Checked URLs!"
$text += "`n`n"
$text += "<div align=`"right`" markdown=`"1`">`n`n"
$text += "_Link issues :rocket: powered by [``awesome_bot``](https://github.com/dkhamsing/awesome_bot)_."
$text += "`n`n</div>"
}
# Loop ForEach files
$env:INPUT_FILES -split $env:INPUT_SEPARATOR | ForEach {
$file = $_
$abr_file = $env:INPUT_AB_ROOT + "/ab-results-" + ($file -replace "[/\\]","-") + "-markdown-table.json"
$json = Get-Content $abr_file | ConvertFrom-Json
$text += "`n`n"
if ("true" -eq $json.error) {
# Highlighting issues counter
$SearchExp = '(?<Num>\d+)'
$ReplaceExp = '**${Num}**'
$text += "`:page_facing_up: File: ``" + $file + "`` (:warning: " + ($json.title -replace $SearchExp,$ReplaceExp) + ")"
# removing where ab attribution lives (moved to report heading)
$text += $json.message -replace "####.*?\n","`n"
} else {
$text += ":page_facing_up: File: ``" + $file + "`` (:ok: **No issues**)"
}
}
# HACK to single line strings (https://trstringer.com/github-actions-multiline-strings/)
$text = $text -replace "`%","%25"
$text = $text -replace "`n","%0A"
$text = $text -replace "`r","%25"
# set output
echo "::set-output name=text::$text"
- name: Write output
if: ${{ fromJson(inputs.write) }}
shell: bash
env:
INPUT_TEXT: ${{ steps.generate.outputs.text }}
INPUT_WRITE: ${{ inputs.write }}
run: |
echo "$INPUT_TEXT" >> $GITHUB_STEP_SUMMARY

View File

@ -1,24 +1,81 @@
name: Check URLs from changed files
on: [push, pull_request]
on:
push:
pull_request:
permissions:
contents: read
# This allows a subsequently queued workflow run to interrupt previous runs
concurrency:
group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref || github.run_id }}'
cancel-in-progress: true
jobs:
job:
permissions:
# Needed for the 'trilom/file-changes-action' action
pull-requests: read
check-urls:
runs-on: ubuntu-latest
outputs:
changed-files: ${{ steps.changed-files.outputs.all_changed_files }}
steps:
# NOTE: tj-actions/changed-files.
# For push events you need to include fetch-depth: 0 | 2 depending on your use case.
# 0: retrieve all history for all branches and tags
# 1: retrieve current commit (by default)
# 2: retrieve the preceding commit
- name: Determine workflow parameters
id: init-params
run: |
echo "::set-output name=fetch_depth::0";
if [ "${{ github.event_name }}" == "pull_request" ]; then
echo "::set-output name=fetch_depth::1";
fi
- uses: actions/checkout@v3
- uses: trilom/file-changes-action@v1.2.4
id: file_changes
with:
output: ''
fetch-depth: ${{ steps.init-params.outputs.fetch_depth }}
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v29.0.1
with:
separator: " "
- uses: ruby/setup-ruby@v1
with:
ruby-version: 2.6
- run: gem install awesome_bot
- run: for i in ${{ steps.file_changes.outputs.files_modified }}; do echo; echo "processing $i"; awesome_bot $i --allow-redirect --allow-dupe --allow-ssl || true; done
- run: |
gem install awesome_bot
- name: Check each changed file
run: |
# Set field separator
IFS=$' ';
# Processing loop
for file in ${{ steps.changed-files.outputs.all_changed_files }}; do
echo;
echo "::group::Processing file... $file";
awesome_bot "$file" --allow-redirect --allow-dupe --allow-ssl || true;
echo "::endgroup::";
done
# Unset field separator
unset IFS;
- uses: actions/upload-artifact@v3
with:
path: ${{ github.workspace }}/*.json
name: awesomebot-results
path: ${{ github.workspace }}/ab-results-*.json
- name: Generate Summary Report using AwesomeBot results
uses: ./.github/actions/awesomebot-gh-summary-action
with:
ab-root: ${{ github.workspace }}
files: ${{ steps.changed-files.outputs.all_changed_files }}
separator: " "
append-heading: ${{ true }}