2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Jenkins初めて触る人向けにGroovy文法まとめた

2
Posted at

要約

Groovy文法チートシート作ったよ

はじめに

CI/CDツールとして、20年以上前からあるにもかかわらず1、Jenkinsはいまだに現役ですね。Jenkinsおじさん、働きすぎですよ
プロジェクトにアサインされて、いきなりJenkinsを扱うことになった人もいるのではないでしょうか。はい、私がそうです。
(AWS CodePipeline とか使いたいけど、ベンダーロックインとかありますからね。サーバーホストしたいとかなると話は変わりますし。オープンソースで作りたい気持ちはわかる。これという代替があんまりない)

というわけで、Jenkinsコードに初めて対峙したわけですが、
書いてあることはわかるんだけど微妙に読みづらい。
だって知らない言語なんだもん。なに、Groovyって。
……え、これメンテナンスするんですか、私が?

前提

Jenkinsとは

image
jenkins公式ページ より

CI/CDツール。
パイプライン実行ファイルは Groovy で記述する。

MITライセンス(オープンソース)。おじさんはタダで働いてくれます

Groovyとは

Javaから派生した、Javaと親和性が良い言語(らしい)。
書き方はJavaと大きく異なる(Rubyライク)。
動的型付け、スクリプト言語機能、が大きな特徴。

最速理解Groovy文法チートシート

多少見づらいですがお許しください。

大前提

  • 行末にセミコロン ; はつけなくてよい。(つけない)
  • 変数名はキャメルケースを用いる。

基本文法比較表

変数の宣言(動的型付け/静的型付け)

  • Groovy
    • def x = "abc"       // 動的型付け
      String y = "abc"    // 静的型付け
      
  • Java
    • // 動的型付けは無し
      String y = "abc";   // 静的型付け
      
  • Ruby
    • x = "abc"           # 動的型付け
      # 静的型付けは無し
      
  • Python
    • x = "abc"           # 動的型付け
      y: str = "abc"      # 静的型付け
      
  • C++
    • // 動的型付けは無し
      std::string y = "abc";   // 静的型付け
      
  • JavaScript
    • let x = "abc";      // 動的型付け
      // 静的型付けは無し
      

定数の宣言

  • Groovy
    • final int MAX = 100
      
  • Java
    • final int MAX = 100;
      
  • Ruby 2
    • MAX = 100
      
  • Python
    • # サポート無し
      
  • C++
    • const int MAX = 100;
      
  • JavaScript
    • const MAX = 100;
      

文字列の連結と出力

  • Groovy
    • println "My name is ${name}!"
      
  • Java
    • System.out.println("My name is " + name + "!");
      
  • Ruby
    • puts "My name is #{name}!"
      
  • Python
    • print(f"My name is {name}!")
      
  • C++
    • std::cout << "My name is " << name << "!" << std::endl;
      
  • JavaScript
    • console.log("My name is " + name + "!");
      

配列(可変リスト)

  • Groovy
    • def data = [1, 2, 3]
      
  • Java
    • List<Integer> data = new ArrayList<>(List.of(1, 2, 3))
      
  • Ruby
    • data = [1, 2, 3]
      
  • Python
    • data = [1, 2, 3]
      
  • C++
    • std::vector<int> data = {1, 2, 3};
      
  • JavaScript
    • let data = [1, 2, 3];
      

連想配列(マップ)

  • Groovy
    • def data = [1: "one", 2: "two", 3: "three"]
      
  • Java
    • Map<Integer, String> data = new HashMap<>(Map.of(1, "one", 2, "two", 3, "three"))
      
  • Ruby
    • data = {1 => "one", 2 => "two", 3 => "three"}
      
  • Python
    • data = {1: "one", 2: "two", 3: "three"}
      
  • C++
    • std::map<int, std::string> data = {{1, "one"}, {2, "two"}, {3, "three"}};
      
  • JavaScript
    • let data = new Map([[1, "one"], [2, "two"], [3, "three"]]);
      

関数定義

  • Groovy
    • def func1(x, y) {
        x + y
      }
      
  • Java
    • int func(int x, int y) {
        return x + y;
      }
      
  • Ruby
    • def func1(x, y)
        x + y
      end
      
  • Python
    • def func1(x, y):
        return x + y
      
  • C++
    • int func(int x, int y) {
        return x + y;
      }
      
  • JavaScript
    • function func(x, y) {
        return x + y;
      }
      

