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"
));
}
}
}
より詳細な構造を確認したい場合は、リポジトリを参照してください。
誰かが私を助けることができますか?ありがとう。