GitHub Actions
Déclenchez Autonomy depuis GitHub Actions une fois qu'une cible de prévisualisation ou de préproduction prête.
Utilisez GitHub Actions lorsque votre fournisseur de déploiement ne dispose pas d'une intégration directe, lorsque vous créez des URL de prévisualisation dans des scripts personnalisés ou lorsque vous souhaitez qu'Autonomy s'exécute dans le cadre d'un pipeline CI existant.
Placement du workflow
Placez Autonomy après le build, le déploiement et la découverte de l'URL de prévisualisation. L'exécution doit recevoir l'URL finale qu'un relecteur ouvrirait. Définissez explicitement les filtres de branche afin que les plans de longue durée ne s'exécutent pas à chaque push.
Secrets requis
Entrées du workflow
- Un projet Autonomy connecté au dépôt.
- L'URL de déploiement de prévisualisation issue du workflow d'hébergement.
- Un jeton facultatif de contournement de la prévisualisation protégée.
- Le numéro de pull request ou le SHA du commit pour publier les preuves dans GitHub.
Stratégie de branche et d'événement
Exécutez de courts plans de smoke test sur les pull requests. Réservez les suites plus étendues aux branches de version, aux exécutions planifiées ou au déclenchement manuel du workflow. Si le plan utilise des services payants ou des données de test rares, rendez le déclencheur explicite.
Transfert d'artefact mobile
GitHub Actions est également la méthode recommandée pour configurer les exécutions mobiles lorsque le projet n'utilise pas Expo EAS. Le modèle est le même que pour les URL de prévisualisation web, mais l'entrée d'Autonomy est un artefact de build plutôt qu'une URL : un .app de simulateur pour iOS ou un .apk / .aab pour Android.
Entrées du workflow mobile
- La clé API Autonomy, l'URL de l'API, l'identifiant du plan de test et les identifiants de plateforme stockés comme secrets du dépôt.
- L'identifiant du plan de test Autonomy correspondant au plan mobile que vous souhaitez exécuter.
- Pour iOS : un runner macOS capable de construire l'application pour simulateur.
- Pour Android : un runner Linux avec le SDK Android pour construire l'APK.
iOS
Divisez le job en deux étapes : effectuez le build sur macOS, puis déclenchez Autonomy sur Linux. Transmettez le .app de l'une à l'autre comme artefact Actions afin de ne pas consommer des minutes macOS pour un appel réseau.
name: iOS Tests
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
jobs:
build:
name: Build iOS Simulator app
runs-on: macos-latest
steps:
- uses: actions/checkout@v5
- name: Build .app
shell: bash
run: |
set -euo pipefail
xcodebuild \
-workspace ios/MyApp.xcworkspace \
-scheme MyApp \
-configuration Release \
-sdk iphonesimulator \
-destination 'generic/platform=iOS Simulator' \
-derivedDataPath ios/build \
build
mkdir -p .build
cp -R ios/build/Build/Products/Release-iphonesimulator/MyApp.app .build/MyApp.app
- uses: actions/upload-artifact@v5
with:
name: ios-simulator-app
path: .build/MyApp.app
retention-days: 1
test:
name: Run Autonomy iOS plan
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v5
with:
name: ios-simulator-app
path: ./build/MyApp.app
- name: Upload and trigger
env:
AUTONOMY_API_KEY: ${{ secrets.AUTONOMY_API_KEY }}
AUTONOMY_API_URL: ${{ secrets.AUTONOMY_API_URL }}
AUTONOMY_TEST_PLAN_ID: ${{ secrets.AUTONOMY_IOS_TEST_PLAN_ID }}
AUTONOMY_IOS_BUNDLE_ID: ${{ secrets.AUTONOMY_IOS_BUNDLE_ID }}
run: |
set -euo pipefail
(cd ./build && zip -qr MyApp.app.zip MyApp.app)
UPLOAD_TARGET=$(curl -fsS -X POST "$AUTONOMY_API_URL/api/artifacts/upload-url" \
-H "Authorization: Bearer $AUTONOMY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"platform":"ios","fileName":"MyApp.app.zip"}')
UPLOAD_URL=$(printf '%s' "$UPLOAD_TARGET" | jq -r '.uploadUrl')
STORAGE_ID=$(printf '%s' "$UPLOAD_TARGET" | jq -r '.storageId')
curl -fsS -X PUT "$UPLOAD_URL" \
-H "Content-Type: application/zip" \
--data-binary "@./build/MyApp.app.zip"
SCAN_BODY=$(jq -n \
--arg storageId "$STORAGE_ID" \
'{ storageId: $storageId, platform: "ios", fileName: "MyApp.app.zip", contentType: "application/zip" }')
curl -fsS -X POST "$AUTONOMY_API_URL/api/artifacts/scan" \
-H "Authorization: Bearer $AUTONOMY_API_KEY" \
-H "Content-Type: application/json" \
-d "$SCAN_BODY"
TRIGGER_BODY=$(jq -n \
--arg testPlanId "$AUTONOMY_TEST_PLAN_ID" \
--arg storageId "$STORAGE_ID" \
--arg bundleId "$AUTONOMY_IOS_BUNDLE_ID" \
--arg branch "$GITHUB_REF_NAME" \
--arg commitSha "$GITHUB_SHA" \
--arg idempotencyKey "github:${GITHUB_RUN_ID}:${GITHUB_RUN_ATTEMPT}:ios" \
'{
testPlanId: $testPlanId,
platforms: ["ios"],
branch: $branch,
targets: { ios: { storageId: $storageId, sourceMode: "upload", bundleId: $bundleId, fileName: "MyApp.app.zip" } },
deployment: { provider: "github-actions", branch: $branch, commitSha: $commitSha },
idempotencyKey: $idempotencyKey
}')
curl -fsS -X POST "$AUTONOMY_API_URL/api/v1/run.trigger" \
-H "Authorization: Bearer $AUTONOMY_API_KEY" \
-H "Content-Type: application/json" \
-d "$TRIGGER_BODY"Android
Les builds Android s'exécutent sur Linux, l'ensemble du workflow tient donc dans un seul job. Aucun transfert d'artefact n'est nécessaire.
name: Android Tests
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
jobs:
test:
name: Build and run Autonomy Android plan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'
- name: Build debug APK
shell: bash
run: |
set -euo pipefail
cd android
./gradlew assembleDebug
- name: Upload and trigger
env:
AUTONOMY_API_KEY: ${{ secrets.AUTONOMY_API_KEY }}
AUTONOMY_API_URL: ${{ secrets.AUTONOMY_API_URL }}
AUTONOMY_TEST_PLAN_ID: ${{ secrets.AUTONOMY_ANDROID_TEST_PLAN_ID }}
AUTONOMY_ANDROID_PACKAGE_NAME: ${{ secrets.AUTONOMY_ANDROID_PACKAGE_NAME }}
run: |
set -euo pipefail
APK_PATH="android/app/build/outputs/apk/debug/app-debug.apk"
UPLOAD_TARGET=$(curl -fsS -X POST "$AUTONOMY_API_URL/api/artifacts/upload-url" \
-H "Authorization: Bearer $AUTONOMY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"platform":"android","fileName":"app-debug.apk"}')
UPLOAD_URL=$(printf '%s' "$UPLOAD_TARGET" | jq -r '.uploadUrl')
STORAGE_ID=$(printf '%s' "$UPLOAD_TARGET" | jq -r '.storageId')
curl -fsS -X PUT "$UPLOAD_URL" \
-H "Content-Type: application/vnd.android.package-archive" \
--data-binary "@$APK_PATH"
SCAN_BODY=$(jq -n \
--arg storageId "$STORAGE_ID" \
'{ storageId: $storageId, platform: "android", fileName: "app-debug.apk", contentType: "application/vnd.android.package-archive" }')
curl -fsS -X POST "$AUTONOMY_API_URL/api/artifacts/scan" \
-H "Authorization: Bearer $AUTONOMY_API_KEY" \
-H "Content-Type: application/json" \
-d "$SCAN_BODY"
TRIGGER_BODY=$(jq -n \
--arg testPlanId "$AUTONOMY_TEST_PLAN_ID" \
--arg storageId "$STORAGE_ID" \
--arg packageName "$AUTONOMY_ANDROID_PACKAGE_NAME" \
--arg branch "$GITHUB_REF_NAME" \
--arg commitSha "$GITHUB_SHA" \
--arg idempotencyKey "github:${GITHUB_RUN_ID}:${GITHUB_RUN_ATTEMPT}:android" \
'{
testPlanId: $testPlanId,
platforms: ["android"],
branch: $branch,
targets: { android: { storageId: $storageId, sourceMode: "upload", packageName: $packageName, fileName: "app-debug.apk" } },
deployment: { provider: "github-actions", branch: $branch, commitSha: $commitSha },
idempotencyKey: $idempotencyKey
}')
curl -fsS -X POST "$AUTONOMY_API_URL/api/v1/run.trigger" \
-H "Authorization: Bearer $AUTONOMY_API_KEY" \
-H "Content-Type: application/json" \
-d "$TRIGGER_BODY"Utilisez un plan de test distinct pour chaque plateforme afin que les échecs indiquent la bonne surface. Si l'artefact est déjà disponible à une URL HTTPS à courte durée de vie, ignorez l'étape de téléversement et transmettez targets.ios.artifactUrl ou targets.android.artifactUrl avec sourceMode: "url".
Dépannage
L'exécution web démarre avant que la prévisualisation soit prête
Séparez le déploiement et le QA en jobs distincts et transmettez l'URL de déploiement par l'intermédiaire des sorties de job. Autonomy ne doit s'exécuter qu'une fois l'URL de prévisualisation connue.
Aucun commentaire de PR n'apparaît
Vérifiez que le contexte de la pull request est disponible, que l'application GitHub Autonomy est installée pour le dépôt et que le SHA du commit a été transmis à Autonomy.
Le téléversement iOS est rejeté comme build pour appareil
L'étape de build macOS produit un .ipa au lieu d'un .app pour simulateur. Vérifiez que -sdk iphonesimulator figure dans la commande xcodebuild et que la destination est une destination de simulateur.
Le build Android ne parvient pas à trouver le SDK
Les runners Ubuntu hébergés par GitHub sont fournis avec le SDK Android préinstallé. Si vous utilisez votre propre hébergement, ajoutez actions/setup-android (ou installez les outils en ligne de commande) avant l'étape Gradle.
Les téléversements mobiles s'accumulent
Utilisez des cibles d'exécution explicites pour les artefacts CI à courte durée de vie et des environnements enregistrés pour les builds qui doivent être réutilisés. Réservez les téléversements depuis le tableau de bord aux builds qu'un responsable de livraison sélectionne pour les exécutions en production.
Application GitHub
Déclenchez des exécutions depuis un commentaire de pull request en langage naturel, et obtenez en retour un commentaire auto-actualisé et un check run.
Vercel
Exécutez automatiquement le QA sur chaque déploiement de prévisualisation Vercel et rapportez le résultat comme un check de déploiement.