Java >> Java-zelfstudie >  >> Java

Zelfstudie:maak een Jenkins-plug-in om Jenkins en Nexus Repository te integreren

  • Deel I:maak je eerste Jenkins-plug-in
  • Deel II:Nexus Repository installeren en configureren
  • Deel III:Integreer Jenkins en Nexus met een aangepaste Jenkins-plug-in

In dit artikel leert u hoe u een Jenkins CI-plug-in schrijft en hoe u de REST API uit de Sonatype Nexus-repository gebruikt. Ik gebruik Maven en Jersey (JAX-RS) voor het project. De volledige broncode wordt gehost op github [2]. Ik hoop dat deze blog je zal aanmoedigen om je eigen Jenkins-plug-ins te schrijven en deze met de community te delen. Veel plezier.

Er komt een moment in het leven van elke ontwikkelaar dat je je eigen extensie, add-on of plug-in moet schrijven bij het gebruik van open source software. In mijn geval was ik op zoek naar een manier om de Continuous Delivery Pipeline te verbeteren die we hebben opgezet met behulp van de Jenkins CI-server en de Build Pipeline Plugin in een eerdere blogserie [1]. Ik wilde met name extra metadata toevoegen aan de geïmplementeerde artefacten na elke succesvolle bouwstap. Dit blogartikel begeleidt u bij het maken van een Jenkins-plug-in. Daarna zullen we de plug-in verbeteren om wat echt werk te doen en aangepaste metadata toevoegen aan het artefact in de Nexus-repository. Het volgende diagram toont de verschillende stappen in de build-pijplijn (CommitStage, AcceptanceTestStage, PerformanceTestStage). De CommitStage bouwt het softwareartefact en implementeert het op Nexus. Na elke succesvolle buildstap worden metadata toegevoegd aan het geïmplementeerde artefact, d.w.z. commitStage=success .


Deel I:maak je eerste Jenkins-plug-in

Maak projectskelet

Om te beginnen kunt u de maven-hpi-plugin gebruiken om de projectblauwdruk te maken. Ik neem aan dat je een werkende versie van Maven hebt geïnstalleerd, evenals de Java JDK. Om de maven-hpi-plug-in te gebruiken, moet u het volgende toevoegen aan uw Maven-instellingen.xml die u vindt onder $HOME/.m2/settings.xml

<settings>
  <pluginGroups>
    <pluginGroup>org.jenkins-ci.tools</pluginGroup>
  </pluginGroups>
  <profiles>
    <profile>
      <id>jenkins</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <repositories>
        <repository>
          <id>repo.jenkins-ci.org</id>
          <url>http://repo.jenkins-ci.org/public/</url>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>repo.jenkins-ci.org</id>
          <url>http://repo.jenkins-ci.org/public/</url>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
</settings>

org.jenkins-ci.tools jenkins true repo.jenkins-ci.org http://repo.jenkins-ci.org/public/ repo.jenkins-ci.org http://repo.jenkins-ci.org/public/

Als u klaar bent met de configuratie, kunt u het projectskelet maken met behulp van de hpi:create commando.

$ mvn -cpu hpi:create

$ mvn -cpu hpi:create

Als je problemen hebt met de nieuwste versie van de plug-in, kun je ook de versie van de plug-in opgeven die je wilt gebruiken.

$ mvn -cpu org.jenkins-ci.tools:maven-hpi-plugin:1.84:create

$ mvn -cpu org.jenkins-ci.tools:maven-hpi-plugin:1.84:create

Tijdens de installatie zal Maven u om de groupId en artifactId vragen.

Enter the groupId of your plugin: de.mb
...
Enter the artifactId of your plugin: nexus-metadata-plugin
...

Voer de groupId van uw plug-in in:de.mb ... Voer de artifactId van uw plug-in in:nexus-metadata-plugin ...

Het gegenereerde project moet de volgende lay-out hebben. Jenkins gebruikt Apache Jelly als weergavetechnologie.

marcelbirkner@ubuntu:~/workspaces/jenkins/nexus-metadata-plugin$ tree
.
├── pom.xml
└── src
    └── main
        ├── java
        │   └── de
        │       └── mb
        │           └── HelloWorldBuilder.java
        └── resources
            ├── de
            │   └── mb
            │       └── HelloWorldBuilder
            │           ├── config.jelly
            │           ├── global.jelly
            │           ├── help-name.html
            │           └── help-useFrench.html
            └── index.jelly