無名関数(ラムダ式)

  • Groovy
    • def f = { x, y -> x + y }
      
    • 「クロージャ」と呼ばれます。
      (本来はラムダ式とは異なりますが、同じように使えます)
  • Java
    • 無し3
  • Ruby
    • f = ->(x, y) { x + y }
      
  • Python
    • f = lambda x, y: x + y
      
  • C++
    • auto f = [](int x, int y) {<br> return x + y;<br>};
      
  • JavaScript
    • const f = (x, y) => x + y;
      

重要な仕様

  • is() メソッドと ==

    • is() メソッドは、値ではなく、実体が同じであるかを返す。
      • Javaではこちらが ==
    • == は、値が同じであれば true を返す。
    • def list1 = [1, 2, 3]
      def list2 = [1, 2, 3]
      def list1Copy = list1
      println list1.is(list2)     // false
      println list1.is(list1Copy) // true
      
  • falsyな値について

    • 以下の値はすべて、if文ではfalseと判定されるので注意。
      • false (bool値)
      • 0 (数値)
      • null
      • "" (空文字)
      • [] (空リスト)
  • 文字列について

    • シングルクォートとダブルクォートについて
      • シングルクォート '' は文字列として扱われ、変数が展開されない。
      • ダブルクォート "" も文字列として扱われるが、変数が展開される。
    • トリプルクォートについて
      • トリプルクォート"""文字列""", '''文字列'''は、改行が保持される。

その他特殊な演算子

  • 安全ナビゲーション演算子 ?.

    • nullかもしれない値をチェインするときなどに利用。
    • def text = getText()    // nullが返るおそれがある 
      def length = text?.length()
      
  • エルビス演算子 ?:

    • 三項演算子のtrueケースの省略。
    • 値がfalsyな場合に別の値を代入するときなどに利用。
    • def text = getText()    // nullが返るおそれがある
      def safeText = text ?: "blank-text"
      
  • 宇宙船演算子 <=>

    • 比較した結果それ自体を返す。
      • 数値同士の比較なら、0, 1, -1 のいずれかが返ってくる。
    • switch (a <=> b) {
        case 1:
          println "a is larger than b"
          break
        case 0:
          println "a is as same as b"
          break
        case -1:
          println "a is smaller than b"
          break
      }
      
  • 正規表現マッチ演算子 ==~

    • 正規表現にマッチしているかのbool値を返す。
    • def str = "asia"
      if (str ==~ /a.*a/) {
        println "matched!"
      }
      
  • 正規表現検索演算子 =~

    • java.util.regex.Matcherオブジェクトを返す。
      • 正規表現にマッチする箇所があるか検索するときなどに利用する。
    • def str = "abc123def"
      def matcher = str =~ /\d+/
      if (matcher) {
        println "${matcher[0]} found!"   // 123 found! と出力
      }
      
  • スプレッド演算子 *

    • リストを展開する。
    • def list = ["a", "b", "c"]
      def newList = ["1", *list, "2"]
      println newList     // [1, a, b, c, 2]
      
  • スプレッドドット演算子 *.

    • リスト全体にメソッドを適用し、新しいリストを返す。
      • プロパティーを取得するのにも使える。
    • def list = ["a", "b", "c"]
      def newList = list*.append("z")
      println newList     // [az, bz, cz]
      
  • レンジ演算子 ..

    • 指定した範囲のリストを作成するときに使う。
      • 末尾を含めない ..< もある。
    • def list1 = 1..5
      def list2 = 1..<5
      println list1     // [1, 2, 3, 4, 5]
      println list2     // [1, 2, 3, 4]
      
  • Javaフィールド演算子 .@

    • getXxx() という名のゲッターが存在している場合に、
      そちらを参照せずに直接プロパティーを取得するために使う。
      • Groovyのドット演算子は、内部的にgetter/setterを呼ぶ仕組みになっている。
    • class C{
        def field
        def getField() {
          return "value: ${field}"
        }
      }
      ins = new C()
      ins.field = 1
      println ins.field     // value: 1
      println ins.@field    // 1
      

おわりに

この記事が皆様の学習の一助になると嬉しいと思っております。
間違い等あれば、遠慮なくコメントなどでお教えください。
随時修正いたします。

  1. Jenkinsの初リリースは2011年。

  2. 変数名を大文字で始める。

  3. BiFunctionなどで可能だが、ここでは割愛

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?