jenkins – використання shared library

 

Jenkins Shared Libraryце механізм, який дозволяє створювати та використовувати багаторазовий код (бібліотеки) для ваших pipeline в Jenkins. Якщо говорити іншими словами тоді це функції загального використання або розширення.

Завдяки цьому механізму, можемо створити бібліотеки, які містять повторювані шаблони, функції, класи та інші компоненти. Це дозволяє централізовано керувати спільним кодом і забезпечує більшу повторюваність, швидкість розробки та покращення якості конфігураційного коду.

Коротко розглянемо варіант використання, де в спільних бібліотеках будемо розташовувати функції, потім їх використовувати, щоб уникнути дублювання коду.

Спочатку ознайомимось зі структурою:

(root)
+- src                     # Groovy source files
|   +- org
|       +- foo
|           +- Bar.groovy  # for org.foo.Bar class
+- vars
|   +- foo.groovy          # for global 'foo' variable
|   +- foo.txt             # help for 'foo' variable
+- resources               # resource files (external libraries only)
|   +- org
|       +- foo
|           +- bar.json    # static helper data for org.foo.Bar

детальніше:

  • src – Директорія використовується для складного коду Groovy, який має бути організований за принципами ООП. Вона має структуру директорій подібну до проєкту Java. Зазвичай ви використовуєте src директорію, якщо вам потрібно створити складнішу логіку, ніж просто виклик допоміжного методу з vars, в ній можна структурувати все по директоріях.
  • resources – використовується для не-Groovy файлів, які вам може знадобитись в вашій бібліотеці. Наприклад, ви можете використовувати цю директорію для зберігання файлів конфігурації, шаблонів або інших вихідних файлів, які ви хочете використовувати у своїх Jenkins pipeline.
  • vars – директорія використовується для глобальних змінних та допоміжних методів, які будуть використовуватись в Jenkins pipeline. Кожен файл Groovy в цій директорії вважається глобальною змінною, яку можна викликати прямо з Jenkinsfile. Наприклад, файл vars/myHelper.groovy стає глобальною змінною myHelper, яку можна викликати в Jenkinsfile.
В директорії vars файли можна або побудову функцій можемо розділити на два типи:
  • один файл — одна функція (описуємо одну велику функцію);
  • один файл — декілька функцій, викликати їх можемо окремо;

Детальніше про ці варіанти поговоримо нижче. 

Підключення бібліотеки

Логінимось в Jenkins, переходимо в Manage Jenkins > Configure System > Global Pipeline Libraries:

Тиснемо Add, заповнюємо:

Далі Save. Основну частину зроблено.

Використання

Щоб увімкнути бібліотеку потрібно на початку пайплайну додати наступне:

// бібліотеки будуть братися з вказаної вами гілки, тегу, інше
@Library('jenkins-libs@BRANCH_NAME' )_

// бібліотеки будуть братися з master гілки
@Library('jenkins-libs)_

Поговоримо далі саме про функції, створювати файли функцій будемо в директорії vars.

Один файл — одна функція

Створимо файл з назвою hello.groovy в якому використаємо метод def call, саму функцію будемо запускати з гіт гілки TEST:

def call(String name = 'NoName') {
    echo "Hello my little ${name}."
}

де: 

  • def call(String name = ‘NoName’) – викликаємо метод call, передаємо значення name;
  • echo “Hello my little ${name}.” – виведе повідомлення з переданим ім’ям. Якщо нічого не передавати, використовуватимуться значення за замовчуванням, а саме ‘NoName’;

Створимо пайплайн в якому будемо імпортувати загальну бібліотеку та викликати функцію. Назва створеного файлу відповідає назві функції (hello.groovy == hello):

@Library('jenkins-library@TEST')_
node('main') {
  stage('Test') {
    hello 'Geek'
  }
}

де:

  • hello ‘Geek’ — виклик функції з передаванням значення(в нашому випадку це ім’я)

запустимо завдання:

Running on main in /home/jenkins/workspace/TEST/test-jenkins-libs
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] echo
Hello, Geek.
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Один файл — декілька функцій

Гнучкіший варіант для використання, описуємо декілька функцій в одному файлі(згрупувати по завданнях або типах). В такому форматі ми можемо викликати потрібну функцію, а не виконувати всі відразу.

Для прикладу створимо файл з назвою common.groovy:

def whoami(){
    sh "whoami"
    return this
}

def sleep(){
    sleep 5
    return this
}

Описуємо пайплайн:

@Library('jenkins-library@TEST')_

node('main') {
    stage('Check WhoAreYou'){
        common.whoami()
    }
    stage('Sleep'){
        common.sleep()
    }
}

де:

  • common – назва файлу з функціями
  • .whoami() – ім’я функції


Запускаємо:

Running on main in /home/jenkins/workspace/TEST/test-jenkins-libs
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Check WhoAreYou)
[Pipeline] sh
+ whoami
jenkins
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Sleep)
[Pipeline] sleep
Sleeping for 5 sec
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Для того, щоб зберегти результат функції й потім його повторно використати, потрібно створити новий об’єкт, який буде містити результат виконання вказаної функції. Спочатку потрібно модифікувати основну whoami:

def whoami(){
    def test = sh(returnStdout: true, script:"whoami").trim()
    return test
}

def sleep(){
    sleep 5
    return this
}

де:

  • def test – новий об’єкт в середині функції;
  • returnStdout: true – повертаємо вивід;
  • script:”whoami” – скрипт, команда bash;
  • trim() – метод який прибирає пробіли;

Після чого описуємо пайплайн:

@Library('jenkins-library@TEST')_

node('main') {
    stage('Check WhoAreYou'){
        def funcResult = common.whoami()
        echo """${funcResult}"""
    }
    stage('Sleep'){
        common.sleep()
    }

}

Запускаємо, отримуємо результат:

Running on main in /home/jenkins/workspace/TEST/test-jenkins-libs
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Check WhoAreYou)
[Pipeline] sh
+ whoami
[Pipeline] echo
jenkins
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Sleep)
[Pipeline] sleep
Sleeping for 5 sec
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

На цьому все. Ознайомились зі спільними бібліотеками,  дізналися навіщо вони і як ними базово користуватися.

Посилання на тему

Click to rate this post!
[Total: 0 Average: 0]