„Adobe Experience Manager“ (AEM) paketai yra nepakartojami turinio valdymo herojai – galingi konteineriai, sujungiantys viską nuo kodo ir konfigūracijų iki kritinio turinio. Tačiau pripažinkime: neautomatinis šių paketų kūrimas, konfigūravimas ir atsisiuntimas gali atrodyti kaip varginantis paspaudimų šokis.
O kas, jei galėtumėte automatizuoti šį procesą keliais klavišų paspaudimais, užtikrindami nuoseklumą, greitį, patikimumą ir nedidelį svorių kėlimą?
Parodysiu jums „Bash“ scenarijų, kuris apverčia scenarijų (skirtas!), kaip AEM kūrėjai ir administratoriai dirba su „Package Manager“ API. Pagalvokite apie pakuočių kūrimą per kelias sekundes, filtrų pritaikymą skrydžio metu ir atsarginių kopijų gavimą chirurginiu tikslumu – visa tai prieš tai, kai kava atvės iki tobulos gurkšnojimo temperatūros. ☕
Prieš pasinerdami, trumpa pastaba : šis straipsnis yra gilus, kruopščiai išsamus ir be jokios priežasties techniškas. Išskirsime scenarijaus logiką, išnagrinėsime AEM API sudėtingumą ir šalinsime kraštutinius atvejus. Kūrėjai, norintys pereiti tiesiai į kodą, galite pereiti į straipsnio apačią. Bet jei norite suprasti, kaip ir kodėl yra už automatikos, prisijunkite – mes einame iki pat triušio duobės. 🕳️
Scenarijus create-remote-aem-pkg.sh
automatizuoja sąveiką su AEM paketų tvarkyklės API, siūlydamas struktūrinį paketų kūrimo, konfigūravimo ir platinimo metodą. Sukurtas kūrėjams ir administratoriams, jis pakeičia rankines darbo eigas komandų eilutėmis valdomu procesu, pabrėžiančiu nuoseklumą ir patikimumą.
/content/dam
, /apps
), kurie turi būti įtraukti į paketą.curl
./etc
arba /apps
būsenas prieš taikydami sistemos naujinimus. ./create-remote-aem-pkg.sh admin securepass123 localhost 4502 backup-group "Content Backup" /backups /content/dam /etc/clientlibs
Ši komanda sukuria paketą pavadinimu „Content Backup“ grupės backup-group
, įskaitant /content/dam
ir /etc/clientlibs
, ir išsaugo išvestį /backups
kataloge.
Išskirkime scenarijų create-remote-aem-pkg.sh
(jį rasite straipsnio apačioje), kad suprastume, kaip jis organizuoja AEM paketų valdymą. Daugiausia dėmesio skirsime jo struktūrai, pagrindinėms funkcijoms ir darbo eigos logikai – idealiai tinka kūrėjams, norintiems tinkinti arba derinti įrankį.
_log()
: naudingumo funkcija, kuri prieš pranešimus pateikia laiko žymes, kad būtų aiškūs audito pėdsakai. _log () { echo "[$(date +%Y.%m.%d-%H:%M:%S)] $1" }
Kodėl tai svarbu : užtikrina, kad kiekvienas veiksmas (pvz., „Sukurtas paketas“) būtų registruojamas atsižvelgiant į kontekstą, todėl trikčių šalinimas supaprastinamas.
check_last_exec()
: patvirtina ankstesnių komandų sėkmę, patikrindama išėjimo kodus ir API atsakymus. check_last_exec () { # Checks $? (exit status) and $CURL_OUTPUT for errors if [ "$status" -ne 0 ] || [[ $output =~ .*success\":false* ]]; then _log "Error detected!"; exit 1; fi }
Kodėl tai svarbu : apsaugo nuo tylių gedimų, sustabdo kritinių klaidų, pvz., autentifikavimo problemų ar netinkamų kelių, vykdymą.
Scenarijus priima septynis pozicijos argumentus, po kurių seka dinaminiai filtrai:
USR="$1" # AEM username PWD="$2" # AEM password SVR="$3" # Server host (eg, localhost) PORT="$4" # Port (eg, 4502) PKG_GROUP="$5" # Package group (eg, "backups") PKG_NAME="$6" # Package name (eg, "dam-backup") BK_FOLDER="$7" # Backup directory (eg, "/backups") shift 7 # Remaining arguments become filters (eg, "/content/dam")
Padėties argumentai užtikrina paprastumą, o shift
lanksčiai tvarko kintamus filtrų kelius.
PKG_NAME
tarpai pakeičiami apatiniais brūkšniais, kad būtų išvengta URL problemų. PKG_NAME=${PKG_NAME// /_}
curl
, kad pateiktų paketus per AEM API, išvengiant perteklinių kūrinių. if [ $(curl ... | grep "$PKG_NAME.zip" | wc -l) -eq 1 ]; then _log "Package exists—skipping creation." else curl -X POST ... # Creates the package fi
Sukuria JSON filtrų masyvą iš įvesties kelių:
FILTERS_PARAM="" for i in "${!FILTERS[@]}"; do FILTERS_PARAM+="{\"root\": \"${FILTERS[$i]}\", \"rules\": []}" # Adds commas between entries, but not after the last done
Išvesties pavyzdys :
[{"root": "/content/dam"}, {"root": "/apps"}]
Šis JSON įterpiamas į paketo apibrėžimą per AEM /crx/packmgr/update.jsp
galutinį tašką.
build
komandą: curl -X POST … -F "cmd=build"
Pastaba : prieš tęsdamas scenarijus laukia, kol bus baigtas kūrimas.
curl
, kad gautų .zip
ir išsaugotų jį su laiko žyme pažymėtu failo pavadinimu: BK_FILE="$PKG_NAME-$(date +%Y%m%d-%H%M%S).zip" curl -o "$BK_FOLDER/$BK_FILE" ...
Tvirtas klaidų tvarkymas ir registravimas yra labai svarbūs neprižiūrimiems scenarijus, pvz., create-remote-aem-pkg.sh
, užtikrinant, kad gedimai būtų užfiksuoti anksti ir aiškiai užregistruoti. Štai kaip scenarijus apsaugo nuo netikėtų problemų ir suteikia veiksmingų įžvalgų.
_log
prieš kiekvieną pranešimą prideda laiko žymą [YYYY.MM.DD-HH:MM:SS]
, sukuriant audito seką derinimui: _log "Starting backup process..." # Output: [2023.10.25-14:30:45] Starting backup process...
Kodėl tai svarbu : laiko žymos padeda susieti scenarijaus veiklą su AEM serverio žurnalais arba išoriniais įvykiais (pvz., cron užduočių tvarkaraščiais).
Patikrinimai prieš skrydį :
BK_FOLDER
): if [ ! -d "$BK_FOLDER" ]; then _log "Backup folder '$BK_FOLDER' does not exist!" && exit 1 fi
PKG_NAME
, kad būtų išvengta URL problemų (pvz., tarpai pakeisti apatiniais brūkšniais).
API atsako patvirtinimas :
Funkcija check_last_exec
tiria apvalkalo išėjimo kodus ( $?
), ir AEM API atsakymus:
check_last_exec "Error message" "$CURL_OUTPUT" $CURL_STATUS
curl
tinklo gedimai) suaktyvina tiesioginius išėjimus.
success\":false
JSON atsakymus arba "HTTP ERROR" eilutes.
3.3 HTTP būsenos patvirtinimas : atsisiunčiant paketą, scenarijus patikrina, ar nėra 200
būsenos kodo:
if [ "$(curl -w "%{http_code}" ...)" -eq "200" ]; then # Proceed if download succeeds else _log "Error downloading the package!" && exit 1 fi
check_last_exec
užfiksuoja 401 Unauthorized
atsakymą ir išeina su aiškiu klaidos pranešimu.success:false
, scenarijus registruoja „Klaida pridedant filtrus“ ir baigiasi.BK_FILE
, patikrina failo dydį su vėliava -s
ir įspėjimus prieš išeidama.curl
išeina su kodu, kuris nėra nulis, scenarijus registruoja „Klaida kuriant paketą“.curl -k
, kad būtų paprasčiau, o tai praleidžia SSL patvirtinimą. Gamybos rekomendacija : pakeiskite --cacert
, kad nurodytumėte CA paketą.
$AEM_PASSWORD
).set -x
scenarijaus pradžioje, kad spausdintumėte vykdomas komandas.curl
komandas už scenarijaus ribų ./create-remote-aem-pkg.sh ... >> /var/log/aem_backup.log 2>&1
Scenarijus create-remote-aem-pkg.sh
sukurtas kaip atspirties taškas – pagrindas, kurį galite modifikuoti, kad atitiktų jūsų komandos poreikius. Toliau pateikiami įprasti tinkinimai kartu su įgyvendinimo gairėmis, siekiant išplėsti jo funkcionalumą arba pritaikyti jį konkretiems naudojimo atvejams.
Numatytajame failo pavadinime naudojama laiko žyma ( $PKG_NAME-$(date +%Y%m%d-%H%M%S).zip
). Pakeiskite tai, kad įtrauktumėte aplinkos pavadinimus, projektų ID arba semantines versijas:
# Example: Include environment (eg, "dev", "prod") BK_FILE="${PKG_NAME}-${ENV}-$(date +%Y%m%d).zip" # Example: Add Git commit SHA for traceability COMMIT_SHA=$(git rev-parse --short HEAD) BK_FILE="${PKG_NAME}-${COMMIT_SHA}.zip"
Patarimas : įsitikinkite, kad datos/laiko formatai vengia failų pavadinimuose draudžiamų simbolių (pvz., dvitaškiai :
sistemoje Windows).
Scenarijus priima dinaminius kelius kaip filtrus, bet taip pat galite užkoduoti dažnai naudojamus kelius arba pridėti išskyrimų:
# Hardcode essential paths (eg, "/var/audit") DEFAULT_FILTERS=("/content/dam" "/apps" "/var/audit") FILTERS=("${DEFAULT_FILTERS[@]}" "${@}") # Merge with command-line inputs # Add exclusion rules (requires AEM API support) FILTERS_PARAM+="{\"root\": \"${FILTERS[$i]}\", \"rules\": [{\"modifier\": \"exclude\", \"pattern\": \".*/test/*\"}]}"
Venkite paprasto teksto slaptažodžių :
Norėdami įvesti kredencialus, naudokite aplinkos kintamuosius arba paslapčių tvarkyklę:
# Fetch password from environment variable PWD="$AEM_PASSWORD" # Use AWS Secrets Manager (example) PWD=$(aws secretsmanager get-secret-value --secret-id aem/prod/password --query SecretString --output text)
Priverskite SSL patvirtinimą :
Pakeiskite curl -k
(nesaugus) patikimu CA sertifikatu:
curl --cacert /path/to/ca-bundle.crt -u "$USR":"$PWD" ...
Išplėskite scenarijų, kad suaktyvintumėte tolesnius procesus po sėkmingo atsisiuntimo:
# Example: Upload to cloud storage aws s3 cp "$BK_FOLDER/$BK_FILE" s3://my-backup-bucket/ # Example: Validate package integrity CHECKSUM=$(sha256sum "$BK_FOLDER/$BK_FILE" | cut -d ' ' -f 1) _log "SHA-256 checksum: $CHECKSUM" # Example: Clean up old backups (retain last 7 days) find "$BK_FOLDER" -name "*.zip" -mtime +7 -exec rm {} \;
Praneškite komandoms apie sėkmę / nesėkmę naudodami „Slack“, el. paštu arba stebėjimo įrankius:
# Post to Slack on failure curl -X POST -H 'Content-type: application/json' \ --data "{\"text\":\"🚨 AEM backup failed: $(hostname)\"}" \ https://hooks.slack.com/services/YOUR/WEBHOOK/URL # Send email via sendmail if [ $? -ne 0 ]; then echo "Subject: Backup Failed" | sendmail [email protected] fi
AEM paketų tvarkymas nebūtinai turi būti rankinis darbas, kuriame yra klaidų. Naudodami scenarijų create-remote-aem-pkg.sh
galite paversti paketų kūrimą, filtravimą ir platinimą supaprastintu, pakartojamu procesu. Šis įrankis skirtas ne tik laiko taupymui, bet ir AEM operacijų nuoseklumui, patikimumui ir mastelio keitimui užtikrinti.
Automatizavimas laimi : pašalinus pasikartojančias GUI sąveikas, scenarijus sumažina žmogiškųjų klaidų skaičių ir leidžia komandoms sutelkti dėmesį į didesnės vertės užduotis.
Svarbus lankstumas : nesvarbu, ar kuriama svarbio turinio atsarginė kopija, sinchronizuojama aplinka ar ruošiamasi naujinimams, scenarijus prisitaiko prie įvairių naudojimo atvejų su minimaliu koregavimu.
Atsparumas yra svarbiausias dalykas : integruotas registravimas, klaidų tikrinimas ir saugumo sumetimai užtikrina, kad scenarijus veiktų nuspėjamai, net kai viskas pakrypsta į šoną.
Puikūs įrankiai gimsta iš realių iššūkių. Šis scenarijus yra atskaitos taškas; Pagalvokite apie tai kaip į pagrindą, kuriuo galėsite remtis augant jūsų komandos poreikiams. Nesvarbu, ar esate vienas kūrėjas, ar didelės „DevOps“ komandos dalis, tokia automatizacija parodo, kaip nedidelės investicijos į kodą gali duoti didesnę našumo ir ramybės grąžą.
Pasiruošę žengti kitą žingsnį?
Dėkojame, kad sekate – dabar pirmyn ir automatizuokite! 🚀
#!/bin/bash set -eo pipefail # The script will create a package thought the package manager api: # - The package is created, if not already present # - Package filters are populated accordingly to specified paths # - Package is builded # - Package is download to the specified folder _log () { echo "[$(date +%Y.%m.%d-%H:%M:%S)] $1" } check_last_exec () { local message="$1" local output="$2" local status=$3 if [ "$status" -ne 0 ]; then echo && echo "$message" && echo exit 1 fi if [[ $output =~ .*success\":false* ]] || [[ $output =~ .*"HTTP ERROR"* ]]; then _log "$message" exit 1 fi } USR="$1" PWD="$2" SVR="$3" PORT="$4" PKG_GROUP="$5" PKG_NAME="$6" BK_FOLDER="$7" shift 7 # The following paths will be included in the package FILTERS=($@) BK_FILE=$PKG_NAME"-"$(date +%Y%m%d-%H%M%S).zip _log "Starting backup process..." echo "AEM instance: '$SVR':'$PORT' AEM User: '$USR' Package group: $PKG_GROUP Package name: '$PKG_NAME' Destination folder: $BK_FOLDER Destination file: '$BK_FILE' Filter paths: " printf '\t%s\n\n' "${FILTERS[@]}" if [ ! -d "$BK_FOLDER" ]; then _log "Backup folder '$BK_FOLDER' does not exist!" && echo exit 1 fi PKG_NAME=${PKG_NAME// /_} check_last_exec "Error replacing white space chars from package name!" "" $? || exit 1 _log "Removed whitespaces from package name: '$PKG_NAME'" BK_FILE=$PKG_NAME.zip _log "Backup file: '$BK_FILE'" _log "Creating the package..." if [ $(curl -k -u "$USR":"$PWD" "$SVR:$PORT/crx/packmgr/service.jsp?cmd=ls" 2>/dev/null | grep "$PKG_NAME.zip" | wc -l) -eq 1 ]; then _log " Package '$PKG_GROUP/$PKG_NAME' is already present: skipping creation." else curl -k --silent -u "$USR":"$PWD" -X POST \ "$SVR:$PORT/crx/packmgr/service/.json/etc/packages/$PKG_GROUP/$PKG_NAME?cmd=create" \ -d packageName="$PKG_NAME" -d groupName="$PKG_GROUP" check_last_exec " Error creating the package!" "" $? _log " Package created" fi # create filters variable FILTERS_PARAM="" ARR_LEN="${#FILTERS[@]}" for i in "${!FILTERS[@]}"; do FILTERS_PARAM=$FILTERS_PARAM"{\"root\": \"${FILTERS[$i]}\", \"rules\": []}" T=$((i+1)) if [ $T -ne $ARR_LEN ]; then FILTERS_PARAM=$FILTERS_PARAM", " fi done # add filters _log "Adding filters to the package..." CURL_OUTPUT=$(curl -k --silent -u "$USR":"$PWD" -X POST "$SVR:$PORT/crx/packmgr/update.jsp" \ -F path=/etc/packages/"$PKG_GROUP"/"$PKG_NAME".zip -F packageName="$PKG_NAME" \ -F groupName="$PKG_GROUP" \ -F filter="[$FILTERS_PARAM]" \ -F "_charset_=UTF-8") CURL_STATUS=$? # Pass the status to the check_last_exec function check_last_exec "Error adding filters to the package!" "$CURL_OUTPUT" $CURL_STATUS _log " Package filters updated successfully." # build package _log "Building the package..." CURL_OUTPUT=$(curl -k -u "$USR":"$PWD" -X POST \ "$SVR:$PORT/crx/packmgr/service/script.html/etc/packages/$PKG_GROUP/$PKG_NAME.zip" \ -F "cmd=build") check_last_exec " Error building the package!" "$CURL_OUTPUT" $? _log " Package built." # download package _log "Downloading the package..." if [ "$(curl -w "%{http_code}" -o "$BK_FOLDER/$BK_FILE" -k --silent -u "$USR":"$PWD" "$SVR:$PORT/etc/packages/$PKG_GROUP/$PKG_NAME.zip")" -eq "200" ]; then if [ -f "$BK_FOLDER/$BK_FILE" ] && [ -s "$BK_FOLDER/$BK_FILE" ]; then _log " Package $BK_FILE downloaded in $BK_FOLDER." exit 0 fi fi _log " Error downloading the package!" exit 1
[¹] Praleisti SSL patvirtinimą naudojant curl -k
yra patogu bandant, bet gamyboje norėsite kažko tvirtesnio (pvz., --cacert
)!