Help us understand the problem. What is going on with this article?

Jenkinsfile は Groovy 文としてどう解釈されるのか? (未完)

JSON や YAML と違って、Jenkinsfile に纏わり付く気持ち悪い雰囲気は、Jenkinsfile がただのデータではなく Groovy というプログラミング言語だからだろう。プログラミング言語なので設定ファイルの中で何でも出来てしまうのは便利な一方で、一歩間違えれば良からぬことが起こってしまうのでは無いかという潜在的な恐怖がある。その恐怖を克服するため、Groovy についてちょっと調べてみた。

Jenkins のインストールと Pipeline の作成

なんとなくインストーラを使わずに Jenkins を設定してみる。

https://jenkins.io/download/ より Generic Java package をダウンロード

java -jar jenkins.war

http://localhost:8080 にブラウザでアクセスして適当に初期化する。

https://jenkins.io/doc/book/pipeline/getting-started/ の通りに example-pipeline 作成して以下の Pipeline を作成する。

pipeline {
    agent any 
    stages {
        stage('Stage 1') {
            steps {
                echo 'Hello world!' 
            }
        }
    }
}

Build Now でこの Pipeline をを実行出来る。

Jenkins にコマンドラインからアクセスする

いちいち Build Now を押すのは面倒なので、 CLI を設定する。

  • Manage Jenkins > Configure Global Security > SSH Server で適当に設定する。例: 8081
  • (User) > Configure > SSH Public keys に公開鍵を入れる。

    ssh localhost -p 8081 help
    ssh localhost -p 8081 build example-pipeline -f -v

これでコマンドラインからビルド出来る。

参考

Pipeline を調べる。

Pipeline はただの設定ファイルではなく Groovy ファイルという事だった。ということは pipeline, agent, stage と言った識別子は Groovy オブジェクトなはずだ。調べてみた。

println "pipeline: $pipeline"

pipeline {
    // println "agent: $agent"
    agent any 
    stages {
        // println "stages: $stages"
        stage('Stage 1') {
            steps {
                println "steps: $steps"
            }
        }
    }
}
  • pipeline 宣言の外側に println を書く事が出来た。pipeline はオブジェクトだった。
  • pipeline 宣言のすぐ内側には println を書くことが出来なかった。
  • stages 宣言のすぐ内側には println を書くことが出来なかった。
  • stage 宣言のすぐ内側には println を書くことが出来た。steps はオブジェクトだった。

実行結果

$ ssh localhost -p 8081 build example-pipeline -f -v
Started example-pipeline #15
Started from command line by tyamamiya
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] echo
pipeline: org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter@1a666b03
[Pipeline] node
Running on Jenkins in /Users/tyamamiya/.jenkins/workspace/example-pipeline
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Stage 1)
[Pipeline] echo
steps: org.jenkinsci.plugins.workflow.cps.DSL@717597ff
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
Completed example-pipeline #15 : SUCCESS

宿題

特殊構文: http://groovy-lang.org/dsls.html によると、pipeline {...} のような構文は pipeline({...}) のような関数呼び出しの省略形だという事だった。中括弧はクロージャを表すので agentstages も関数だと思ったのだが println 出来なかった。そもそも println を探せないというエラーが出る。

WorkflowScript: 4: Undefined section "println" @ line 4, column 5.
       println "agent: $agent"

普通クロージャというと外の環境を取り込む物だが、Groovy の場合もっと複雑な事が出来るらしい。agentstages が Groovy 的にどう解釈されるのか知りたい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした