|
1 | | -name: Push summary + send to plumber |
| 1 | + |
| 2 | +name: Push summary (Job Summary only) |
2 | 3 |
|
3 | 4 | on: |
4 | 5 | push: |
5 | 6 | branches: |
6 | 7 | - main |
7 | 8 |
|
8 | 9 | jobs: |
9 | | - summarize-and-send: |
| 10 | + summarize: |
10 | 11 | runs-on: ubuntu-latest |
11 | 12 |
|
12 | 13 | steps: |
13 | | - - name: Résumé du push (tous les commits) |
| 14 | + # Checkout avec historique, indispensable pour diff BEFORE..AFTER. |
| 15 | + # Par défaut, actions/checkout ne fetch qu'un commit ; fetch-depth: 0 fetch tout l'historique. [5](https://www.w3tutorials.net/blog/how-to-avoid-having-to-do-git-branch-set-upstream-and-instead-default-to-automatically-setup-remote-tracking/)[4](https://cran.r-project.org/web/packages/rstudioapi/vignettes/introduction.html) |
| 16 | + - name: Checkout repository |
| 17 | + uses: actions/checkout@v4 |
| 18 | + with: |
| 19 | + fetch-depth: 0 |
| 20 | + |
| 21 | + # Génère le résumé complet dans le Job Summary via GITHUB_STEP_SUMMARY. [1](https://nhsdigital.github.io/rap-community-of-practice/training_resources/R/git_with_RStudio/)[2](https://github.com/rstudio/rstudioapi/issues/14) |
| 22 | + - name: Résumé du push (commits + dates + stats) |
14 | 23 | shell: bash |
15 | 24 | run: | |
16 | | - echo "## Résumé du push" >> "$GITHUB_STEP_SUMMARY" |
17 | | - echo "" >> "$GITHUB_STEP_SUMMARY" |
| 25 | + set -euo pipefail |
18 | 26 |
|
19 | | - # Infos globales (repo, branche, etc.) via le contexte GitHub Actions |
20 | | - echo "**Repo :** \`${{ github.repository }}\`" >> "$GITHUB_STEP_SUMMARY" |
21 | | - echo "**Branche :** \`${{ github.ref }}\`" >> "$GITHUB_STEP_SUMMARY" |
22 | | - echo "**Actor :** \`${{ github.actor }}\`" >> "$GITHUB_STEP_SUMMARY" |
23 | | - echo "**After (SHA) :** \`${{ github.sha }}\`" >> "$GITHUB_STEP_SUMMARY" |
24 | | - echo "" >> "$GITHUB_STEP_SUMMARY" |
| 27 | + REPO="${{ github.repository }}" |
| 28 | + REF="${{ github.ref }}" |
| 29 | + ACTOR="${{ github.actor }}" |
| 30 | + BEFORE="${{ github.event.before }}" |
| 31 | + AFTER="${{ github.sha }}" |
| 32 | + RUN_TS_UTC="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" |
| 33 | +
|
| 34 | + # Pusher depuis le payload (souvent dispo), sinon fallback sur actor. [8](https://rdrr.io/cran/rstudioapi/src/R/commands.R)[7](https://docs.posit.co/ide/server-pro/admin/reference/rstudio_ide_commands.html) |
| 35 | + PUSHER_NAME="$(jq -r '.pusher.name // .sender.login // empty' "$GITHUB_EVENT_PATH")" |
| 36 | + [ -z "${PUSHER_NAME:-}" ] && PUSHER_NAME="$ACTOR" |
25 | 37 |
|
26 | | - # Compter le nombre de commits présents dans l'événement |
27 | | - COUNT=$(jq '.commits | length' "$GITHUB_EVENT_PATH") |
28 | | - echo "**Nombre de commits dans ce push :** $COUNT" >> "$GITHUB_STEP_SUMMARY" |
| 38 | + # ------------------------------------------------------------ |
| 39 | + # 1) En-tête |
| 40 | + # ------------------------------------------------------------ |
| 41 | + { |
| 42 | + echo "## Résumé du push" |
| 43 | + echo "" |
| 44 | + echo "**Repo :** \`${REPO}\`" |
| 45 | + echo "" |
| 46 | + echo "**Branche :** \`${REF}\`" |
| 47 | + echo "" |
| 48 | + echo "**Actor (déclencheur) :** \`${ACTOR}\`" |
| 49 | + echo "" |
| 50 | + echo "**Pusher (payload) :** \`${PUSHER_NAME}\`" |
| 51 | + echo "" |
| 52 | + echo "**Date d'exécution (UTC) :** \`${RUN_TS_UTC}\`" |
| 53 | + echo "" |
| 54 | + echo "**Range :** \`${BEFORE} .. ${AFTER}\`" |
| 55 | + echo "" |
| 56 | + } >> "$GITHUB_STEP_SUMMARY" |
| 57 | +
|
| 58 | + # ------------------------------------------------------------ |
| 59 | + # 2) Table de tous les commits du push (SHA / auteur / date / message) |
| 60 | + # Le payload push est lisible via $GITHUB_EVENT_PATH ; utile pour commits[]. [8](https://rdrr.io/cran/rstudioapi/src/R/commands.R)[6](https://rdrr.io/cran/rstudioapi/src/R/document-api.R) |
| 61 | + # ------------------------------------------------------------ |
| 62 | + COUNT="$(jq '.commits | length' "$GITHUB_EVENT_PATH")" |
| 63 | + echo "### Commits inclus dans ce push (${COUNT})" >> "$GITHUB_STEP_SUMMARY" |
29 | 64 | echo "" >> "$GITHUB_STEP_SUMMARY" |
30 | 65 |
|
31 | | - # Tableau Markdown |
32 | | - echo "| SHA | Auteur | Message |" >> "$GITHUB_STEP_SUMMARY" |
33 | | - echo "|---|---|---|" >> "$GITHUB_STEP_SUMMARY" |
| 66 | + { |
| 67 | + echo "| Commit | Contributeur (auteur) | Date du commit | Message |" |
| 68 | + echo "|---|---|---|---|" |
| 69 | + } >> "$GITHUB_STEP_SUMMARY" |
34 | 70 |
|
35 | | - # Génère une ligne par commit |
36 | | - # - tronque le SHA |
37 | | - # - remplace retours à la ligne dans le message |
38 | | - # - échappe le caractère '|' qui casse les tableaux Markdown |
39 | 71 | jq -r ' |
40 | 72 | .commits[] |
41 | | - | .message |= gsub("\r\n|\n|\r"; " ") |
42 | | - | .message |= gsub("\\|"; "\\\\|") |
43 | | - | "| [`\(.id[0:7])`](\(.url)) | \(.author.name) | \(.message) |" |
| 73 | + | .short = (.id[0:7]) |
| 74 | + | .msg = (.message | gsub("\r\n|\n|\r"; " ") | gsub("\\|"; "\\\\|")) |
| 75 | + | "| " + .short + " | " + (.author.name // "unknown") + " | " + (.timestamp // "unknown") + " | " + .msg + " |" |
44 | 76 | ' "$GITHUB_EVENT_PATH" >> "$GITHUB_STEP_SUMMARY" |
| 77 | +
|
| 78 | + echo "" >> "$GITHUB_STEP_SUMMARY" |
| 79 | +
|
| 80 | + # ------------------------------------------------------------ |
| 81 | + # 3) Stats globales ajoutées/supprimées (diff BEFORE -> AFTER) |
| 82 | + # IMPORTANT: les champs added/removed/modified ont été retirés du payload push pour Actions, |
| 83 | + # donc on calcule via git diff --numstat. [3](https://docs.posit.co/ide/user/ide/guide/productivity/add-ins.html)[4](https://cran.r-project.org/web/packages/rstudioapi/vignettes/introduction.html) |
| 84 | + # BEFORE est dispo dans l'event push via github.event.before. [6](https://rdrr.io/cran/rstudioapi/src/R/document-api.R)[7](https://docs.posit.co/ide/server-pro/admin/reference/rstudio_ide_commands.html) |
| 85 | + # ------------------------------------------------------------ |
| 86 | + echo "### Statistiques globales (diff BEFORE → AFTER)" >> "$GITHUB_STEP_SUMMARY" |
| 87 | + echo "" >> "$GITHUB_STEP_SUMMARY" |
| 88 | +
|
| 89 | + if [[ "$BEFORE" =~ ^0+$ ]]; then |
| 90 | + echo "> ⚠️ Premier push sur une nouvelle branche : BEFORE=000… (diff global non calculable)." >> "$GITHUB_STEP_SUMMARY" |
| 91 | + echo "" >> "$GITHUB_STEP_SUMMARY" |
| 92 | + else |
| 93 | + NUMSTAT="$(git diff --numstat "$BEFORE" "$AFTER")" |
| 94 | +
|
| 95 | + FILES_CHANGED="$(echo "$NUMSTAT" | wc -l | tr -d ' ')" |
| 96 | + ADDED="$(echo "$NUMSTAT" | awk '{a+=$1} END {print a+0}')" |
| 97 | + REMOVED="$(echo "$NUMSTAT" | awk '{d+=$2} END {print d+0}')" |
| 98 | +
|
| 99 | + # Estimation "modifiées" : Git ne donne pas un compteur natif "modified". |
| 100 | + # Une modif est souvent 1 suppression + 1 ajout => min(added, removed). [4](https://cran.r-project.org/web/packages/rstudioapi/vignettes/introduction.html) |
| 101 | + MODIFIED_EST=$(( ADDED < REMOVED ? ADDED : REMOVED )) |
| 102 | +
|
| 103 | + { |
| 104 | + echo "| Indicateur | Valeur |" |
| 105 | + echo "|---|---:|" |
| 106 | + echo "| Fichiers changés | ${FILES_CHANGED} |" |
| 107 | + echo "| Lignes ajoutées (+) | ${ADDED} |" |
| 108 | + echo "| Lignes supprimées (-) | ${REMOVED} |" |
| 109 | + echo "| Estimation lignes modifiées (~) | ${MODIFIED_EST} |" |
| 110 | + } >> "$GITHUB_STEP_SUMMARY" |
| 111 | +
|
| 112 | + echo "" >> "$GITHUB_STEP_SUMMARY" |
| 113 | +
|
| 114 | + # Détail par fichier en section repliable (pour éviter de surcharger). |
| 115 | + echo "<details><summary>Détail par fichier (+/-)</summary>" >> "$GITHUB_STEP_SUMMARY" |
| 116 | + echo "" >> "$GITHUB_STEP_SUMMARY" |
| 117 | + echo "" >> "$GITHUB_STEP_SUMMARY" |
| 118 | + echo "| Fichier | + | - |" >> "$GITHUB_STEP_SUMMARY" |
| 119 | + echo "|---|---:|---:|" >> "$GITHUB_STEP_SUMMARY" |
| 120 | + echo "$NUMSTAT" | awk 'BEGIN{FS="\t"} {printf "| `%s` | %s | %s |\n", $3, $1, $2}' >> "$GITHUB_STEP_SUMMARY" |
| 121 | + echo "" >> "$GITHUB_STEP_SUMMARY" |
| 122 | + echo "</details>" >> "$GITHUB_STEP_SUMMARY" |
| 123 | + echo "" >> "$GITHUB_STEP_SUMMARY" |
| 124 | + fi |
| 125 | +
|
| 126 | + # ------------------------------------------------------------ |
| 127 | + # ⚠️ # ⚠️ Limite de taille Job Summary : si énorme push (beaucoup de fichiers/commits), |
| 128 | + # le summary peut dépasser ~1024k et échouer. [5](https://www.w3tutorials.net/blog/how-to-avoid-having-to-do-git-branch-set-upstream-and-instead-default-to-automatically-setup-remote-tracking/)[1](https://nhsdigital.github.io/rap-community-of-practice/training_resources/R/git_with_RStudio/) |
0 commit comments