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>
pull/7051/head
parent
a5c106c812
commit
57cc3173da
2 changed files with 162 additions and 11 deletions
@ -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 |
@ -1,24 +1,81 @@ |
|||||||
name: Check URLs from changed files |
name: Check URLs from changed files |
||||||
on: [push, pull_request] |
|
||||||
|
on: |
||||||
|
push: |
||||||
|
pull_request: |
||||||
|
|
||||||
permissions: |
permissions: |
||||||
contents: read |
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: |
jobs: |
||||||
job: |
check-urls: |
||||||
permissions: |
|
||||||
# Needed for the 'trilom/file-changes-action' action |
|
||||||
pull-requests: read |
|
||||||
runs-on: ubuntu-latest |
runs-on: ubuntu-latest |
||||||
|
|
||||||
|
outputs: |
||||||
|
changed-files: ${{ steps.changed-files.outputs.all_changed_files }} |
||||||
|
|
||||||
steps: |
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: actions/checkout@v3 |
||||||
- uses: trilom/file-changes-action@v1.2.4 |
|
||||||
id: file_changes |
|
||||||
with: |
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 |
- uses: ruby/setup-ruby@v1 |
||||||
with: |
with: |
||||||
ruby-version: 2.6 |
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 |
- uses: actions/upload-artifact@v3 |
||||||
with: |
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 }} |
||||||
|
Loading…
Reference in new issue