paint-brush
„DevOps“ požiūris į AEM paketus: kūrimo, konfigūravimo ir kt. automatizavimaspateikė@realgpp
Nauja istorija

„DevOps“ požiūris į AEM paketus: kūrimo, konfigūravimo ir kt. automatizavimas

pateikė Giuseppe Baglio11m2025/02/16
Read on Terminal Reader

Per ilgai; Skaityti

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ą.
featured image - „DevOps“ požiūris į AEM paketus: kūrimo, konfigūravimo ir kt. automatizavimas
Giuseppe Baglio HackerNoon profile picture

„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. 🕳️

1. Scenarijaus apžvalga

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ą.

1.1 Pagrindinės funkcijos

  • Paketo patvirtinimas : patikrina esamus paketus, kad būtų išvengta dubliavimo prieš pradedant kūrimą.
  • Dinaminis filtro įpurškimas : programiškai apibrėžia turinio kelius (pvz., /content/dam , /apps ), kurie turi būti įtraukti į paketą.
  • Sukūrimo automatizavimas : suaktyvina paketų kompiliavimą ir atsisiunčia išvestį į nurodytą katalogą, pridedant laiko žymą prie failų pavadinimų, kad būtų galima valdyti versiją.
  • Klaidų tvarkymas : Patvirtina HTTP atsakymus, aplankų kelius ir autentifikavimą, kad būtų galima pateikti grįžtamąjį ryšį gedimų metu.
  • Autentifikavimas : palaiko pagrindinį¹ kredencialais pagrįstą autentifikavimą naudojant curl .

1.2 Pagrindiniai privalumai

  • Efektyvumas : sumažina rankiniu būdu atliekamus veiksmus, reikalingus kuriant, konfigūruojant ir atsisiunčiant paketą.
  • Nuoseklumas : užtikrina vienodas paketų struktūras ir pavadinimų suteikimo konvencijas įvairiose aplinkose.
  • Atsekamumas : išsamus registravimas kiekviename etape (kūrimas, filtravimas, kūrimas, atsisiuntimas) padeda atlikti auditą ir šalinti triktis.

1.3 Praktiniai pritaikymai

  • Suplanuotos atsarginės kopijos : integruokite su cron užduotimis, kad reguliariai archyvuotumėte svarbius turinio kelius.
  • Aplinkos sinchronizavimas : pakartokite konfigūracijas arba turinį tarp AEM egzempliorių diegimo metu.
  • Išankstinės naujinimo momentinės nuotraukos : užfiksuokite stabilias /etc arba /apps būsenas prieš taikydami sistemos naujinimus.

1.4 Būtinos sąlygos

  • Prieiga prie AEM egzemplioriaus (kredencialai, serveris, prievadas).
  • Pagrindinės žinios apie Bash scenarijus ir AEM paketų tvarkyklę.
  • Leidimas kurti ir atsisiųsti paketus per AEM API.

1.5 Naudojimo pavyzdys

 ./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.

2. Scenarijaus suskirstymas

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į.

2.1 Pagrindinės funkcijos

  • _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ą.

2.2 Įvesties parametrai

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.

2.3 Paketo patvirtinimas ir kūrimas

  • Išvalyti pavadinimus : PKG_NAME tarpai pakeičiami apatiniais brūkšniais, kad būtų išvengta URL problemų.
 PKG_NAME=${PKG_NAME// /_}
  • Patikrinkite esamus paketus : Naudoja 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

2.4 Dinaminio filtro konfigūracija

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ą.

2.5 Sukūrimo ir atsisiuntimo darbo eiga

  • Sukurkite paketą : suaktyvina kompiliavimą naudojant AEM build komandą:

curl -X POST … -F "cmd=build"


Pastaba : prieš tęsdamas scenarijus laukia, kol bus baigtas kūrimas.

  • Atsisiuntimas : naudoja 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" ...

3. Klaidų tvarkymas, saugos pastabos ir registravimas

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ų.

3.1 Registravimo mechanizmas

  • Laiko žyma pažymėti žurnalai : funkcija _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).

  • Daugiakalbis išvestis : svarbūs veiksmai, pvz., paketo kūrimas, filtrų atnaujinimai ir atsisiuntimai, yra aiškiai registruojami, kad būtų galima stebėti pažangą.

