Adobe Experience Manager (AEM)-pakkette is die onbesonge helde van inhoudbestuur - kragtige houers wat alles van kode en konfigurasies tot kritieke inhoud saambind. Maar kom ons erken dit: om hierdie pakkette met die hand te skep, op te stel en af te laai, kan soos 'n vervelige dans van klik voel. Wat as jy hierdie proses met 'n paar toetsaanslagen kan outomatiseer, wat konsekwentheid, spoed, betroubaarheid en minder swaar opheffing verseker? Ek sal vir jou 'n Bash-skrip wys wat die skrif omdraai (woordspeling bedoel!) oor hoe AEM-ontwikkelaars en -administrateurs met die Package Manager API werk. Dink daaraan om pakkette binne sekondes te maak, filters dadelik aan te pas, en rugsteun met chirurgiese akkuraatheid vas te maak - alles voordat jou koffie afkoel tot daardie teugtemperatuur. ☕ perfekte : 🕳️ Voordat ons induik, 'n vinnige nota Hierdie artikel is 'n diep duik, noukeurig gedetailleerd en onverskoonbaar tegnies. Ons sal die skrif se logika dissekteer, AEM API-verwikkelinge verken en randgevalle oplos. Vir ontwikkelaars wat gretig is om reguit in die kode te spring, kan jy na die onderkant van die artikel spring. Maar as jy hier is om die hoe en hoekom agter die outomatisering te verstaan, maak vas - ons gaan al die pad af in die konyngat. 1. Skripoorsig Die script outomatiseer interaksies met AEM se Package Manager API, en bied 'n gestruktureerde benadering tot pakketskepping, konfigurasie en verspreiding. Dit is ontwerp vir ontwikkelaars en administrateurs en vervang handmatige werkvloei met 'n opdraglyngedrewe proses wat konsekwentheid en betroubaarheid beklemtoon. create-remote-aem-pkg.sh 1.1 Kernfunksies : Kontroleer vir bestaande pakkette om oortolligheid te vermy voordat die skepping begin word. Pakketvalidering : Definieer inhoudspaaie (bv. , ) programmatig om by die pakket in te sluit. Dinamiese filterinspuiting /content/dam /apps : aktiveer pakketsamestelling en laai die uitvoer af na 'n gespesifiseerde gids, en voeg 'n tydstempel by lêername vir weergawebeheer. Bou-outomatisering : Valideer HTTP-antwoorde, vouerpaaie en stawing om uitvoerbare terugvoer te gee tydens mislukkings. Fouthantering : Ondersteun basiese¹ geloofsbriewe-gebaseerde stawing via . Stawing curl 1.2 Sleutelvoordele : Verminder handmatige stappe wat nodig is vir pakketskepping, opstelling en aflaai. Doeltreffendheid : Verseker eenvormige pakketstrukture en naamkonvensies oor omgewings heen. Konsekwentheid : Gedetailleerde aantekening in elke stadium (skepping, filtering, bou, aflaai) help met ouditering en probleemoplossing. Naspeurbaarheid 1.3 Praktiese toepassings : Integreer met cron-take om kritiese inhoudpaaie gereeld te argiveer. Geskeduleerde rugsteune : Repliseer konfigurasies of inhoud tussen AEM-gevalle tydens ontplooiings. Omgewingssinchronisasie : Vang stabiele toestande van of vas voordat stelselopdaterings toegepas word. Vooropdateer kiekies /etc /apps 1.4 Voorvereistes Toegang tot 'n AEM-instansie (geloofsbriewe, bediener, poort). Basiese vertroudheid met Bash scripting en AEM se pakketbestuurder. Toestemming om pakkette te skep en af te laai via die AEM API. 1.5 Voorbeeld Gebruik ./create-remote-aem-pkg.sh admin securepass123 localhost 4502 backup-group "Content Backup" /backups /content/dam /etc/clientlibs Hierdie opdrag skep 'n pakket met die naam "Content Backup" onder die groep , insluitend en , en stoor die uitvoer na die -gids. backup-group /content/dam /etc/clientlibs /backups 2. Skripontleding Kom ons dissekteer die -skrip (jy kan dit onderaan die artikel vind) om te verstaan hoe dit AEM-pakketbestuur orkestreer. Ons sal fokus op die struktuur, sleutelfunksies en werkvloeilogika – ideaal vir ontwikkelaars wat die nutsding wil aanpas of ontfout. create-remote-aem-pkg.sh 2.1 Kernfunksies : 'n Nutsfunksie wat boodskappe met tydstempels voorvoeg vir duidelike ouditroetes. _log() _log () { echo "[$(date +%Y.%m.%d-%H:%M:%S)] $1" } : Verseker dat elke aksie (bv. "Pakket gebou") met konteks aangeteken word, wat die probleemoplossing vereenvoudig. Hoekom dit saak maak : Bekragtig die sukses van vorige opdragte deur uitgangkodes en API-antwoorde na te gaan. check_last_exec() 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 } : Voorkom stille mislukkings deur die uitvoering van kritieke foute soos stawingkwessies of ongeldige paaie te staak. Hoekom dit saak maak 2.2 Invoerparameters Die skrif aanvaar sewe posisionele argumente gevolg deur dinamiese filters: 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") Posisionele argumente verseker eenvoud, terwyl veranderlike filterpaaie buigsaam hanteer. shift 2.3 Pakketvalidering en -skepping : Vervang spasies in met onderstrepings om URL-kwessies te vermy. Ontsmet name PKG_NAME PKG_NAME=${PKG_NAME// /_} : Gebruik om pakkette via AEM se API te lys, om oortollige skeppings te vermy. Kontroleer bestaande pakkette curl 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 Dinamiese filterkonfigurasie Konstrueer 'n JSON-reeks filters vanaf invoerpaaie: FILTERS_PARAM="" for i in "${!FILTERS[@]}"; do FILTERS_PARAM+="{\"root\": \"${FILTERS[$i]}\", \"rules\": []}" # Adds commas between entries, but not after the last done : Voorbeeld uitset [{"root": "/content/dam"}, {"root": "/apps"}] Hierdie JSON word in die pakketdefinisie ingespuit via AEM se eindpunt. /crx/packmgr/update.jsp 2.5 Bou en laai werkvloei af : Begin samestelling met behulp van AEM se -opdrag: Bou die pakket build curl -X POST … -F "cmd=build" : Die skrip wag vir die bou om te voltooi voordat u voortgaan. Let wel : Gebruik om die te gaan haal en stoor dit met 'n tydstempel lêernaam: Aflaai curl .zip BK_FILE="$PKG_NAME-$(date +%Y%m%d-%H%M%S).zip" curl -o "$BK_FOLDER/$BK_FILE" ... 3. Fouthantering, Sekuriteitsnotas en aanteken Robuuste fouthantering en aanteken is van kritieke belang vir onbewaakte skrifte soos , om te verseker dat foute vroeg opgespoor en duidelik aangeteken word. Hier is hoe die skrif teen onverwagte kwessies beskerm en uitvoerbare insigte verskaf. create-remote-aem-pkg.sh 3.1 Tekenmeganisme : Die funksie voeg 'n voor elke boodskap voor, wat 'n ouditspoor vir ontfouting skep: Tydstempellogs _log [YYYY.MM.DD-HH:MM:SS] _log "Starting backup process..." # Output: [2023.10.25-14:30:45] Starting backup process... : Tydstempels help om skrifaktiwiteit te korreleer met AEM-bedienerlogboeke of eksterne gebeurtenisse (bv. cron-werkskedules). Hoekom dit saak maak : Kritiese stappe, soos pakketskepping, filteropdaterings en aflaaie, word uitdruklik aangeteken om vordering na te spoor. Uitgebreide uitvoer 3.2 Foutvalideringswerkvloei : Voorvlugkontroles Bekragtig die bestaan van die rugsteunlêer ( ) voordat u voortgaan: BK_FOLDER if [ ! -d "$BK_FOLDER" ]; then _log "Backup folder '$BK_FOLDER' does not exist!" && exit 1 fi Sanitiseer om URL-kwessies te vermy (bv. spasies vervang met onderstrepe). PKG_NAME : API-antwoordbekragtiging Die -funksie ondersoek beide dopuitgangskodes ( ) en AEM API-antwoorde: check_last_exec $? check_last_exec "Error message" "$CURL_OUTPUT" $CURL_STATUS : Nie-nul waardes (bv. ) veroorsaak onmiddellike uitgange. Uittreekodes curl : Bespeur JSON-antwoorde of "HTTP-FOUT"-stringe in AEM-uitvoer. API-foute success\":false : Wanneer die pakket afgelaai word, kyk die skrip vir 'n statuskode: 3.3 HTTP-statusverifikasie 200 if [ "$(curl -w "%{http_code}" ...)" -eq "200" ]; then # Proceed if download succeeds else _log "Error downloading the package!" && exit 1 fi 3.4 Algemene Mislukkingscenario's Ongeldige geloofsbriewe: vang antwoorde op en gaan uit met 'n duidelike foutboodskap. check_last_exec 401 Unauthorized Ongeldige filterpad: AEM API gee terug, die skrip registreer "Fout byvoeging van filters" en beëindig. success:false Skyf vol: Versuim om te skryf, kontroleer lêergrootte met vlag en waarskuwings voor jy verlaat. BK_FILE -s AEM-instansie onbereikbaar: uitgange met 'n nie-nul-kode, die skrip teken "Fout met die bou van die pakket". curl 3.5 Sekuriteitsoorwegings : Die skrip gebruik vir eenvoud, wat SSL-verifikasie oorslaan. : Vervang met om 'n CA-bundel te spesifiseer. SSL-sertifikaat-omseil curl -k Aanbeveling vir produksie --cacert : Geloofsbriewe word as argumente deurgegee, wat in proseslogboeke kan verskyn. : Gebruik omgewingsveranderlikes of 'n geheime kluis (bv. ). Plaintext Wagwoorde Versagting $AEM_PASSWORD 3.6 Ontfoutingswenke : Voeg tydelik by die skrif se begin by om uitgevoerde opdragte te druk. Aktiveer uitgebreide uitvoer set -x : Isoleer probleme deur kritieke -opdragte buite die skrif uit te voer Toets API-oproepe handmatig curl : Herlei skripuitvoer na 'n lêer vir latere ontleding: Inspekteer logs ./create-remote-aem-pkg.sh ... >> /var/log/aem_backup.log 2>&1 4. Pas die instrument aan by jou werkvloei Die -skrip is ontwerp om 'n beginpunt te wees - 'n fondasie wat jy kan verander om by jou span se behoeftes te pas. Hieronder is algemene aanpassings, tesame met implementeringsleiding, om die funksionaliteit daarvan uit te brei of aan te pas by spesifieke gebruiksgevalle. create-remote-aem-pkg.sh 4.1 Aanpassing van die rugsteunlêernaamformaat Die verstek lêernaam gebruik 'n tydstempel ( ). Verander dit om omgewingsname, projek-ID's of semantiese weergawe in te sluit: $PKG_NAME-$(date +%Y%m%d-%H%M%S).zip # 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" : Maak seker dat datum/tyd-formate karakters vermy wat in lêername verbode is (bv. dubbelpunte op Windows). Wenk : 4.2 Uitbreiding of wysiging van filters Die skrip aanvaar dinamiese paaie as filters, maar jy kan ook gereeld gebruikte paaie hardkodeer of uitsluitings byvoeg: # 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 Verbetering van sekuriteit : Vermy gewone teks wagwoorde Gebruik omgewingsveranderlikes of 'n geheime bestuurder om geloofsbriewe in te spuit: # 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) : Vervang (onseker) met 'n vertroude CA-sertifikaat: Dwing SSL-bekragtiging af curl -k curl --cacert /path/to/ca-bundle.crt -u "$USR":"$PWD" ... 4.4 Byvoeging van na-bou-aksies Brei die skrip uit om stroomaf-prosesse te aktiveer na 'n suksesvolle aflaai: # 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 Byvoeging van kennisgewingwaarskuwings Stel spanne in kennis van sukses/mislukking via Slack-, e-pos- of moniteringsinstrumente: # 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 admin@mycompany.com fi 5. Gevolgtrekking Die bestuur van AEM-pakkette hoef nie 'n handmatige, foutgevoelige taak te wees nie. Met die aem-pkg.sh-skrip kan u pakketskepping, -filtrering en -verspreiding omskep in 'n vaartbelynde, herhaalbare proses. Hierdie instrument gaan nie net oor tydbesparing nie, dit gaan daaroor om konsekwentheid, betroubaarheid en skaalbaarheid in jou AEM-bedrywighede moontlik te maak. create-remote-aem-pkg.sh Sleutel wegneemetes : Deur herhalende GUI-interaksies uit te skakel, verminder die skrif menslike foute en stel spanne vry om op take van hoër waarde te fokus. Outomatisering wen : Of u kritiese inhoud rugsteun, omgewings sinkroniseer of voorberei vir opdaterings, die skrif pas aan by uiteenlopende gebruiksgevalle met minimale aanpassings. Buigsaamheid maak saak : Ingeboude aantekening, foutkontroles en sekuriteitsoorwegings verseker dat die skrif voorspelbaar optree, selfs wanneer dinge sywaarts gaan. Veerkragtigheid is die sleutel Groot gereedskap word gebore uit werklike uitdagings. Hierdie draaiboek is 'n beginpunt; dink daaraan as 'n fondament om op voort te bou soos wat jou span se behoeftes groei. Of jy nou 'n solo-ontwikkelaar of deel van 'n groot DevOps-span is, outomatisering soos hierdie is 'n voorbeeld van hoe klein beleggings in kode buitensporige opbrengste in produktiwiteit en gemoedsrus kan oplewer. Gereed om die volgende stap te neem? 🛠️ : Pas die skrif aan deur as jou gids te gebruik. Pasmaak afdeling 6 🔍 : Gaan jou bestaande AEM-werkvloei na vir outomatiseringsgeleenthede. Oudit 🤝 : Mentor jou span of skryf 'n blogplasing oor jou wysigings. Deel Dankie dat jy saam volg - gaan nou voort en outomatiseer! 🚀 Bylaag Voltooi kode #!/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 Verwysings [¹] Om SSL-verifikasie oor te slaan met is handig om te toets, maar jy sal iets stewiger in produksie wil hê (byvoorbeeld )! curl -k --cacert [²] AEM Pakketbestuurder Amptelike Dokumentasie