Lär dig hur AEM byggs med Maven och de standarder du måste följa när du skapar ditt eget projekt.
För att byggas och driftsättas med Cloud Manager måste AEM följa dessa riktlinjer:
pom.xml
-filen i Git-databasens rot. Detta pom.xml
filen kan referera till så många undermoduler (som i sin tur kan ha andra undermoduler osv.) vid behov.pom.xml
filer.
.zip
filer som finns i en katalog med namnet target
.
.zip
filer (finns även i katalogen med namnet target
), som har kataloger med namn conf
och conf.d
.I vissa begränsade fall kan du behöva ändra din byggprocess något när du kör i Cloud Manager i stället för när du kör på arbetsstationer för utvecklare. I dessa fall Maven profiles kan användas för att definiera hur bygget ska vara olika i olika miljöer, inklusive Cloud Manager.
Aktivering av en Maven-profil i Cloud Manager-byggmiljön bör göras genom att leta efter CM_BUILD
systemvariabel. På samma sätt bör en profil som bara är avsedd att användas utanför Cloud Manager-byggmiljön göras genom att leta efter denna variabel som saknas.
Om du till exempel bara vill visa ett enkelt meddelande när bygget körs i Cloud Manager gör du det här.
<profile>
<id>cmBuild</id>
<activation>
<property>
<name>env.CM_BUILD</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>initialize</phase>
<configuration>
<target>
<echo>I'm running inside Cloud Manager!</echo>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
Om du vill testa den här profilen på en arbetsstation för utvecklare kan du antingen aktivera den på kommandoraden (med -PcmBuild
) eller i den integrerade utvecklingsmiljön.
Och om du bara vill få ut ett enkelt meddelande när bygget körs utanför Cloud Manager gör du det här.
<profile>
<id>notCMBuild</id>
<activation>
<property>
<name>!env.CM_BUILD</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>initialize</phase>
<configuration>
<target>
<echo>I'm running outside Cloud Manager!</echo>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
Artefakter från en lösenordsskyddad Maven-databas bör endast användas med försiktighet eftersom kod som distribueras via den här mekanismen för närvarande inte kan köras i alla regler för kodkvalitet implementeras i Cloud Managers kvalitetsportar. Därför bör det endast användas i sällsynta fall och för kod som inte är knuten till AEM. Du bör också distribuera Java-källorna samt hela projektets källkod tillsammans med binärfilen.
Så här använder du en lösenordsskyddad Maven-databas i Cloud Manager:
.cloudmanager/maven/settings.xml
i Git-databasen, som följer Maven Settings-fil schema.När Cloud Manager-byggprocessen startar:
<servers>
-elementet i den här filen kommer att sammanfogas med standardvärdet settings.xml
som tillhandahålls av Cloud Manager.
adobe
och cloud-manager
betraktas som reserverade och bör inte användas av anpassade servrar.central
kommer aldrig att speglas av Cloud Manager.<repository>
och/eller <pluginRepository>
-element inuti pom.xml
-fil.<repository>
och/eller <pluginRepository>
-element finns inuti en Cloud Manager-specifik profiläven om det inte är absolut nödvändigt.Låt oss till exempel säga att databasen är https://repository.myco.com/maven2
bör användarnamnet Cloud Manager använda cloudmanager
och lösenordet är secretword
. Du gör så här:
Ange lösenordet som en hemlighet i pipeline.
$ aio cloudmanager:set-pipeline-variables PIPELINEID --secret CUSTOM_MYCO_REPOSITORY_PASSWORD secretword`
Referera detta från .cloudmanager/maven/settings.xml
-fil.
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="https://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>myco-repository</id>
<username>cloudmanager</username>
<password>${env.CUSTOM_MYCO_REPOSITORY_PASSWORD}</password>
</server>
</servers>
</settings>
Referera slutligen till server-ID:t i pom.xml
fil:
<profiles>
<profile>
<id>cmBuild</id>
<activation>
<property>
<name>env.CM_BUILD</name>
</property>
</activation>
<repositories>
<repository>
<id>myco-repository</id>
<name>MyCo Releases</name>
<url>https://repository.myco.com/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>myco-repository</id>
<name>MyCo Releases</name>
<url>https://repository.myco.com/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
Det är en god vana att driftsätta Java-källorna tillsammans med binärfilen i en Maven-databas.
Det gör du genom att konfigurera maven-source-plugin i projektet.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
Det är en god vana att driftsätta hela projektkällan tillsammans med binärfilen i en Maven-databas. Detta gör att den exakta artefakten kan återskapas.
Det gör du genom att konfigurera maven-assembly-plugin i ditt projekt.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>project-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>project</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
I Cloud Manager kan byggen producera valfritt antal innehållspaket. Det kan av olika skäl vara önskvärt att skapa ett innehållspaket men inte distribuera det. Ett exempel kan vara när innehållspaket som bara används för testning skapas eller som paketeras om med ett annat steg i byggprocessen, dvs. som ett underpaket till ett annat paket.
För att hantera dessa scenarier söker Cloud Manager efter egenskapen cloudManagerTarget
i egenskaperna för de byggda innehållspaketen. Om den här egenskapen är inställd på none
, hoppas paketet över och distribueras inte.
Mekanismen för att ange den här egenskapen beror på hur bygget skapar innehållspaketet. Med filevault-maven-plugin
konfigurerar du plugin-programmet enligt följande.
<plugin>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>filevault-package-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<properties>
<cloudManagerTarget>none</cloudManagerTarget>
</properties>
<!-- other configuration -->
</configuration>
</plugin>
The content-package-maven-plugin
har en liknande konfiguration.
<plugin>
<groupId>com.day.jcr.vault</groupId>
<artifactId>content-package-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<properties>
<cloudManagerTarget>none</cloudManagerTarget>
</properties>
<!-- other configuration -->
</configuration>
</plugin>
I många fall distribueras samma kod till flera AEM miljöer. Om det är möjligt kommer Cloud Manager att undvika att återskapa kodbasen när det upptäcker att samma Git-implementering används i flera fullständiga pipeline-körningar.
När en körning startas extraheras den aktuella HEAD-implementeringen för förgreningsflödet. Hash för implementeringen visas i användargränssnittet och via API:t. När byggsteget har slutförts lagras de resulterande artefakterna baserat på den implementeringshashen och kan återanvändas i efterföljande pipeline-körningar.
Paket återanvänds i alla rörledningar om de ingår i samma program. När du söker efter paket som kan återanvändas ignorerar AEM grenar och återanvänder artefakter över grenar.
När en återanvändning sker ersätts stegen för bygg- och kodkvalitet effektivt med resultaten från den ursprungliga körningen. Loggfilen för byggsteget innehåller artefakter och körningsinformation som användes för att skapa dem från början.
Här följer ett exempel på sådana loggutdata.
The following build artifacts were reused from the prior execution 4 of pipeline 1 which used commit f6ac5e6943ba8bce8804086241ba28bd94909aef:
build/aem-guides-wknd.all-2021.1216.1101633.0000884042.zip (content-package)
build/aem-guides-wknd.dispatcher.cloud-2021.1216.1101633.0000884042.zip (dispatcher-configuration)
Loggen för kodkvalitetssteget innehåller liknande information.
Tänk på att ditt program har två utvecklingspipelines:
foo
bar
Båda grenarna har samma implementerings-ID.
Programmet har två grenar:
foo
bar
Båda grenarna har samma implementerings-ID.
foo
.bar
.I det här fallet är artefakten från foo
kommer att återanvändas för produktionsflödet eftersom samma implementeringshash identifierades.
Om du vill kan återanvändningsbeteendet inaktiveras för specifika rörledningar genom att ange rörledningsvariabeln CM_DISABLE_BUILD_REUSE
till true
. Om den här variabeln är inställd extraheras fortfarande implementeringshashen och de resulterande artefakterna lagras för senare användning, men eventuella tidigare lagrade artefakter återanvänds inte. Tänk på följande scenario om du vill förstå det här beteendet.
becdddb
. Körningen är klar och de resulterande artefakterna sparas.CM_DISABLE_BUILD_REUSE
variabeln är inställd.becdddb
, används de inte på grund av CM_DISABLE_BUILD_REUSE
variabel.f6ac5e6
. Körningen är klar och de resulterande artefakterna sparas.CM_DISABLE_BUILD_REUSE
variabeln tas bort.f6ac5e6
, återanvänds dessa artefakter.CM_DISABLE_BUILD_REUSE
tas inte med i beräkningen när Cloud Manager bestämmer sig för att återanvända tidigare skapade byggartefakter.