我重构(不是选择)一个Jenkins插件(我没有写),所以它可以运行分布式。该插件很简单,它基本上从作业中获取结果对象,创建一个更改日志,在zip文件中压缩它们并通过http发送请求发送给应用程序。
关注http://ccoetech.ebay.com/tutorial-dev-jenkins-plugin-distributed-jenkins我将要在节点上运行的代码移动到这样的类:
private static class UploadLauncher implements Callable <Void, Exception> {
...
@Override
public Void call() throws Exception {
// Here's the code to run in the node.
...
}
}
我遇到的问题是代码中的某个地方插件试图像这样配置代理:
ProxyConfiguration proxy;
if (Jenkins.getInstance() != null && Jenkins.getInstance().proxy != null) {
proxy = Jenkins.getInstance().proxy;
} else {
proxy = new ProxyConfiguration("", 0, "", "");
}
//Continue proxy configuration code
因为我在本地计算机上执行此操作并且我没有配置代理(实际上我不知道生产服务器是否使用了代理),代码总是通过else语句,它没有在这条指令proxy = new ProxyConfiguration("", 0, "", "");
java.lang.IllegalStateException: cannot initialize confidential key store until Jenkins has started
at jenkins.security.ConfidentialStore.get(ConfidentialStore.java:68)
at jenkins.security.ConfidentialKey.load(ConfidentialKey.java:47)
at jenkins.security.CryptoConfidentialKey.getKey(CryptoConfidentialKey.java:32)
at jenkins.security.CryptoConfidentialKey.decrypt(CryptoConfidentialKey.java:67)
at hudson.util.Secret.decrypt(Secret.java:137)
at hudson.util.Secret.fromString(Secret.java:186)
at hudson.ProxyConfiguration.<init>(ProxyConfiguration.java:117)
at hudson.ProxyConfiguration.<init>(ProxyConfiguration.java:109)
at hudson.ProxyConfiguration.<init>(ProxyConfiguration.java:105)
at example.maduploader.MADRecorder$UploadLauncher.getHttpClient(MADRecorder.java:363)
仅当插件在从属节点上运行时才会发生这种情况,如果作业在主节点上执行,则插件工作正常。
另外,我是一名python程序员,我只是在大学里用Java做过事,所以也许我接近错误的方式。