Maven vie nielen zostaviť aplikáciu, ale nerobí mu problém ju aj nasadiť na server cez SCP a spustiť cez vzdialený shell akýkoľvek príkaz.
Nasadenie WARu na vzdialený Tomcat a jeho následný reštart je potom otázka jedného volania Mavenu.
Upload cez SSH
O upload sa postará plugin wagon-maven-plugin
. Nakonfigurujeme mu execution
,
v ktorom využijeme goal upload-single
s konfiguráciou:
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<id>default-cli</id>
<goals>
<goal>upload-single</goal>
</goals>
<configuration>
<serverId>kapsa.sk</serverId>
<fromFile>${project.build.directory}/${project.build.finalName}.${project.packaging}</fromFile>
<url>scp://kapsa.sk/home/novotnyr</url>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>2.5</version>
</extension>
</extensions>
Čo s jednotlivými blokmi?
serverId
: odkaz dosettings.xml
, kde je uložený SSH login a heslo, prípadne odkaz na certifikát. Viac o tom nižšie.fromFile
: súbor, ktorý sa má uploadnúť. Uploadovať budeme vybudované JAR/WAR z adresára/target
url
: cieľová adresa reprezentujúca adresár na vzdialenom serveri. V našom prípade použijeme na upload protokolscp
na serverikapsa.sk
, kde uploadujeme do vzdialeného adresára/home/novotnyr
. Tento adresár reprezentuje linuxovú cestu od koreňa tamojšieho filesystému. V príklade uploadujeme súbor do domovského priečinka používateľanovotnyr
.scp://kapsa.sk/home/novotnyr
Okrem tejto konfigurácie potrebujeme dokonfigurovať konkrétneho providera, ktorý
vyrieši protokol pre transport súboru na server. Použijeme na to sekciu <extensions>
, kde nakonfigurujeme wagon-ssh
(ten sa postará nielen o SSH
ale aj o SCP).
Odkaz serverId
Pripojenie k SCP serveru vyžaduje prístupové prvky: typicky certifikát
alebo login/heslo. Tie nie je múdre nechávať v pom.xml
, ktoré je principiálne
verejné. Tieto údaje uvedieme do Mavenovských settings.xml
, ktoré sa
nachádzajú v domovskom priečinku používateľa, na ktorom spúšťame
Maven, v adresári .m2
(napr. c:\Users\novotnyr\.m2\settings.xml
)
Konfigurácia prístupu cez certifikát a privátny kľúč je nasledovná:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>kapsa.sk</id>
<username>deployment</username>
<privateKey>${user.home}/.ssh/id_rsa</privateKey>
<passphrase>nbusr123</passphrase>
</server>
</settings>
id
servera je deklarácia, ktorá sa musí zhodovať soserverId
v POMkuusername
je login používateľa na vzdialený server (linuxový login)privateKey
udáva cestu k SSH privátnemu kľúčupassphrase
udáva heslo k privátnemu kľúču
Alternatívna kombinácia je tiež username
/ password
, kde uvedieme
rovno heslo k serveru. (Heslá môžeme tiež šifrovať, viď dokumentácia Mavenu.)
Bug vo wagon-ssh
Pozor, vo wagon-ssh
verzie 2.6 a novšej je bug WAGON-410, ktorý odmieta načítať heslo
k privátnemu kľúču na niektorých Windowsoch. Verzia 2.5 s tým nemá problém.
Spustenie
mvn wagon:upload-single
Beh:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building maven-wagon-scp-demo 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- wagon-maven-plugin:1.0:upload-single (default-cli) @ maven-wagon-scp-demo ---
[INFO] Uploading: target\maven-wagon-scp-demo-1.0-SNAPSHOT.jar scp://kapsa.sk/home/novotnyr/maven-wagon-scp-demo-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.016 s
[INFO] Finished at: 2015-04-09T08:40:21+02:00
[INFO] Final Memory: 9M/154M
[INFO] ------------------------------------------------------------------------
Spúšťanie vzdialených príkazov
Na spúšťanie vzdialených príkazov cez SSH slúži goal sshexec
v plugine wagon
.
Deklarujme samostatný blok execution
:
<execution>
<id>execute-remotely</id>
<goals>
<goal>sshexec</goal>
</goals>
<configuration>
<serverId>kapsa.sk</serverId>
<url>scp://kapsa.sk/home/novotnyr</url>
<commands>
<command>date</command>
</commands>
<displayCommandOutputs>true</displayCommandOutputs>
</configuration>
</execution>
Konfigurácia:
serverId
je odkaz na prístupové prvky zosettings.xml
url
udáva lokáciu servera, na ktorý sa prihlásiťcommand
reprezentuje príkaz, ktorý chceme vzdialene spustiť. U nás spúšťame výpis aktuálneho času cez linuxovýdate
˛displayCommandOutputs
vynúti výpis výstupov vzdialených príkazov v mavenovskom logu (inak by sme dátum nevideli).
Spúšťanie goalov z konzoly
Staršie Maveny mali nešťastnú vlastnosť, že z konzoly bolo možné
púšťať pre daný plugin len jeden konkrétny goal, a to ten, ktorý
mal executionId
nastavený na default-cli
. U nás máme dva goaly:
upload-single
a sshexec
a teda by sme si museli vybrať, ktorý
nakonfigurujeme pre použitie z commandlineu.
Možnosti sú viaceré:
- použiť dva profily, pričom v jednom nakonfigurujeme
wagon
pre upload a v druhom pre vzdialené príkazy - upload na server nabindovať na fázu
install
a reštart nakonfigurovať pre explicitné spúšťanie. - použiť Maven 3.3.1 a novší, ktorý ruší obmedzenie pre jediné
executionId
Ak máme nový Maven, môžeme zavolať:
mvn wagon:upload-single wagon:sshexec@execute-remotely
kde execute-remotely
je názov executionId
, ktorý sa má spustiť.
Vzorový projekt
Ukážkový projekt je na Githube, v repe novotnyr/maven-wagon-scp-demo .