marcelbirkner@ubuntu:~/workspaces/jenkins/nexus-metadata-plugin$ tree . ├── pom.xml └── src └── main ├── java │ └── de │ └── mb │ └── HelloWorldBuilder.java └── bronnen ├── de │ └── mb │ └ ── HelloWorldBuilder │ ├── config.jelly │ ├── global.jelly │ ├── help-name.html │ └── help-useFrench.html └── index.jelly

Nadat het projectskelet is opgezet, kunt u de plug-in compileren en verpakken.

$ cd nexus-metadata-plugin
$ mvn package

$ cd nexus-metadata-plugin $ mvn-pakket

Na het inpakken van de plug-in zou je een .hpi . moeten vinden bestand in de doelmap.

Plaats plug-in in Jenkins

Om de nieuwe plug-in te testen, moet Jenkins actief zijn.

Update:gebruik mvn hpi:run en Jenkins start automatisch met uw plug-in klaar voor gebruik.

Een andere manier om Jenkins aan de gang te krijgen, is door het WAR-bestand van de Jenkins-mirrors [4] te downloaden en te starten met:

java -jar jenkins.war

java -jar jenkins.war

Zodra Jenkins actief is, kunt u uw plug-in implementeren.

  • Ga naar http://localhost:8080/
  • Jenkins beheren -> Plug-ins beheren -> Geavanceerd -> Plug-in uploaden
  • Selecteer nexus-metadata-plugin/target/nexus-metadata-plugin.hpi en upload naar de Jenkins-server
  • Klik op "Nu downloaden en installeren na opnieuw opstarten"
  • Herstart Jenkins

De plug-in zou beschikbaar moeten zijn nadat Jenkins opnieuw is opgestart. Nu kun je de plug-in gaan configureren.

  • Jenkins-menu -> Jenkins beheren -> Systeem configureren

U vindt een sectie die lijkt op het volgende diagram. De plug-in zal "Hello World" afdrukken als u deze uitvoert tijdens een bouwstap. U kunt configureren of het u in het Engels of Frans moet begroeten door het selectievakje aan te vinken.

Testplug-in

Om uw nieuwe plug-in te testen, moet u deze stappen volgen:

  • Maak een nieuwe Jenkins-baan (d.w.z. Freestyle)
  • Voeg bouwstap "Zeg hallo wereld" toe aan de taak
  • Vul het naamveld in bij de bouwstap
  • Baan opbouwen
  • Controleer opdrachtregel van taak

Als de build is gelukt en je ziet "Hello, World!" in de commandoregel is alles in orde. Begin anders vanaf het begin met lezen en probeer het opnieuw 😉 of raadpleeg de officiële Jenkins Plugin-documentatie [3].

Deel II:Nexus Repository installeren en configureren

Voor het toevoegen van aangepaste metadata aan artefacten in de Nexus Repository is Nexus Professional vereist. Een andere Open Source Repository die dezelfde functionaliteit biedt, is Artifactory van JFrog. Beide bieden een REST API en een professionele versie. In beide gevallen heb je de Pro-versie nodig om metadata aan artefacten toe te voegen.

Nexus instellen

Volg deze stappen om Nexus in te stellen:

  • Download Nexus Pro van Sonatype, http://www.sonatype.com/Products/Nexus-Professional/Purchase/Free-Trial
  • Het archief uitpakken
  • De nexus-custom-metadata-plugin is standaard niet ingeschakeld. Om het in te schakelen, kopieer het naar de plugin-repository map.

cp -r nexus-professional-trial-2.0.6/nexus/WEB-INF/optional-plugins/nexus-custom-metadata-plugin-2.0.6/ 
      nexus-professional-trial-2.0.6/nexus/WEB-INF/plugin-repository/

cp -r nexus-professional-trial-2.0.6/nexus/WEB-INF/optionele-plugins/nexus-custom-metadata-plugin-2.0.6/ nexus-professional-trial-2.0.6/nexus/WEB-INF /plugin-repository/

  • Nexus starten

nexus-professional-trial-2.0.6/bin$ ./nexus start

nexus-professional-trial-2.0.6/bin$ ./nexus start

  • Open Nexus in uw browser en registreer voor de 14-daagse proefversie, http://localhost:8081/nexus
  • U ontvangt binnen een minuut een e-mail met de proefregistratiecode via e-mail
  • Aanmelden met admin/admin123

Om te controleren of de nexus-custom-metadata-plugin is succesvol geïnstalleerd ga naar Beheer -> Plugin Console . Daar zou u de volgende informatie moeten zien. Als u op de links klikt, wordt u doorgestuurd naar de REST API van de plug-in.

  • Nexus Professional-plug-in ::Aangepaste metagegevens
  • http://localhost:8081/nexus/nexus-custom-metadata-plugin/m2/docs/index.html

