0

CNB(ビルドパック)用のJenkinsパイプラインプラグインを開発しています。Java でパイプライン スクリプト内の変数を取得する必要がありますが、まだ成功しません。

これは私のパイプライン スクリプトです。

buildpacks {
    builder = "some/builder"
}

そして、buildpacks.groovy の Groovy 言語を使用して、これらの変数 (ビルダー変数など) にアクセスできます。

package dsl

// The call(body) method in any file in workflowLibs.git/vars is exposed as a
// method with the same name as the file.
def call(body) {
    def config = [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = config
    body()
    try {
    
        echo "${config.builder}"

    } catch (Exception rethrow) {
        throw rethrow
    }

}

しかし、私が言ったように、これらの変数を Java で取得する必要があります。以下は、GlobalVariable クラスから継承した私のクラスです。

public abstract class PipelineDSLGlobal extends GlobalVariable {

public abstract String getFunctionName();

@Override
public String getName() {
    return getFunctionName();
}

@Override
public Object getValue(CpsScript script) throws Exception {
    Binding binding = script.getBinding();

    CpsThread c = CpsThread.current();
    if (c == null)
        throw new IllegalStateException("Expected to be called from CpsThread");

    ClassLoader cl = getClass().getClassLoader();

    String scriptPath = "dsl/" + getFunctionName() + ".groovy";
    Reader r = new InputStreamReader(cl.getResourceAsStream(scriptPath), "UTF-8");

    GroovyCodeSource gsc = new GroovyCodeSource(r, getFunctionName() + ".groovy", cl.getResource(scriptPath).getFile());
    gsc.setCachable(true);
    System.out.println(gsc.toString());

    Object pipelineDSL = c.getExecution()
            .getShell()
            .getClassLoader()
            .parseClass(gsc)
            .getDeclaredConstructor()
            .newInstance();
    binding.setVariable(getName(), pipelineDSL);
    r.close();

    System.out.println("test");
    
    return pipelineDSL;
}

}

以下は、buildpacksdsl 用に作成したクラスです。

package io.jenkins.plugins.buildpacks;

import hudson.Extension;
import io.jenkins.plugins.pipelinedsl.PipelineDSLGlobal;
import org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.ProxyWhitelist;
import org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist;

import java.io.IOException;

@Extension
public class BuildpacksDSL extends PipelineDSLGlobal {

@Override
public String getFunctionName() {
    return "buildpacks";
}

@Extension
public static class MiscWhitelist extends ProxyWhitelist {
    public MiscWhitelist() throws IOException {
        super(new StaticWhitelist(
                "method java.util.Map$Entry getKey",
                "method java.util.Map$Entry getValue"
        ));
    }
}

}

より詳細な構造を確認したい場合は、リポジトリを参照してください。

誰かが私を助けることができますか?ありがとう。

4

1 に答える 1