Corriger les PRs créées par robot/bot dans le repository HyperShift qui ont des échecs CI dus à des fichiers générés manquants.
[Extended thinking: Cette commande valide qu'une PR provient d'un bot, récupère la branche du bot, crée une branche de correction, cherry-pick les commits avec format de conventional commit, exécute make verify pour régénérer les fichiers, organise les changements en commits logiques, exécute la validation, et si réussie crée une nouvelle PR tout en fermant/commentant l'original. Si la validation échoue, la PR originale est préservée.]
Corriger une PR Robot du Repository HyperShift
Exemples d'utilisation :
-
Corriger une PR dependabot par numéro :
/fix-hypershift-repo-robot-pr 7435 -
Corriger une PR konflux par URL :
/fix-hypershift-repo-robot-pr https://github.com/openshift/hypershift/pull/7332
Ce que fait cette commande :
- Valide que la PR est créée par un bot (
is_bot: true) - Récupère les commits de la PR du bot
- Crée une nouvelle branche :
fix/<nom-branche-originale>à partir de la branche de base - Cherry-pick les commits et les convertit au format conventional commit
- Exécute
make verifypour régénérer tous les fichiers nécessaires - Exécute
UPDATE=true make testpour mettre à jour les fixtures de test - Organise les changements en commits logiques et bien structurés
- Exécute
make verifyetmake testpour validation finale - Si succès : Crée une nouvelle PR et ferme/commente l'original
- Si échec : Préserve la PR originale et signale l'échec
Flux du processus :
Étape 1 : Analyser l'entrée et valider la PR
Extraire le numéro de PR de l'argument (gère les formats numéro et URL) :
PR_NUMBER=$(echo "{{args.0}}" | grep -oE '[0-9]+$')
Récupérer les détails de la PR et valider :
gh pr view "$PR_NUMBER" --json number,title,author,headRefName,baseRefName,body,state,url,commits
Validations requises :
- La PR doit exister
- L'état de la PR doit être
OPEN author.is_botdoit êtretrue- Le répertoire de travail doit être propre (pas de changements non committés)
Erreur si ce n'est pas un bot :
ERROR: PR #7435 is not authored by a bot.
Author: username (is_bot: false)
This command is specifically for fixing bot-authored PRs.
Étape 2 : Créer une branche de correction à partir de la base
# Sauvegarder la branche actuelle
ORIGINAL_BRANCH=$(git rev-parse --abbrev-ref HEAD)
# Récupérer les dernières modifications de upstream
git fetch upstream
# Créer la branche de correction à partir de la branche de base de la PR
FIX_BRANCH="fix/${BOT_BRANCH_NAME}"
git checkout -b "$FIX_BRANCH" upstream/${BASE_REF_NAME}
Exemples de noms de branche :
dependabot/go_modules/github-dependencies-0a2d1f925e→fix/dependabot/go_modules/github-dependencies-0a2d1f925ekonflux-hypershift-operator-hotfix-ocpbugs-61296-0170→fix/konflux-hypershift-operator-hotfix-ocpbugs-61296-0170
Étape 3 : Cherry-pick et convertir les commits
Pour chaque commit dans la PR du bot :
- Cherry-pick le commit
- Amender le message de commit au format conventional commit
Conversion des messages de commit du bot au format conventional :
| Bot | Format original | Format converti |
|---|---|---|
| Dependabot | NO-JIRA: Bump the misc-dependencies group... |
chore(deps): bump misc-dependencies group... |
| Dependabot | build(deps): bump X from A to B |
Conserver tel quel (déjà conventional) |
| Konflux | Red Hat Konflux update hypershift-operator... |
chore(konflux): update hypershift-operator... |
Remarque : La logique de conversion ci-dessous est du pseudocode. Claude doit implémenter la conversion basée sur les règles du tableau ci-dessus, en détectant le type de bot à partir du format du message de commit et en effectuant la transformation en conséquence.
# Cherry-pick chaque commit de la PR du bot
for COMMIT in $(gh pr view $PR_NUMBER --json commits -q '.commits[].oid'); do
git cherry-pick "$COMMIT"
# Récupérer le message original et le convertir au format conventional
# Claude implémente la conversion basée sur le tableau ci-dessus :
# - Supprimer le préfixe "NO-JIRA: " si présent
# - Convertir "Bump" en "bump" pour la cohérence
# - Ajouter le préfixe de type approprié (chore(deps):, chore(konflux):, etc.)
# - Préserver le reste du message
ORIGINAL_MSG=$(git log -1 --format='%B')
# Amender avec le message converti
git commit --amend -m "$CONVERTED_MSG"
done
Étape 4 : Exécuter make verify, mettre à jour les fixtures de test, et organiser les changements
Exécuter make verify pour régénérer les fichiers, exécuter les tests avec UPDATE=true pour mettre à jour les fixtures, puis organiser en commits logiques :
# Exécuter make verify (peut générer des fichiers)
make verify 2>&1 || true
# Exécuter make test avec UPDATE=true pour mettre à jour les fixtures de test
UPDATE=true make test 2>&1 || true
# Vérifier les changements
git status --porcelain
Organiser les changements en commits séparés :
-
Changements go.mod/go.sum (module racine) :
git add go.mod go.sum git commit -m "chore(deps): update go.mod dependencies Signed-off-by: ... Commit-Message-Assisted-by: Claude (via Claude Code)" -
Changements vendor/ (module racine) :
git add vendor/ git commit -m "chore(deps): update vendored dependencies Signed-off-by: ... Commit-Message-Assisted-by: Claude (via Claude Code)" -
Changements du module api/ (go.mod, go.sum, vendor/) :
git add api/go.mod api/go.sum api/vendor/ git commit -m "chore(api): update api module dependencies Signed-off-by: ... Commit-Message-Assisted-by: Claude (via Claude Code)" -
Assets régénérés (CRDs, manifests) :
git add cmd/install/assets/ git commit -m "chore: regenerate CRD manifests Signed-off-by: ... Commit-Message-Assisted-by: Claude (via Claude Code)" -
Autres changements de code (le cas échéant) :
git add -A git commit -m "chore: additional changes from make verify Signed-off-by: ... Commit-Message-Assisted-by: Claude (via Claude Code)"
Important : Vérifier les fichiers non suivis que make verify peut générer :
git status --porcelain | grep '^??'
# Ajouter tous les fichiers générés non suivis
Étape 5 : Exécuter la validation complète
# Exécuter make verify (devrait passer maintenant avec un état git propre)
make verify
# Exécuter make test
make test
Étape 6 : Gérer les résultats
Si la validation échoue - ABANDONNER et préserver l'original :
============================================
VALIDATION FAILED - ABORTING
============================================
The original PR #7435 has been PRESERVED.
Please investigate the failures manually.
- make verify: FAILED/PASSED
- make test: FAILED/PASSED
Returning to original branch...
- Nettoyer la branche de correction localement
- Retourner à la branche originale
- NE PAS fermer la PR originale
Si la validation réussit - Créer une nouvelle PR et fermer/commenter l'original :
# Pousser la branche de correction
git push -u origin "$FIX_BRANCH"
# Créer une nouvelle PR avec référence à l'original
# Le titre de la PR doit être préfixé avec NO-JIRA: pour les mises à jour de dépendances des bots
gh pr create \
--title "NO-JIRA: $CONVENTIONAL_TITLE" \
--base "$BASE_REF_NAME" \
--body "## Summary
This PR supersedes #${PR_NUMBER} (authored by ${AUTHOR_LOGIN}).
The original bot PR required regeneration of files to pass CI verification. This PR includes:
- All changes from the original bot PR (with conventional commit format)
- Regenerated files from \`make verify\`
### Commits
This PR organizes changes into logical commits:
1. Dependency updates (go.mod/go.sum)
2. Vendored dependencies
3. API module updates
4. Regenerated assets (CRDs)
### Original PR Description
${ORIGINAL_BODY}
**Original PR:** #${PR_NUMBER}
**Bot Author:** ${AUTHOR_LOGIN}
Assisted-by: Claude (via Claude Code)"
# Essayer de fermer la PR originale, revenir à un commentaire si pas de permission
gh pr close "$PR_NUMBER" --comment "..." || \
gh pr comment "$PR_NUMBER" --body "This PR has been superseded by #${NEW_PR_NUMBER}.
A maintainer can close this PR.
..."
Format de sortie attendu :
Succès :
============================================
SUCCESS
============================================
Original PR #7435 has been closed (or commented).
New PR created: https://github.com/openshift/hypershift/pull/7500
The new PR includes:
- All changes from the bot PR (conventional commits)
- Regenerated files from make verify
- Organized into logical commits
Next steps:
1. Review the new PR: https://github.com/openshift/hypershift/pull/7500
2. Request reviews as needed
3. Merge when CI passes
Échec :
============================================
VALIDATION FAILED - ABORTING
============================================
The original PR #7435 has been PRESERVED.
Please investigate the failures manually.
- make verify: FAILED
- make test: PASSED
The fix branch 'fix/dependabot/go_modules/...' has been deleted locally.
Stratégie d'organisation des commits :
Les changements doivent être organisés en commits logiques pour faciliter la revue :
| Commit | Fichiers | Format du message |
|---|---|---|
| 1 | go.mod, go.sum |
chore(deps): update go.mod dependencies |
| 2 | vendor/ |
chore(deps): update vendored dependencies |
| 3 | api/go.mod, api/go.sum, api/vendor/ |
chore(api): update api module dependencies |
| 4 | cmd/install/assets/**/*.yaml |
chore: regenerate CRD manifests |
| 5 | Autres changements | chore: additional changes from make verify |
Gestion des erreurs :
| Scénario | Message |
|---|---|
| PR non trouvée | ERROR: PR #99999 not found or you don't have access. |
| PR non ouverte | ERROR: PR #7435 is not open (current state: MERGED). |
| Pas un bot | ERROR: PR #7435 is not authored by a bot. Author: username (is_bot: false) |
| Répertoire de travail sale | ERROR: Working directory has uncommitted changes. Please commit or stash before running. |
| make verify échoué | ERROR: make verify failed. Original PR #7435 has been PRESERVED. |
| make test échoué | ERROR: make test failed. Original PR #7435 has been PRESERVED. |
| git push échoué | ERROR: Failed to push branch. Check your permissions and credentials. |
| Création de PR échouée | ERROR: Failed to create new PR. The fix branch has been pushed but you may need to create the PR manually. |
| Pas de permission de fermeture | Revenir à un commentaire sur la PR originale à la place de la fermer |
Fonctionnalités de sécurité :
- Vérification bot : Traite uniquement les PRs avec
is_bot: truedans les données auteur - Opérations atomiques : La PR originale n'est fermée QUE APRÈS la création réussie de la nouvelle PR
- Préservation en cas d'échec : La PR originale n'est JAMAIS fermée si la validation échoue
- État propre requis : Refuse de s'exécuter si le répertoire de travail a des changements non committés
- Restauration de branche : Retourne toujours à la branche originale après la fin
- Nettoyage local : Supprime la branche de correction localement en cas d'échec pour éviter le désordre
- Fallback de permission : Commente sur la PR originale si pas de permission pour la fermer
Bots pris en charge :
Tout auteur bot est pris en charge. Bots courants dans HyperShift :
| Bot | Connexion auteur | PRs typiques |
|---|---|---|
| Dependabot | app/dependabot |
Mises à jour de dépendances Go |
| Konflux | app/red-hat-konflux |
Mises à jour d'images et pipelines |
| Renovate | app/renovate |
Mises à jour de dépendances |
| N'importe quel | is_bot: true |
Diverses mises à jour automatisées |
Format du titre de la PR :
Le titre de la nouvelle PR doit être préfixé avec NO-JIRA: puisque les mises à jour de dépendances des bots n'ont généralement pas de tickets Jira associés :
NO-JIRA: chore(deps): bump misc-dependencies group with 2 updates
Prérequis :
- La CLI
ghdoit être installée et authentifiée avec accès push/PR gitdoit être configuré avecuser.nameetuser.emailmakeet la chaîne d'outils Go doivent être disponibles- Répertoire de travail propre (pas de changements non committés)
Arguments :
- {{args.0}}: Numéro de PR ou URL GitHub complète (obligatoire)
- Exemples :
7435,https://github.com/openshift/hypershift/pull/7435
- Exemples :
La commande fournira des mises à jour de progression via l'outil TodoWrite et signalera le succès ou l'échec avec des informations détaillées.