consdata.com
Blog techniczny Blog biznesowy Dział HR
EN
jenkins

Współdzielona biblioteka w Jenkins pipeline

author Dawid Kubiak
14 kwietnia 2021

W tym artykule zapoznamy się z mechanizmem bibliotek współdzielonych (Pipeline: Shared Groovy Libraries), które stanowią zależność do szeroko stosowanej wtyczki jenkinsowej pipelines (https://www.jenkins.io/doc/book/pipeline/).

Każdy z nas podczas modelowania procesów CI/CD spotkał się z pewnymi podobieństwami pomiędzy projektami. Niewątpliwie jednym z takich procesów może być release projektu. W naszej firmie prawie każdy projekt budowany jest przy użyciu mavena. Tym samym release takich projektów jest procesem bardzo zunifikowanym. W związku z tym jest to idealny kandydat, by zamknąć go w bibliotece, ustawić na półkę i używać, gdy zajdzie taka potrzeba.

Zakładając, że każdy projekt w procesie wydawniczym (pipeline) ma krok pod tytułem “release”, wówczas wystarczy, że zbudujemy współdzieloną bibliotekę, którą użyjemy w kroku bez zagłębiania się w sposób działania.

Biblioteka ma zapewnić nam:

  • podbicie wersje w POMie do stabilnej,
  • upload artefaktów (binarki) do repozytorium,
  • ustalenie nowej wersji developerskiej + commit do głównej gałęzi.

Tworzenie biblioteki w Jenkins pipeline

W nowo utworzonym repozytorium kodu tworzymy strukturę katalogów. W naszym przykładzie git@git.consdata/consdata-shared-lib

(projekt)
+- src
|  +- com.consdata.shared.library
|   +- VersionBumper.groovy  # klasa(pomocnicza) generuje wersje artefactu
+- vars
|  +- release.groovy # Definicja zmiennej ‘release’ dostępna z pipelinu

W ten sposób stworzyliśmy zmienną globalną o nazwie release. Aby można było ją wywołać bezpośrednio po nazwie wewnątrz Jenkins pipeline, definiujemy funkcję call.

//vars/release.groovy
import com.consdata.shared.library.VersionBumper

def call(String branchName, String gitCredentialId, String versionToBump) {

    def currentVersion = readMavenPom().getVersion()
    def bumper = new VersionBumper(currentVersion)

    releaseVersion = currentVersion.minus("-SNAPSHOT");
    snapshotVersion = bumper.bump(versionToBump)

    sh "mvn clean versions:set -DnewVersion=\"$releaseVersion\" -DgenerateBackupPoms=false"

    sshagent(credentials: [gitCredentialId]) {
        sh("git commit -a -m 'Release $releaseVersion'")
    }

    releaseShaCommit = sh(script: "git rev-parse HEAD", returnStdout: true).trim()
    echo "SHA Commit $releaseShaCommit"

    sh "mvn clean versions:set -DnewVersion=\"$snapshotVersion\"-SNAPSHOT -DgenerateBackupPoms=false"

    sshagent(credentials: [gitCredentialId]) {
        sh("git commit -a -m 'Snapshot $snapshotVersion'-SNAPSHOT")
        sh("git push origin HEAD:$branchName")
        sh("git checkout $releaseShaCommit")
    }

    sh "mvn clean deploy"

    sshagent(credentials: [gitCredentialId]) {
        sh("git tag $releaseVersion")
        sh("git push --tags")
    }
}

W kodzie powyżej wykorzystaliśmy klasę VersionBumper, która dostarcza nam funkcjonalność wyliczania nowej wersji. Na potrzeby tego artykułu, implementacja została pominięta.

Definiowanie biblioteki

Tak przygotowaną bibliotekę musimy dodać do Jenkinsa. Ponieważ biblioteka będzie stosowana globalnie na poziomie każdego projektu. Tym samym zdefiniujemy ją na najwyższym poziomie.

Zarządzaj Jenkinsem → Skonfiguruj system → Global Pipeline Libraries (Uwaga: Należy zweryfikować, czy plugin Jenkins pipeline: Shared Groovy Libraries - https://plugins.jenkins.io/workflow-cps-global-lib jest aktywny.)

Główne okno konfiguracji Jenkins

Sekcja konfiguracji pipeline-shard

Użycie w pipeline

Przechodzimy do ostatniego etapu wykorzystania biblioteki wewnątrz pliku Jenkinsfile.

@Library(['consdata-shared-lib']) _ //Adnotacja określająca nazwę biblioteki

pipeline {
    agent any
    stages {
        stage('Release') {
            steps {
                release("master", env.GIT_CREDENTIAL_ID, "MINOR")
                //nazwa 'release' wynika z konwencji,
                //jest to nazwa pliku w repozytorium biblioteki /vars/release.groovy
            }
        }
    }
}

Podsumowanie

W artykule zastosowaliśmy tylko niewielki wycinek mechanizmu współdzielonych bibliotek i wykorzystaliśmy go w Jenkins pipeline. Szerszy kontekst dostępny jest bezpośrednio w dokumentacji.

Najnowsze wpisy

  • Dostępność w PDF - dokumenty bez barier
  • Czy wiesz, że z pomocą @starting-style można animować elementy z display: none za pomocą samego CSS?
  • Czy wiesz, że w Angular 17 została wprowadzona alternatywa dla *ngSwitch?
Dołącz do nas

  • SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
    B2B 19 680 - 27 220 PLN netto
  • REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
    B2B 14 950 - 21 000 PLN netto
  • ZOBACZ WSZYSTKIE OGŁOSZENIA

newsletter

techniczny

Zapisz się

Podobne wpisy

post-image
WCAG

Dostępność w PDF - dokumenty bez barier

author
Kacper Hoffman 28 kwi 2025
post-image
angular

Czy wiesz, że z pomocą @starting-style można animować elementy z display: none za pomocą samego CSS?

author
Piotr Tatarski 7 kwi 2025
post-image
angular

Czy wiesz, że w Angular 17 została wprowadzona alternatywa dla *ngSwitch?

author
Dorian Mejer 10 mar 2025
Dołącz do nas

  • SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
    B2B 19 680 - 27 220 PLN netto
  • REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
    B2B 14 950 - 21 000 PLN netto
  • ZOBACZ WSZYSTKIE OGŁOSZENIA

Zapisz się na

newsletter

techniczny

consdata.com
  • Kontakt

    • sales@consdata.com
    • +48 61 41 51 000

  • Biuro

    • K9Office
      Krysiewicza 9/14
      61-825 Poznań
      Polska

  • Rozwiązania

    • Eximee
    • Kouncil
  • Blog Dołącz do nas
Copyright © 2024 Consdata. All rights reserved. Privacy Policy & Cookies
Chcemy używać plików cookie oraz skryptów podmiotów trzecich do polepszania funkcjonowania tej strony Zgadzam się