Perpustakaan Bersama Jenkins: apakah mungkin meneruskan argumen ke skrip shell yang diimpor sebagai 'libraryResource'?

Saya memiliki pengaturan berikut:

(Dihapus) Jenkinsfile:

@Library('my-custom-library') _

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                printHello name: 'Jenkins'
            }
        }
    }
}

perpustakaan-kustom-saya/resources/com/org/scripts/print-hello.sh:

#!/bin/bash

echo "Hello, $1"

perpustakaan-kustom-saya/vars/printHalo.groovy:

def call(Map parameters = [:]) {
    def printHelloScript = libraryResource 'com/org/scripts/print-hello.sh'
    def name = parameters.name
    //the following line gives me headaches
    sh(printHelloScript(name))
}

Saya mengharapkan Hello, Jenkins, tetapi menimbulkan pengecualian berikut:

groovy.lang.MissingMethodException: Tidak ada tanda tangan metode: java.lang.String.call() berlaku untuk tipe argumen: (java.lang.String) nilai: [Jenkins]

Solusi yang mungkin: wait(), any(), wait(long), split(java.lang.String), take(int), masing-masing(groovy.lang.Closure)

Jadi, apakah mungkin melakukan sesuatu seperti dijelaskan di atas, tanpa mencampurkan kode Groovy dan Bash?


person ebu_sho    schedule 14.11.2018    source sumber
comment


Jawaban (1)


Ya, lihat withEnv

Contoh yang mereka berikan seperti;

node {
  withEnv(['MYTOOL_HOME=/usr/local/mytool']) {
    sh '$MYTOOL_HOME/bin/start'
  }
}

Lebih cocok untuk Anda:

// resources/test.sh
echo "HI here we are - $PUPPY_DOH --"

// vars/test.groovy
def call() {
   withEnv(['PUPPY_DOH=bobby']) {
    sh(libraryResource('test.sh'))
  }
}

Cetakan:

[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] libraryResource
[Pipeline] sh
+ echo HI here we are - bobby --
HI here we are - bobby --
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }

Dengan menggunakan itu, Anda bisa meneruskannya menggunakan variabel bernama tercakup, kira-kira seperti

def call(Map parameters = [:]) {
    def printHelloScript = libraryResource 'com/org/scripts/print-hello.sh'
    def name = parameters.name
    withEnv(['NAME=' + name]) { // This may not be 100% syntax here ;)
    sh(printHelloScript)
}

// print-hello.sh
echo "Hello, $name"
person chrisb    schedule 28.01.2019
comment
Anda dapat menggunakan withEnv(["NAME=${name}"]) (perhatikan tanda kutip ganda). Anda mungkin juga ingin keluar dari konten variabel terlebih dahulu. - person iliis; 04.11.2020