Onder dezelfde sectie vindt u ook de kerndocumentatie. Die bevat de Core REST API-aanroepen die u standaard kunt gebruiken. Helaas staat die API je niet toe om metadata voor artefacten op te slaan.

  • Nexus:kernplug-ins:kerndocumentatie
  • http://localhost:8081/nexus/nexus-core-documentation-plugin/core/docs/index.html

Maven-project instellen

Onder de REST API-documentatie vindt u een client.jar die alle REST-modellen biedt die we nodig hebben om de REST API aan te roepen. Download daarom de JAR en upload deze naar de externe repository in Nexus.

  • Downloaden van:http://localhost:8081/nexus/nexus-custom-metadata-plugin/m2/docs/nexus-custom-metadata-plugin-client.jar

Vervolgens moet u uw Maven $HOME/.m2/settings.xml . configureren om Nexus te gebruiken voor het oplossen van Maven-artefacten. Voeg de volgende regels toe aan de settings.xml .

  <mirrors>
    <mirror>
      <!--This sends everything else to /public -->
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <url>http://localhost:8081/nexus/content/groups/public</url>
    </mirror>
  </mirrors>
  <profiles>
    <profile>
      <id>nexus</id>
      <!--Enable snapshots for the built in central repo to direct -->
      <!--all requests to nexus via the mirror -->
      <repositories>
        <repository>
          <id>central</id>
          <url>http://central</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </repository>
      </repositories>
     <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <url>http://central</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
  <activeProfiles>
    <!--make the profile active all the time -->
    <activeProfile>nexus</activeProfile>
  </activeProfiles>

nexus * http://localhost:8081/nexus/content /groups/public nexus central http://central true true central http://central true true nexus

Daarna zijn we klaar om de plug-in te ontwikkelen.

Deel III:Integreer Jenkins en Nexus met een aangepaste Jenkins-plug-in

Nu we Jenkins en Nexus in gebruik hebben, kunnen we teruggaan om wat te coderen. Ik raad je aan de code uit mijn github-repository te klonen. Ik zal alle wijzigingen die ik heb aangebracht stap voor stap uitleggen.

Afhankelijkheden toevoegen

Voor het aanroepen van de Nexus REST API's heb ik besloten om het Jersey Framework te gebruiken. Voeg eenvoudig de volgende afhankelijkheden toe aan uw pom.xml .

<dependency>
	<groupId>com.sun.jersey</groupId>
	<artifactId>jersey-client</artifactId>
	<version>1.12</version>
</dependency>
<dependency>
	<groupId>org.sonatype.nexus</groupId>
	<artifactId>nexus-rest-api-model</artifactId>
	<version>2.0.6</version>
</dependency>
<dependency>
	<groupId>org.sonatype.nexus</groupId>
	<artifactId>nexus-custom-metadata-plugin-client</artifactId>
	<version>1.0</version>
</dependency>

com.sun.jersey jersey-client 1.12 org.sonatype.nexus nexus-rest-api-model 2.0.6 org.sonatype.nexus nexus- aangepaste-metadata-plugin-client 1.0

Metadata-plug-in configureren

Hernoem de HelloWorldBuilder pakketten onder src/main/java en src/main/resources naar NexusMetadataBuilder .

Om de Jenkins-plug-in configureerbaar te maken, voegt u de volgende regels toe aan de global.jelly . Hierdoor kunnen we de Nexus-URL en inloggegevens opgeven in de Jenkins-configuratie.

  <f:section title="Nexus Metadata">
	<f:entry title="Nexus URL" field="nexusUrl"
      description="Add Nexus URL">
      <f:textbox />
    </f:entry>
	<f:entry title="User" field="nexusUser"
      description="Add Nexus User">
      <f:textbox />
    </f:entry>
    <f:entry title="Password" field="nexusPassword"
      description="Add Nexus Password">
      <f:textbox />
    </f:entry>
  </f:section>

In de volgende stap voegen we enkele velden toe die we op de Job kunnen configureren. We moeten de plug-in kunnen vertellen welke sleutel/waarde we willen opslaan met het artefact en de locatie van het artefact in de Nexus-repository (groupId, artifactId, version, packaging).

  <f:entry title="Key" field="key">
    <f:textbox />
  </f:entry>
  <f:entry title="Value" field="value">
    <f:textbox />
  </f:entry>
  <f:entry title="groupId" field="groupId">
    <f:textbox />
  </f:entry>
    <f:entry title="artifactId" field="artifactId">
    <f:textbox />
  </f:entry>
    <f:entry title="version" field="version">
    <f:textbox />
  </f:entry>
  <f:entry title="packaging" field="packaging">
    <f:textbox />
  </f:entry>