3.2 Klaidų patvirtinimo darbo eiga

Patikrinimai prieš skrydį :

  • Prieš tęsiant patikrinama, ar yra atsarginės kopijos aplankas ( BK_FOLDER ):
 if [ ! -d "$BK_FOLDER" ]; then _log "Backup folder '$BK_FOLDER' does not exist!" && exit 1 fi
  • Apdoroja 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

  • Išėjimo kodai : ne nulinės reikšmės (pvz., curl tinklo gedimai) suaktyvina tiesioginius išėjimus.


  • API klaidos : AEM išvestyje aptinka 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

3.4 Įprasti gedimų scenarijai

  • Netinkami kredencialai: check_last_exec užfiksuoja 401 Unauthorized atsakymą ir išeina su aiškiu klaidos pranešimu.
  • Netinkamas filtro kelias: AEM API grąžina success:false , scenarijus registruoja „Klaida pridedant filtrus“ ir baigiasi.
  • Diskas pilnas: Nepavyko įrašyti BK_FILE , patikrina failo dydį su vėliava -s ir įspėjimus prieš išeidama.
  • AEM egzempliorius nepasiekiamas: curl išeina su kodu, kuris nėra nulis, scenarijus registruoja „Klaida kuriant paketą“.

3.5 Saugumo svarstymai

  • SSL sertifikato apėjimas : scenarijus naudoja curl -k , kad būtų paprasčiau, o tai praleidžia SSL patvirtinimą. Gamybos rekomendacija : pakeiskite --cacert , kad nurodytumėte CA paketą.


  • Paprasto teksto slaptažodžiai : kredencialai perduodami kaip argumentai, kurie gali būti rodomi proceso žurnaluose. Sušvelninimas : naudokite aplinkos kintamuosius arba paslapčių saugyklą (pvz., $AEM_PASSWORD ).

3.6 Derinimo patarimai

  • Įgalinti išsamią išvestį : laikinai pridėkite set -x scenarijaus pradžioje, kad spausdintumėte vykdomas komandas.
  • Išbandykite API iškvietimus rankiniu būdu : išskirkite problemas vykdydami svarbias curl komandas už scenarijaus ribų
  • Tikrinti žurnalus : peradresuokite scenarijaus išvestį į failą, kad galėtumėte vėliau analizuoti:

./create-remote-aem-pkg.sh ... >> /var/log/aem_backup.log 2>&1

4. Įrankio pritaikymas jūsų darbo eigai

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.

4.1 Atsarginės kopijos failo pavadinimo formato reguliavimas

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).

4.2 Filtrų išplėtimas arba keitimas

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/*\"}]}"

4.3 Saugumo didinimas


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" ...

4.4 Veiksmų po kūrimo pridėjimas

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 {} \;

4.5 Pranešimų įspėjimų pridėjimas

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

5. Išvada

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.

Raktai išsinešti

  1. 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.


  2. Svarbus lankstumas : nesvarbu, ar kuriama svarbio turinio atsarginė kopija, sinchronizuojama aplinka ar ruošiamasi naujinimams, scenarijus prisitaiko prie įvairių naudojimo atvejų su minimaliu koregavimu.


  3. 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į?

  • 🛠️ Tinkinti : pritaikykite scenarijų naudodami 6 skyrių kaip savo vadovą.
  • 🔍 Auditas : peržiūrėkite esamas AEM darbo eigas ir ieškokite automatizavimo galimybių.
  • 🤝 Dalintis : kurkite savo komandą arba parašykite tinklaraščio įrašą apie savo modifikacijas.


Dėkojame, kad sekate – dabar pirmyn ir automatizuokite! 🚀

Priedas

Pilnas kodas

 #!/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


Nuorodos

[¹] Praleisti SSL patvirtinimą naudojant curl -k yra patogu bandant, bet gamyboje norėsite kažko tvirtesnio (pvz., --cacert )!


[²] AEM paketo valdytojo oficialūs dokumentai

L O A D I N G
. . . comments & more!

About Author

Giuseppe Baglio HackerNoon profile picture
Giuseppe Baglio@realgpp
Working as an AEM Solution Architect, I consider myself as a software craftsman.

PABAIGTI ŽYMES

ŠIS STRAIPSNIS BUVO PRISTATYMAS...