Maven Wagon: upload artefaktov cez SCP i vzdialené spúšťanie príkazov

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 do settings.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 protokol scp na serveri kapsa.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ľa novotnyr.

    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ť so serverId v POMku
  • username je login používateľa na vzdialený server (linuxový login)
  • privateKey udáva cestu k SSH privátnemu kľúču
  • passphrase 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 zo settings.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 .

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *