Bitrise
Alusta Autonomy käivitusi Bitrise'i töövoost veebieelvaate või Androidi APK jaoks ja kukuta build läbi, kui iga käivitus ei läbi.
Kasuta Bitrise'i Script Stepi, et laadida üles mobiilibuild või testida juurutatud veebieelvaadet, ja hoia töövoogu avatuna, kuni igal Autonomy käivitusel on tulemus. Samm läbib ainult siis, kui iga käivitus on Passed.
Koht töövoos
Lisa Autonomy samm pärast oma olemasolevaid buildi- ja juurutussamme. Veebi puhul ekspordi juurutussammust lõplik avalik eelvaate URL muutujana PREVIEW_URL käsuga envman add --key PREVIEW_URL --value "$PREVIEW_URL"; hilisemad sammud saavad seda lugeda. Mobiili puhul hoia build ja üleslaadimine samas töövoos, et build jääks tööruumi.
Allolevad konfiguratsioonid on failile bitrise.yml terviklikud alternatiivid. Kopeeri oma platvormi oma või ühenda selle sammud olemasolevasse töövoogu. Seadista Bitrise lugema faili bitrise.yml hoidlast ja lisa selle kõrvale commit'i .ci/autonomy.sh. Veebitöövoogu saab käivitada ka kohapeal väljavõetud hoidlas.
Vajalikud saladused
Enne esimest käivitust
- Loo lehel Organization → API keys organisatsiooni API-võti, mis algab eesliitega aut_. Võtmeid saavad luua omanikud ja administraatorid.
- Loo lehel Test plans testiplaan, milles on vähemalt üks selle platvormi testjuhtum, ja kopeeri selle ID.
- Selle keskkonnata retsepti jaoks kasuta testjuhtumeid, mis keskkonna väärtusi ei kasuta, või sea AUTONOMY_ENVIRONMENT_SLUG.
- Tee eelvaate URL internetist kättesaadavaks.
Lisa lehel Workflows → Secrets AUTONOMY_API_KEY. Jäta Expose for pull requests välja ja Replace variables in inputs märkimata. Saladused muutuvad automaatselt shelli keskkonnamuutujateks; ära pane võtit faili bitrise.yml.
Sea lehel Workflows → Env Vars töövoo jaoks need väärtused:
| Muutuja | Väärtus |
|---|---|
AUTONOMY_TEST_PLAN_ID | Käivitatav testiplaan: aadressi /p/<project>/plans/<id> viimane osa lehel Test plans. Kasuta iga platvormi jaoks eraldi plaani. Kui soovid hoopis üht testjuhtumit käivitada, sea AUTONOMY_TEST_CASE_ID (aadressist /p/<project>/tests/<id>) ja jäta see seadmata. |
PREVIEW_URL | Ainult veeb: lõplik juurutatud URL, ilma sisselogimise või eelvaate kaitse leheta. Selle võib seada ka juurutussamm. |
APP_IDENTIFIER | Ainult mobiil: buildi iOS-i bundle ID või Androidi rakenduse ID. |
AUTONOMY_ENVIRONMENT_SLUG | Valikuline: käivita selle buildi URL-i või rakenduse asemel sama projekti salvestatud keskkonnas, selle sihtmärkide ja väärtustega. Abiskript jätab siis üleslaadimise vahele. |
AUTONOMY_WAIT_SECONDS | Valikuline: kogu ooteaeg sekundites, vaikimisi 1200. |
Ilma keskkonnata pole käivitusel keskkonna väärtusi: samm, mis kasutab {{env.NAME}} väärtust, lõpeb tulemusega Couldn't start.
Veebieelvaate URL
Loo hoidlasse kaust .ci ja salvesta kogu see skript failina .ci/autonomy.sh. See vajab Bashi, curl'i versiooni 7.76 või uuemat ja jq-d; allolevatel majutatud stack'idel on need olemas. Kohaliku CLI-käivituse jaoks paigalda need ise. Hoia see fail kõigi platvormide jaoks samasugusena.
#!/usr/bin/env bash
# Usage: bash .ci/autonomy.sh web|ios|android
# Starts Autonomy runs for this CI job and exits 0 only if every run passed.
set -euo pipefail
set +x
: "${AUTONOMY_API_KEY:?Set an aut_ organization API key}"
: "${AUTONOMY_REQUEST_ID:?Set an ID that is unique for this CI job attempt}"
platform="${1:?Usage: bash .ci/autonomy.sh web|ios|android}"
api="${AUTONOMY_API_URL:-https://api.autonomyqa.com}"
api="${api%/}"
post() {
curl --fail-with-body --silent --show-error \
--connect-timeout 15 --max-time 90 \
-X POST "$api$1" \
-H "Authorization: Bearer $AUTONOMY_API_KEY" \
-H 'Content-Type: application/json' --data-binary "$2"
}
# 1. What to run: a test plan or one test case.
if [ -n "${AUTONOMY_TEST_PLAN_ID:-}" ] && [ -z "${AUTONOMY_TEST_CASE_ID:-}" ]; then
what=$(jq -n --arg id "$AUTONOMY_TEST_PLAN_ID" '{testPlanId:$id}')
elif [ -n "${AUTONOMY_TEST_CASE_ID:-}" ] && [ -z "${AUTONOMY_TEST_PLAN_ID:-}" ]; then
what=$(jq -n --arg id "$AUTONOMY_TEST_CASE_ID" '{testCaseId:$id}')
else
echo 'Set exactly one of AUTONOMY_TEST_PLAN_ID or AUTONOMY_TEST_CASE_ID.' >&2
exit 2
fi
# 2. Where to run: a saved environment, or this job's preview URL or build.
if [ -n "${AUTONOMY_ENVIRONMENT_SLUG:-}" ]; then
where=$(jq -n --arg slug "$AUTONOMY_ENVIRONMENT_SLUG" '{environmentSlug:$slug}')
else
case "$platform" in
web)
: "${PREVIEW_URL:?Set PREVIEW_URL, or AUTONOMY_ENVIRONMENT_SLUG}"
where=$(jq -n --arg url "$PREVIEW_URL" '{targets:{web:{baseUrl:$url}}}')
;;
ios|android)
: "${ARTIFACT_PATH:?Set the path to the zipped .app, .apk or .aab}"
: "${APP_IDENTIFIER:?Set the iOS bundle ID or Android package name}"
file=$(basename "$ARTIFACT_PATH")
bytes=$(wc -c < "$ARTIFACT_PATH" | tr -d '[:space:]')
if [ "$platform" = ios ]; then
type=application/zip
else
type=application/vnd.android.package-archive
fi
upload=$(post /api/artifacts/upload-url "$(jq -n \
--arg platform "$platform" --arg fileName "$file" \
--arg contentType "$type" --argjson declaredBytes "$bytes" \
'{platform:$platform,fileName:$fileName,contentType:$contentType,declaredBytes:$declaredBytes}')")
storage=$(jq -er '.storageId' <<< "$upload")
intent=$(jq -er '.intentId' <<< "$upload")
curl --fail-with-body --silent --show-error \
--connect-timeout 15 --max-time 600 \
-X PUT "$(jq -er '.uploadUrl' <<< "$upload")" \
-H "Content-Type: $type" --data-binary "@$ARTIFACT_PATH"
scan=$(post /api/artifacts/scan "$(jq -n \
--arg storageId "$storage" --arg intentId "$intent" \
'{storageId:$storageId,intentId:$intentId}')")
if [ "$(jq -r '.status' <<< "$scan")" != clean ]; then
echo 'The build did not pass the safety check, so no run was started:' >&2
jq -r '.findings[]?.message' <<< "$scan" >&2
exit 1
fi
where=$(jq -n --arg p "$platform" --arg storageId "$storage" \
--arg fileName "$file" --arg id "$APP_IDENTIFIER" \
'{targets:{($p):({storageId:$storageId,sourceMode:"upload",fileName:$fileName}
+ (if $p == "ios" then {bundleId:$id} else {packageName:$id} end))}}')
;;
*) echo 'Usage: bash .ci/autonomy.sh web|ios|android' >&2; exit 2 ;;
esac
fi
# 3. Start the runs. A plan starts one run per test case.
# The request ID's prefix (github, gitlab, ...) names the CI provider.
body=$(jq -n --argjson what "$what" --argjson where "$where" \
--arg platform "$platform" \
--arg branch "${AUTONOMY_BRANCH:-}" --arg pr "${AUTONOMY_PR:-}" \
--arg commitSha "${AUTONOMY_COMMIT_SHA:-}" \
--arg provider "${AUTONOMY_REQUEST_ID%%:*}" \
--arg key "$AUTONOMY_REQUEST_ID:$platform" \
'$what + $where + ({
platforms: [$platform],
branch: $branch,
pr: $pr,
deployment: ({provider: $provider, branch: $branch, commitSha: $commitSha}
| with_entries(select(.value != ""))),
idempotencyKey: $key
} | with_entries(select(.value != "")))')
run_ids=$(post /api/v1/run.trigger "$body" | jq -er '.runIds[]')
printf 'Started Autonomy runs:\n%s\n' "$run_ids"
# 4. Follow each run until it ends. run.get waits up to 25 s for a change;
# sending the last cursor back makes each call wait for something new.
deadline=$((SECONDS + ${AUTONOMY_WAIT_SECONDS:-1200}))
all_passed=true
for run_id in $run_ids; do
cursor=null
while :; do
left=$((deadline - SECONDS))
if [ "$left" -le 0 ]; then
echo "Stopped waiting for run $run_id after AUTONOMY_WAIT_SECONDS. It keeps going in Autonomy." >&2
exit 1
fi
wait_ms=$(( left < 25 ? left * 1000 : 25000 ))
run=$(post /api/v1/run.get "$(jq -n --arg runId "$run_id" \
--argjson cursor "$cursor" --argjson waitMs "$wait_ms" \
'{runId:$runId,cursor:$cursor,waitMs:$waitMs}')")
cursor=$(jq '.cursor' <<< "$run")
status=$(jq -r '.status' <<< "$run")
[ "$status" = queued ] || [ "$status" = running ] || break
done
name="$(jq -r '.testCaseName' <<< "$run") ($run_id)"
case "$status" in
passed)
echo "Passed: $name" ;;
failed)
echo "Failed: $name. Open the run in Autonomy to see which step failed." >&2
all_passed=false ;;
couldnt_start)
echo "Couldn't start: $name. The environment couldn't be tested, so this says nothing about your app. Open the run for the reason, fix it and run again." >&2
all_passed=false ;;
cancelled)
echo "Cancelled: $name." >&2
all_passed=false ;;
*)
echo "Unexpected status $status: $name." >&2
all_passed=false ;;
esac
done
if [ "$all_passed" != true ]; then
echo 'Not every Autonomy run passed.' >&2
exit 1
fi
echo 'Every Autonomy run passed.'Salvesta see konfiguratsioon failina bitrise.yml. Sea ülaltoodud töövoo muutujad ja vali pärast eelvaate juurutamist Start build → web. Väljavõtmise samm jookseb Bitrise'is; kohalik CLI kasutab juba väljavõetud hoidlat.
format_version: '13'
default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git
workflows:
web:
meta:
bitrise.io:
stack: linux-docker-android-22.04
machine_type_id: standard
steps:
- activate-ssh-key@4:
run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'
- git-clone@8:
run_if: '{{getenv "BITRISE_IO" | eq "true"}}'
- script@1:
title: Autonomy
inputs:
- content: |-
#!/usr/bin/env bash
set -euo pipefail
set +x
: "${PREVIEW_URL:?Set the deployed preview URL}"
curl --fail --silent --show-error --retry 12 \
--retry-delay 5 --retry-connrefused --max-time 20 \
"$PREVIEW_URL" > /dev/null
attempt="$(cat /proc/sys/kernel/random/uuid 2>/dev/null || uuidgen)"
export AUTONOMY_REQUEST_ID="bitrise:${BITRISE_BUILD_SLUG:-local}:${BITRISE_TRIGGERED_WORKFLOW_ID}:$attempt"
export AUTONOMY_BRANCH="${BITRISE_GIT_BRANCH:-$(git branch --show-current)}"
export AUTONOMY_COMMIT_SHA="$(git rev-parse HEAD)"
bash .ci/autonomy.sh webKohapeal käivitamiseks paigalda Bitrise CLI ja salvesta see faili bitrise.yml kõrvale failina .bitrise.secrets.yml. Asenda kolm näidisväärtust oma API-võtme, testiplaani ID ja eelvaate URL-iga:
envs:
- AUTONOMY_API_KEY: 'aut_REPLACE_WITH_ORG_KEY'
opts:
is_expand: false
- AUTONOMY_TEST_PLAN_ID: 'REPLACE_WITH_TEST_PLAN_ID'
opts:
is_expand: false
- PREVIEW_URL: 'https://your-preview.example.com'
opts:
is_expand: falseKäivita need käsud hoidla juurkaustast. Ära lisa saladuste faili versioonihaldusse. Kohalik CLI jookseb sinu masinas; stack meta kehtib ainult majutatud build'ide puhul.
printf '\n.bitrise*\n' >> .gitignore
chmod 600 .bitrise.secrets.yml
bitrise setup
bitrise run webMobiiliartefakti üleandmine
Kasuta sama faili .ci/autonomy.sh. iOS-i ja Androidi puhul küsib see üleslaadimise URL-i, saadab buildi päringuga PUT, ootab, kuni turvakontroll tuleb puhtana tagasi, ja alustab käivitused üleslaaditud buildiga. Build ja üleslaadimine jagavad tööruumi, seega pole artefaktide edasiandmist vaja seadistada.
iOS
iOS-i testimine tuleb peagi. Hoia see alles ajaks, mil see on saadaval. Seni ei alusta Autonomy iOS-is käivitusi.
See terviklik alternatiivne bitrise.yml kasutab macOS-i Xcode'i stack'i. Sea AUTONOMY_TEST_PLAN_ID oma iOS-i plaaniks ja APP_IDENTIFIER selle bundle ID-ks. Asenda ios/MyApp.xcodeproj, MyApp ja .app nimi oma projekti, jagatud skeemi ja tootega. Tööruumi puhul asenda -project ios/MyApp.xcodeproj valikuga -workspace ios/MyApp.xcworkspace. Jäta kõik sõltuvuste paigaldamise sammud enne xcodebuild käsku alles.
Ehita simulaatori .app ja paki see zip-faili; seadme .ipa ei sobi. Ka üleslaadimine ja ootamine jooksevad macOS-is ja kasutavad selle buildiaega.
format_version: '13'
default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git
workflows:
ios:
meta:
bitrise.io:
stack: osx-xcode-26.4.x
machine_type_id: g2.mac.medium
steps:
- activate-ssh-key@4:
run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'
- git-clone@8:
run_if: '{{getenv "BITRISE_IO" | eq "true"}}'
- script@1:
title: Autonomy
inputs:
- content: |-
#!/usr/bin/env bash
set -euo pipefail
set +x
xcodebuild -project ios/MyApp.xcodeproj -scheme MyApp \
-configuration Release -sdk iphonesimulator \
-destination 'generic/platform=iOS Simulator' \
-derivedDataPath .build/ios CODE_SIGNING_ALLOWED=NO build
mkdir -p .build/artifacts
ditto -c -k --sequesterRsrc --keepParent \
.build/ios/Build/Products/Release-iphonesimulator/MyApp.app \
.build/artifacts/MyApp.app.zip
export ARTIFACT_PATH="$PWD/.build/artifacts/MyApp.app.zip"
attempt="$(cat /proc/sys/kernel/random/uuid 2>/dev/null || uuidgen)"
export AUTONOMY_REQUEST_ID="bitrise:${BITRISE_BUILD_SLUG:-local}:${BITRISE_TRIGGERED_WORKFLOW_ID}:$attempt"
export AUTONOMY_BRANCH="${BITRISE_GIT_BRANCH:-$(git branch --show-current)}"
export AUTONOMY_COMMIT_SHA="$(git rev-parse HEAD)"
bash .ci/autonomy.sh iosAndroid
See terviklik alternatiivne bitrise.yml kasutab Linuxi Androidi stack'i. Sea AUTONOMY_TEST_PLAN_ID oma Androidi plaaniks ja APP_IDENTIFIER selle rakenduse ID-ks. See eeldab Androidi projekti kaustas android/, hoidlasse lisatud Gradle'i wrapper'it ja moodulit app. Teise mooduli või buildi variandi puhul muuda kausta, ülesannet ja APK teed koos. Jäta alles JDK ja Androidi SDK versioonid, mida sinu build vajab. Sobib ka .aab.
format_version: '13'
default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git
workflows:
android:
meta:
bitrise.io:
stack: linux-docker-android-22.04
machine_type_id: standard
steps:
- activate-ssh-key@4:
run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'
- git-clone@8:
run_if: '{{getenv "BITRISE_IO" | eq "true"}}'
- script@1:
title: Autonomy
inputs:
- content: |-
#!/usr/bin/env bash
set -euo pipefail
set +x
(cd android && bash ./gradlew --no-daemon assembleDebug)
export ARTIFACT_PATH="$PWD/android/app/build/outputs/apk/debug/app-debug.apk"
attempt="$(cat /proc/sys/kernel/random/uuid 2>/dev/null || uuidgen)"
export AUTONOMY_REQUEST_ID="bitrise:${BITRISE_BUILD_SLUG:-local}:${BITRISE_TRIGGERED_WORKFLOW_ID}:$attempt"
export AUTONOMY_BRANCH="${BITRISE_GIT_BRANCH:-$(git branch --show-current)}"
export AUTONOMY_COMMIT_SHA="$(git rev-parse HEAD)"
bash .ci/autonomy.sh androidBitrise loetleb praegu oma tasuta Hobby paketi jaoks masinad macOS Medium ja Linux Medium, 300 krediidiga kuus ja 90-minutilise buildiaja limiidiga. Näited valivad g2.mac.medium ja standard. Kohalik bitrise run ios vajab ikkagi sinu enda Xcode'iga Maci; macOS-i stack'i valimine YAML-is ei loo kaug-Maci. Enne majutatud mobiilibuild'e kontrolli, kui palju krediiti sul alles on. Vaata Bitrise'i hinnakirja.
Pipeline'i sidumine tulemusega
Abiskript alustab käivitused päringuga POST /api/v1/run.trigger ja prindib nende ID-d. Testiplaan alustab iga testjuhtumi kohta ühe käivituse. Seejärel jälgib see iga käivitust päringuga POST /api/v1/run.get, saates tagasi viimase cursor väärtuse koos waitMs: 25000, nii et iga kutse ootab, kuni käivitus muutub. Vastus timedOut: true tähendab ainult, et midagi pole veel muutunud. Vaata Käivitused ja välised tõendid.
| Käivituse tulemus | Töö | Mida logi ütleb |
|---|---|---|
| Passed | Läbib, kui ka kõik teised käivitused läbisid. Ebastabiilne läbimine loeb läbinuks. | Passed |
| Failed | Kukub läbi. | Ava käivitus, et näha, milline samm läbi kukkus ja miks, sealhulgas Runner problem. |
| Couldn't start | Kukub läbi. | Keskkonda ei saanud testida, näiteks build ei paigaldunud või mõni väärtus puudus. See ei ütle sinu rakenduse kohta midagi; paranda põhjus ja käivita uuesti. |
| Cancelled | Kukub läbi. | Cancelled |
Töö kukub läbi ka API-vigade, turvakontrollist mitte läbi tulnud buildi ja ooteaja lõppemise korral. AUTONOMY_WAIT_SECONDS on kõigi käivituste kogu ooteaeg, vaikimisi 1200 sekundit. Hoia CI-töö ajalimiit sellest pikem, lisades buildi ja üleslaadimise aja. CI-töö peatamine ei tühista juba alanud käivitusi.
AUTONOMY_REQUEST_ID koos lisatud platvormiga saab päringu run.trigger väärtuseks idempotencyKey: kui sama tööpüüe saadab päringu uuesti, saab see uute asemel tagasi samad käivitused. Anna igale tööpüüdele oma ID. Esimese koolonini ulatuv osa saadetakse juurutuse pakkujana ning haru ja commit saadetakse koos käivitustega. Päringu ja vastuse täielik kuju on lehel Toimingud.
Nullist erinev väljumiskood kukutab Script Stepi läbi ja peatab hilisemad tavalised sammud. Ära lisa sellele is_skippable: true. Iga töövoo käivitamine loob buildi slug'i ja töövoo ID kõrvale uue UUID, nii et korduskatse või kohalik käivitamine alustab uued käivitused. Tõendite nägemiseks ava prinditud ID abil käivitus projekti lehel Runs.
Harude ja sündmuste strateegia
Näited on käsitsi käivitatavad töövood ilma automaatse päästikuta, seega ei avalda nende seadistamine API-võtit ebausaldusväärsele koodile. Alusta väikese suitsutesti plaaniga ja sea seejärel Bitrise'is usaldusväärsele staging- või väljalaskeharule push-päästik. Lisa Autonomy samm selles töövoos pärast juurutust ja jäta selle harufiltrid alles. Hoia suuremad plaanid ajastatud või käsitsi käivituste jaoks.
Hoia saladused eemal pull request'i buildidest, sealhulgas forkitud pull request'idest. Käivita teste üle vaadatud koodil, kui see jõuab usaldusväärsesse harusse, või alusta käsitsi üle vaadatud commit'i build. Ära lülita retsepti läbimiseks sisse saladuste avaldamist pull request'idele. Haru ja commit saadetakse Autonomyle; see retsept ei postita pull request'i kommentaari.
Teenusepakkuja viited
Ei leidnud?