LoginSignup
4
3

More than 5 years have passed since last update.

Pipelineプラグインで共通ライブラリを利用する 時の地雷

Last updated at Posted at 2016-07-08

この情報はすでに古いです。

設定ファイルを読み込みたいのであればreadPropertiseやreadYamlやその他のステップを使いましょう。

共通ライブラリは、jenkinsの管理画面からリポジトリ既に設定できるようになっています。

ここから本題

Jenkins2でデフォルトで入っているこれの話

Pipeline Shared Groovy Libraries Plugin
https://github.com/jenkinsci/workflow-cps-global-lib-plugin

幾つかはまったのでその共有とか書き書きしておきます。
ある程度は公式読めばOKですが、設置の段階で1日潰しました…

設置

共有ライブラリの設置方法は以下のurlからgit cloneできることとかいうかなり制限のついた形になっています。

*ssh://USERNAME@server:PORT/workflowLibs.git(SSH Pluginでやれと)
*http://LOCATION/workflowLibs.git(LOCATIONはjenkinsのurl)

まずsshの方は設定方法わけわからんかったのでそっ閉じしました。

で httpの方なのですがこちらも
は?どうやってアクセスさせるの?設定書き書きするのhtaccessなにそれおいしいの?
とかウンウン調べていたら

こんな答えがありました。
https://github.com/cloudbees/jenkins-scripts/blob/master/pipeline-global-lib-init.groovy
これはjenkinsのスクリプトコンソールから入れれば動きます。

ようは、
JENKINS_HOME/workflow-libs
というディレクトリにgitリポジトリがあればokです。
これかなりはまったんですけれどworkflowLibsというディレクトリでもworkflowLibs.gitでもなく
workflow-libsでした…

実際に
$ git clone http://localhost:8080/workflowLibs.git
とするとクローンされてきます。
ただ、ログにもどこにも成功した失敗した出ないのでスクリプト動かして判断しましょうb

その他地雷

いろいろはまったところ

src以下に配置するスクリプト

ここではクラスを作成できるのですが
この内部でpipelineのstep(gitとかshとかnode)を利用しようとするとはまります。
これは公式で書いてあるんですけれど

この形のクラス宣言はアウトです。

// src/org/foo/Point.groovy
package org.foo;

// point in 3D space
class Point {
  float x,y,z;
}

こっちが正解

// src/org/foo/Zot.groovy
package org.foo;

def checkOutFrom(repo) {
  git url: "git@github.com:jenkinsci/${repo}"
}

groovyだとこの形でこんな感じで呼び出せるようです。

def z = new org.foo.Zot()
z.checkOutFrom(repo)

(ただこの形式でクラスフィールド宣言する方法がわからなかった)

vars以下に配置するスクリプト

公式の説明文の通りですが、
現在(2016/7/8)のバージョンではバグでここに更新があった場合、Jenkins再起動しないと読み込んでくれないようです。

nonserializableなオブジェクトがある場所でビルドすると動かない

このコードは失敗します。

node{
    def config = new ConfigSlurper().parse(new File('config.groovy').toURL())
    //ビルドがキックされた後に落ちる
    build job:"test"

}

原因
*If you must use a nonserializable value temporarily: discard it before doing anything else. When you keep the matcher only as a local variable inside a function, it is automatically discarded as soon as the function returned.

ConfigSlurperは便利なのですが…
これなら動きます。

node{
    try{ //スコープが別ならOK
        def config = new ConfigSlurper().parse(new File('config.groovy').toURL())
    }catch(e){}
    //ビルドがキックされた後に落ちる
    build job:"test"

}
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3