Nu kunnen we de NexusMetadataBuilder.java . maken [5] klasse die alle stukjes bij elkaar zal leggen. Deze klasse zorgt voor het lezen van de plug-inconfiguratie (NexusUrl &Credentials) evenals de configuratie van de Build Job (groupId, artifactId, version, packaging). In perform Method creëren we de REST-client die de Nexus REST API aanroept. De eerste aanroep gebruikt de Nexus Core API en controleert de status van Nexus. Het zou "200 OK" moeten retourneren wanneer het in gebruik is. Het REST-koppelpunt is:/service/local/status

// setup REST-Client
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
client.addFilter( new HTTPBasicAuthFilter(user, password) ); 
WebResource service = client.resource( url );
 
listener.getLogger().println("Check that Nexus is running");
String nexusStatus = service.path("service").path("local").path("status").accept(MediaType.APPLICATION_JSON).get(ClientResponse.class).toString();
listener.getLogger().println(nexusStatus + "\n");

// setup REST-Client ClientConfig config =nieuwe DefaultClientConfig (); Client client =Client.create(config); client.addFilter (nieuwe HTTPBasicAuthFilter (gebruiker, wachtwoord)); WebResource-service =client.resource (url); listener.getLogger().println("Controleer of Nexus actief is"); String nexusStatus =service.path("service").path("local").path("status").accept(MediaType.APPLICATION_JSON).get(ClientResponse.class).toString(); listener.getLogger().println(nexusStatus + "\n");

Voor de plug-in voor aangepaste metadata moeten we het "onderwerp" (locatie van het artefact) coderen met Base64, wat naar mijn mening niet echt REST is. Het REST-koppelpunt is:/service/local/index/custom_metadata/{repository}/{subject}

String artefact = "urn:maven/artifact#"+getGroupId()+":"+getArtifactId()+":"+getVersion()+"::"+getPackaging()+"";
listener.getLogger().println("GET metadata for artefact " + artefact);
String encodedString = new String( Base64.encode( artefact.getBytes() ) );
 
listener.getLogger().println("POST: add new metadata to artefact " + artefact);
CustomMetadataRequest customRequest = getCustomMetadataRequest( getKey(), getValue() );
 
service.path("service").path("local").path("index").path("custom_metadata").path("releases")
.path(encodedString).accept( MediaType.APPLICATION_JSON ).post( customRequest );

String artefact ="urn:maven/artifact#"+getGroupId()+":"+getArtifactId()+":"+getVersion()+"::"+getPackaging()+""; listener.getLogger().println("GET metadata voor artefact" + artefact); String encodedString =nieuwe String (Base64.encode( artefact.getBytes() )); listener.getLogger().println("POST:voeg nieuwe metadata toe aan artefact" + artefact); CustomMetadataRequest customRequest =getCustomMetadataRequest( getKey(), getValue()); service.path("service").path("local").path("index").path("custom_metadata").path("releases") .path(encodedString).accept( MediaType.APPLICATION_JSON ).post (aangepast verzoek);

Bouw plug-in van Github

Als u het project vanuit Github wilt bouwen, volgt u deze stappen:

[email protected]:marcelbirkner/nexus-metadata-plugin.git
cd nexus-metadata-plugin
mvn clean package

[email protected]:marcelbirkner/nexus-metadata-plugin.git cd nexus-metadata-plugin mvn schoon pakket

Daarna vindt u de nexus-metadata-plugin.hpi plug-in in de /target map. Zodra u de plug-in implementeert en elke buildstap van de continue leverings-buildpijplijn configureert, heeft het geïmplementeerde artefact in Nexus de metadata bijgevoegd, zie diagram.

Samenvatting

Dit is een lange tutorial geweest, maar ik heb geprobeerd de belangrijkste stappen te bespreken. Ik hoop dat je een beetje kunt leren en je aangemoedigd voelt om te beginnen met het schrijven en delen van je eigen Jenkins-plug-ins. Bekijk de Jenkins CI-homepage voor informatie over het bijdragen van plug-ins aan de community.

Referenties

[1] Continuous Delivery Pipeline, Continuous Delivery in the cloud
[2] Broncode op github, https://github.com/marcelbirkner/nexus-metadata-plugin.
[3] Jenkins Plugin Tutorial, https://wiki.jenkins-ci.org/display/JENKINS/Plugin+tutorial
[4] Jenkins downloaden, http://mirrors.jenkins-ci.org/war/latest/jenkins.war
[5] NexusMetadataBuilder, nexus-metadata-plugin @ github


Java-tag