GitLab CI
Käivita Autonomy GitLab CI-st eelvaate-URL-i, iOS Simulatori rakenduse või Androidi APK-ga ning sea töövoo jätkamine sõltuvusse tulemusest.
Käivita Autonomy pärast juurutust või mobiilirakenduse build'i ja hoia GitLabi töö avatuna, kuni igal valitud testjuhtumil on kehtiv edukas tulemus. Kopeeri ühine skript ja selle platvormi konfiguratsioon, mida sinu projekt väljastab.
Töövoo paigutus
Paiguta Autonomy pärast juurutustööd, mis leiab lõpliku eelvaate-URL-i, või pärast mobiiliartefakti ehitavat tööd. Allolev veebinäide võtab juba juurutatud URL-i ja kontrollib, et see vastaks. See ei juuruta sinu rakendust.
Iga YAML-näide on täielik alternatiivne .gitlab-ci.yml. Olemasolevasse töövoogu lisades säilita build'i- ja juurutustööd, ühenda etapid ning suuna needs URL-i või artefakti tootvale tööle. Käivita ainult usaldusväärset koodi kaitstud vaikeharul.
Vajalikud saladused
Lisa need väärtused jaotises Settings → CI/CD → Variables tüübiga Variable, mitte File, ja keskkonna skoobiga *. Kaitse muutujad ning keela muutujaviidete laiendamine. Märgi API-võti valikuga Masked and hidden. Kaitse vaikeharu enne näidete käivitamist.
-
AUTONOMY_API_KEY: organisatsiooni API-võti algusegaaut_, mis on loodud Autonomy jaotises Settings → API Keys. See peab kuuluma plaani sisaldavale organisatsioonile. Organisatsiooni võtmed hõlmavad praegu kõiki API skoope. -
AUTONOMY_API_URL: kopeeriCONVEX_SITE_URLvõiNEXT_PUBLIC_CONVEX_SITE_URLsinu API-võtmele vastavast juurutusest. Kasuta selle täpset Convexi HTTP-URL-i, säilitades hostinimes võimaliku piirkonna, ilma/apija lõpus oleva rajata. Ära kasuta töölaua URL-i ega.convex.cloudaadressi. Arendusvõti vajab vastava arendusjuurutuse URL-i. -
AUTONOMY_TEST_PLAN_ID: tegeliku Test Plans plaani ID, milles on vähemalt üks veebitestjuhtum. Kopeeri ID plaani URL-ist. Test Cases ID ei ole plaani ID-ga vahetatav. -
PREVIEW_URL: valmis HTTPS-i eelvaate-URL veebinäite jaoks. See peab olema Autonomy runner'ist ligipääsetav, mittelocalhostega teenus, mis on nähtav ainult CI töö sees. - iOS-i jaoks lisa
AUTONOMY_IOS_TEST_PLAN_IDjaAUTONOMY_IOS_BUNDLE_ID. Androidi jaoks lisaAUTONOMY_ANDROID_TEST_PLAN_IDjaAUTONOMY_ANDROID_PACKAGE_NAME. Iga plaan peab sisaldama selle platvormi testjuhtumeid; identifikaatorid peavad vastama ehitatud rakendusele. - Veendu, et soovitud platvormi Autonomy runner ja piisavad käivituskrediidid oleksid saadaval. Nende selgesõnaliste eraldiseisvate sihtmärkide puhul kasuta testjuhtumeid, mis ei viita salvestatud Environment-i käitusaegsetele väärtustele.
Näited määravad AUTONOMY_REQUEST_ID väärtuse CI_JOB_ID põhjal, nii et uuesti käivitatud GitLabi töö saab uue päringu. Haru ja commit'i metaandmed tulevad GitLabi eelmääratud muutujatest. Valitud testjuhtumite korraldamist kirjeldab Test Plans.
Veebi eelvaate-URL
Loo hoidla juurkausta .ci/, salvesta järgmine skript faili .ci/autonomy.sh ja commiti see koos töövoofailiga. Kõik selle lehe retseptid kasutavad täpselt sama skripti. See vajab Bashi, jq-d ning curl 7.76 või uuemat versiooni; konteineripõhised tööd paigaldavad need.
#!/usr/bin/env bash
set -euo pipefail
set +x
: "${AUTONOMY_API_URL:?Set the API base URL, without /api}"
: "${AUTONOMY_API_KEY:?Set an aut_ organization API key}"
: "${AUTONOMY_TEST_PLAN_ID:?Set the Test Plans ID for this platform}"
: "${AUTONOMY_REQUEST_ID:?Set a unique CI job/attempt ID}"
platform="${1:-web}"
api="${AUTONOMY_API_URL%/}"
work=$(mktemp -d)
trap 'rm -rf "$work"' EXIT
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"
}
case "$platform" in
web)
: "${PREVIEW_URL:?Set the reachable preview URL after deployment}"
targets=$(jq -n --arg url "$PREVIEW_URL" '{web:{baseUrl:$url}}')
;;
ios|android)
: "${ARTIFACT_PATH:?Set the path to the app archive or APK}"
: "${APP_IDENTIFIER:?Set the bundle ID or Android package name}"
test -s "$ARTIFACT_PATH"
file=$(basename "$ARTIFACT_PATH")
bytes=$(wc -c < "$ARTIFACT_PATH" | tr -d '[:space:]')
content_type=application/zip
if [ "$platform" = android ]; then
content_type=application/vnd.android.package-archive
fi
upload=$(post /api/artifacts/upload-url "$(jq -n \
--arg platform "$platform" --arg fileName "$file" \
--arg contentType "$content_type" --argjson declaredBytes "$bytes" \
'{platform:$platform,fileName:$fileName,contentType:$contentType,declaredBytes:$declaredBytes}')")
url=$(jq -er '.uploadUrl | strings | select(length > 0)' <<< "$upload")
storage=$(jq -er '.storageId | strings | select(length > 0)' <<< "$upload")
intent=$(jq -er '.intentId | strings | select(length > 0)' <<< "$upload")
jq -e '.method == "PUT"' <<< "$upload" > /dev/null
curl --fail-with-body --silent --show-error \
--connect-timeout 15 --max-time 600 -X PUT "$url" \
-H "Content-Type: $content_type" --data-binary "@$ARTIFACT_PATH"
scan=$(post /api/artifacts/scan "$(jq -n \
--arg storageId "$storage" --arg intentId "$intent" \
'{storageId:$storageId,intentId:$intentId}')")
if ! jq -e '.status == "clean"' <<< "$scan" > /dev/null; then
echo 'Artifact scan did not pass; refusing to trigger.' >&2
exit 1
fi
targets=$(jq -n --arg platform "$platform" --arg storageId "$storage" \
--arg fileName "$file" --arg identifier "$APP_IDENTIFIER" \
'{($platform):({storageId:$storageId,sourceMode:"upload",fileName:$fileName} +
(if $platform == "ios" then {bundleId:$identifier} else {packageName:$identifier} end))}')
;;
*) echo 'Usage: bash .ci/autonomy.sh web|ios|android' >&2; exit 2 ;;
esac
body=$(jq -n --arg testPlanId "$AUTONOMY_TEST_PLAN_ID" \
--arg platform "$platform" --argjson targets "$targets" \
--arg branch "${AUTONOMY_BRANCH:-manual}" \
--arg commitSha "${AUTONOMY_COMMIT_SHA:-}" \
--arg key "$AUTONOMY_REQUEST_ID:$platform" \
'{testPlanId:$testPlanId,platforms:[$platform],targets:$targets,
branch:$branch,deployment:{branch:$branch,commitSha:$commitSha},idempotencyKey:$key}')
post /api/v1/run.trigger "$body" > "$work/trigger.json"
jq -e '.runIds | type == "array" and length > 0' "$work/trigger.json" > /dev/null
jq -er '.runIds[] | strings | select(length > 0)' "$work/trigger.json" > "$work/run-ids"
printf 'Queued Autonomy runs:\n'
cat "$work/run-ids"
deadline=$((SECONDS + ${AUTONOMY_WAIT_SECONDS:-1200}))
while IFS= read -r run_id; do
while :; do
if (( SECONDS >= deadline )); then
echo "Timed out waiting for $run_id; failing the CI job." >&2
exit 1
fi
result=$(post /api/v1/run.get "$(jq -n --arg runId "$run_id" '{runId:$runId}')")
status=$(jq -er '.status' <<< "$result")
case "$status" in
queued|running|retrying) sleep 10 ;;
passing|failed|unverified|invalid|canceled)
printf '%s: %s\n' "$run_id" "$status"
if ! jq -e '.verdict == "passed" and .validity == "valid"' <<< "$result" > /dev/null; then
echo "Autonomy gate failed for $run_id." >&2
exit 1
fi
break ;;
*) echo "Unexpected run status: $status" >&2; exit 1 ;;
esac
done
done < "$work/run-ids"
echo 'Every Autonomy run passed.'Salvesta järgnev faili .gitlab-ci.yml. Luba projekti jaoks GitLabi hallatud Linuxi runner'id; veebitööd ja iOS-i üleslaadimistöö valivad selgesõnaliselt saas-linux-small-amd64. GitLab Self-Managedi puhul asenda see silt igas Linuxi konteineritöös oma Linuxi Docker-executor'iga runner'i sildiga. Alusta valikust Build → Pipelines → New pipeline kaitstud vaikeharul. Kui API päringu vastu võtab, ilmuvad logisse Queued Autonomy runs: ja käivituste ID-d.
stages: [prepare, qa]
workflow:
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_REF_PROTECTED == "true"'
- when: never
default:
tags: [saas-linux-small-amd64]
image: debian:stable-slim
before_script:
- apt-get update && apt-get install -y --no-install-recommends bash curl jq ca-certificates
preview_ready:
stage: prepare
script:
- |
: "${PREVIEW_URL:?Set the deployed preview URL in CI/CD Variables}"
curl --fail --silent --show-error --location \
--connect-timeout 15 --max-time 60 "$PREVIEW_URL" > /dev/null
printf 'PREVIEW_URL=%s\n' "$PREVIEW_URL" > preview.env
artifacts:
reports:
dotenv: preview.env
expire_in: 1 day
autonomy_web:
stage: qa
timeout: 30m
needs:
- job: preview_ready
artifacts: true
script:
- |
export AUTONOMY_REQUEST_ID="gitlab:$CI_PROJECT_ID:$CI_JOB_ID"
export AUTONOMY_BRANCH="$CI_COMMIT_REF_NAME"
export AUTONOMY_COMMIT_SHA="$CI_COMMIT_SHA"
bash .ci/autonomy.sh webKui URL luuakse olemasolevas juurutustöös, liiguta printf ja artifacts:reports:dotenv kirjed sellesse töösse ning asenda needs selle nimega. Eemalda fikseeritud projekti muutuja PREVIEW_URL, et see ei kirjutaks üle genereeritud dotenv-väärtust. Ära pane mandaate faili preview.env; GitLab salvestab selle allalaaditava artefaktina.
Mobiiliartefakti üleandmine
Kasuta sama .ci/autonomy.sh skripti. See taotleb allkirjastatud üleslaadimis-URL-i, laadib faili üles, nõuab puhast skannitulemust ja edastab saadud salvestus-ID käivitusele. Vali ainult platvorm, mille build on sinu hoidlas olemas.
iOS
Kasuta eraldi kaitstud isehallatavat macOS-i runner'it sildiga macos, Bashi shell-executor'iga ning paigaldatud Xcode'i ja iOS Simulatori SDK-ga. Keela selle runner'i valik Run untagged jobs ja ära lisa sellele Linuxi runner'i silti. GitLabi hallatud macOS-i runner'id vajavad Premiumi või Ultimate'i paketti, välja arvatud sobivad avatud lähtekoodiga projektide programmid. Tavaline Free-projekt vajab oma Maci. Linux ei saa seda Xcode'i build'i teha.
See natiivne näide eeldab ios/MyApp.xcodeproj projekti, jagatud MyApp skeemi ja MyApp.app väljundit. Asenda kõik kolm oma projekti nimedega ning paigalda projektipõhised sõltuvused enne xcodebuild käsku. Workspace-projekti puhul kasuta -project asemel -workspace ios/MyApp.xcworkspace. Tulemuseks on Simulatori .app, mitte seadme .ipa.
macOS-i töö arhiveerib rakenduse, säilitades käivitusõigused ja sümboolsed lingid, enne kui GitLab ZIP-i transpordib. needs:artifacts laadib selle ZIP-i alla Linuxi töös, mis tegeleb üleslaadimise ja ootamisega.
stages: [build, qa]
workflow:
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_REF_PROTECTED == "true"'
- when: never
build_ios:
stage: build
tags: [macos]
script:
- |
set -euo pipefail
xcodebuild \
-project ios/MyApp.xcodeproj \
-scheme MyApp \
-configuration Release \
-sdk iphonesimulator \
-destination 'generic/platform=iOS Simulator' \
-derivedDataPath ios/build \
CODE_SIGNING_ALLOWED=NO \
build
mkdir -p .build
(cd ios/build/Build/Products/Release-iphonesimulator && \
zip -qry -y "$CI_PROJECT_DIR/.build/MyApp.app.zip" MyApp.app)
artifacts:
paths:
- .build/MyApp.app.zip
expire_in: 1 day
autonomy_ios:
stage: qa
tags: [saas-linux-small-amd64]
image: debian:stable-slim
timeout: 30m
needs:
- job: build_ios
artifacts: true
before_script:
- apt-get update && apt-get install -y --no-install-recommends bash curl jq ca-certificates
script:
- |
export AUTONOMY_TEST_PLAN_ID="$AUTONOMY_IOS_TEST_PLAN_ID"
export APP_IDENTIFIER="$AUTONOMY_IOS_BUNDLE_ID"
export ARTIFACT_PATH=".build/MyApp.app.zip"
export AUTONOMY_REQUEST_ID="gitlab:$CI_PROJECT_ID:$CI_JOB_ID"
export AUTONOMY_BRANCH="$CI_COMMIT_REF_NAME"
export AUTONOMY_COMMIT_SHA="$CI_COMMIT_SHA"
bash .ci/autonomy.sh iosAndroid
Registreeri eraldi kaitstud Linuxi runner sildiga android-linux ja Bashi shell-executor'iga. Keela selle runner'i valik Run untagged jobs ja ära lisa sellele Linuxi konteinerirunner'i silti. Paigalda sellesse masinasse projekti nõutav JDK, Androidi käsureatööriistad, sinu compile SDK ja build-tools versioonid, Bash, jq, curl 7.76 või uuem ning usaldusväärsed CA-sertifikaadid. Määra ANDROID_HOME, nõustu SDK litsentsidega ning lisa hoidlasse käivitatav android/gradlew koos wrapper-failidega. Shell-executor kasutab hosti tööriistu ega paigalda Androidi SDK-d sinu eest.
See näide ehitab app mooduli silumise APK ja laadib selle üles samas Linuxi töös. Kui projekt kasutab variante või teist moodulit, kohanda koos Gradle'i ülesannet ja ARTIFACT_PATH väärtust.
stages: [qa]
workflow:
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_REF_PROTECTED == "true"'
- when: never
autonomy_android:
stage: qa
tags: [android-linux]
timeout: 60m
script:
- |
set -euo pipefail
(cd android && ./gradlew --no-daemon assembleDebug)
export AUTONOMY_TEST_PLAN_ID="$AUTONOMY_ANDROID_TEST_PLAN_ID"
export APP_IDENTIFIER="$AUTONOMY_ANDROID_PACKAGE_NAME"
export ARTIFACT_PATH="android/app/build/outputs/apk/debug/app-debug.apk"
export AUTONOMY_REQUEST_ID="gitlab:$CI_PROJECT_ID:$CI_JOB_ID"
export AUTONOMY_BRANCH="$CI_COMMIT_REF_NAME"
export AUTONOMY_COMMIT_SHA="$CI_COMMIT_SHA"
bash .ci/autonomy.sh androidTöövoo jätkamise sidumine tulemusega
Skript kontrollib iga run.trigger tagastatud ID-d run.get kaudu. See ootab edasi, kuni käivituse olek on queued, running või retrying, ja õnnestub ainult siis, kui iga lõpptulemus sisaldab verdict: "passed" ja validity: "valid". Pelgalt järjekorda lisatud käivitus ei muuda töövoogu edukaks. Ebaõnnestunud, kehtetud, kontrollimata, tühistatud, ootamatud või aegunud tulemused lõpetavad töö ebaõnnestunult.
Vaikimisi on kõigi tagastatud käivituste ühine ooteaeg 1200 sekundit. Muuda seda väärtusega AUTONOMY_WAIT_SECONDS ning hoia GitLabi töö ja runner'i ajalimiidid sellest pikemad, lisades build'i ja üleslaadimise aja. Hoia allow_failure keelatuna. GitLabi töö tühistamine või ajalimiidi täitumine lõpetab pärimise, kuid ei tühista juba järjekorras olevat Autonomy käivitust.
Harude ja sündmuste strateegia
Need konfiguratsioonid lubavad push-sündmusi, ajastusi ja käsitsi käivitatud töövooge ainult kaitstud vaikeharul. Merge request'ide töövood ja fork'ide kood ei saa võtit. Kasuta tavaliste juurutuste puhul lühikesi smoke-testiplaane; versioonikontrolliks käivita laiem plaan ajastuse või käsitsi käivitatud töövooga.
Merge request'i eelvaate kontrollimiseks käivita kaitstud vaikeharu usaldusväärne konfiguratsioon käsitsi koos üle vaadatud eelvaate-URL-iga. Ära luba kaitstud muutujatele ligipääsu ebausaldusväärse merge request'i koodile. Harureeglite laiendamisel kaitse need harud ning vaata esmalt üle nende töövoomuudatused.
Teenusepakkuja viited
- GitLab CI/CD YAML-i viide: etapid, töövooreeglid, runner'i sildid, ajalimiidid ja
needs. - CI/CD muutujad: muutujate väärtused, maskeerimine ja kaitstud harud.
- Tööde artefaktid ja dotenv-aruanded: ZIP-i või URL-i edastamine tööde vahel.
- Eelmääratud muutujad: tööde ID-d, harunimed ja commit'ide SHA-d.
- Hallatud Linuxi runner'id: silt
saas-linux-small-amd64ja konteineris käivitamine. - Hallatud macOS-i runner'id ja shell-executor: runner'ite saadavus ja hosti eeltingimused.