credentialsの設定をJenkins DSLで設定するための記載方法

credentialsの設定をJenkins DSLで設定するための記載方法。
AWSaccessキーとか秘匿したいキーを運用するときに活用しよう。

ID : AWS_EC2_KEYS
USER を AWS_EC2_ACCESS_KEY に格納
PASSWORDを AWS_EC2_SECRET_KEY に格納

class SampleJop {
  static void applyTo(Job job, Map map) {
    job.with {
      parameters {
        stringParam("PARAM1","")
      }
      wrappers {
        credentialsBinding {
          usernamePassword("AWS_EC2_ACCESS_KEY", "AWS_EC2_SECRET_KEY", "AWS_EC2_KEYS")
        }
      }
    }  
  }
}

Kotlinで、Consul→Jackson→Mapへ

コンサルからのLIST情報をKEYとVALUEをMAPに変換してみた。

import com.github.kittinunf.fuel.httpGet
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import java.util.Base64

data class KeyValues(val CreateIndex: Integer?,
                     val ModifyIndex: Integer?,
                     val LockIndex: Integer?,
                     val Key: String?,
                     val Flags: Integer?,
                     val Value: String?)

fun main(args: Array<String>) {
    val triple = "http://localhost:8500/v1/kv/ikwhvdrm/?recurse".httpGet().response()

    val mapper = jacksonObjectMapper()

    val output:List<KeyValues> = mapper.readValue(triple.second.data)
    val map:Map<String?,String?> = output
            .filter { it.Value != null }
            .map { Pair<String?,String?>(it.Key, String(Base64.getDecoder().decode(it.Value)))}
            .toMap()

    map.forEach {k,v ->
        println("${k}:${v}")
    }
}

MAP変換部分はこちら。

    val map:Map<String?,String?> = output
            .filter { it.Value != null }
            .map { Pair<String?,String?>(it.Key, String(Base64.getDecoder().decode(it.Value)))}
            .toMap()

toMapが「public fun Iterable>.toMap(): Map defined in kotlin.collections in file MapsKt.class」なので、
IterableなPairを作るために下記を記載

            .map { Pair<String?,String?>(it.Key, String(Base64.getDecoder().decode(it.Value)))}


結果は同じだけど、うん、うん、だんだん ポイ感じになってきた。

ikwhvdrm.hatenablog.com

Kotlin Web IDE

公式がWEB ベースのIDEを適用してる。
気軽に試せる!
try.kotlinlang.org

Consulの値を1回で取得したい

http://localhost:8500/v1/kv/ikwhvdrm/?recurse
のようにすると、すてのKEY/VALUEが1回で取れる
www.consul.io
Consul入門 - ぺーぺーSEのブログ

kotlinでHttp Getする方法

import com.github.kittinunf.fuel.httpGet

fun main(args: Array<String>) {
    val triple = "http://localhost:8500/v1/kv/ikwhvdrm/?recurse".httpGet().response()
    println("result is :" + String(triple.second.data))
}

second以外にもfirst/thirdがあった。Debugすると面白い。

Build.gradle に下記を追加

repositories {
    jcenter()
}

dependencies {
    compile 'com.github.kittinunf.fuel:fuel:1.12.0'
}

KotlinでHTTP通信(FuelとHttpURLConnection) - Qiita

ConsulのデータをKotlinで取得して、Jacksonでパースする

LOGIC

import com.github.kittinunf.fuel.httpGet
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import java.util.Base64

data class KeyValues(val CreateIndex: Integer?,
                     val ModifyIndex: Integer?,
                     val LockIndex: Integer?,
                     val Key: String?,
                     val Flags: Integer?,
                     val Value: String?)

fun main(args: Array<String>) {
    val triple = "http://localhost:8500/v1/kv/ikwhvdrm/?recurse".httpGet().response()

    val mapper = jacksonObjectMapper()

    val output:List<KeyValues> = mapper.readValue(triple.second.data)
    output.forEach {
        if (it.Value != null) {
            println("${it.Key}:${String(Base64.getDecoder().decode(it.Value))}")
        }

    }
}

Build.gradle

dependencies {
    compile "com.fasterxml.jackson.module:jackson-module-kotlin:2.9.0"
}

はじめにJSONのformatを定義する。「?」があるのは、Nullを持っているデータがある可能性があるから。
CreateIndexなどの名称が重要で、もし異なるとディシリアライズエラーになる

data class KeyValues(val CreateIndex: Integer?,
                     val ModifyIndex: Integer?,
                     val LockIndex: Integer?,
                     val Key: String?,
                     val Flags: Integer?,
                     val Value: String?)


ConsulはListとして返してくるので、リストして受け取る

val output:List<KeyValues> = mapper.readValue(triple.second.data)


ValueはデコードかつBYTEをSTRINGに変換する

            println("${it.Key}:${String(Base64.getDecoder().decode(it.Value))}")

BuilderPlugin開発-JenkinsのParameterを追加する-

JenkinのBuilderプラグイン開発で、Jenkinsにパラメータを追加する方法を記載。

java初心者なのでソースコードの良し悪しはご勘弁)。

public class AddJenkinsParameters {
    private AbstractBuild<?,?>  Build;

    public AddJenkinsParameters(AbstractBuild<?, ?> build) {
        Build = build;
    }

    private void add(List<ParameterValue> params){
        Build.addAction(new ParametersAction(params));
    }

    public void AddParams( Hashtable<String, String> hashtable){
        createParam(hashtable);
    }

    private void createParam( Hashtable<String, String> hashtable){
        List<ParameterValue> params = new ArrayList<ParameterValue>();
        Enumeration<String> keyList = hashtable.keys();
        while(keyList.hasMoreElements()) {
            params.add(new StringParameterValue(key.toString(), hashtable.get(key)));
        }
        add(params);
    }
}

私はHashtableを詰め込んで、AddParamsに渡して実現しました。