2

独自のプラグインを使用して、Jenkins スレーブのワークスペースにファイルが存在することを知る必要があります。しかし、実際にはスレーブに存在するのにファイルが見つかりません

artifactsToDeploy = workingDir.act(new FilesDeployerCallable(listener, pairs, artifactoryServer, credentials,
                repositoryKey, propertiesToAdd,
                artifactoryServer.createProxyConfiguration(Jenkins.getInstance().proxy),configurator.getProductKey(),configurator.getArtifactoryKey(), configurator.getBuildType() ,configurator.getRpmParameters(),build,configurator.issendFcmPayload(), configurator.getModule(), configurator.getTaxonomy()));
    }

private static class FilesDeployerCallable implements FilePath.FileCallable<List<Artifact>> {

        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private final String repositoryKey;
        private BuildListener listener;
        private Multimap<String, String> patternPairs;
        private ArtifactoryServer server;
        private Credentials credentials;
        private ArrayListMultimap<String, String> buildProperties;
        private ProxyConfiguration proxyConfiguration;
        private String artifactKey;
        private String buildType;
        private String module;
        private String taxonomy;
        private RpmParameters rpmParameters;
        private final AbstractBuild build;
        private boolean sendFcmPayload;
        private EnvVars env;

        public FilesDeployerCallable(BuildListener listener, Multimap<String, String> patternPairs,
                                     ArtifactoryServer server, Credentials credentials, String repositoryKey,
                                     ArrayListMultimap<String, String> buildProperties, ProxyConfiguration proxyConfiguration,String productKey,String artifactKey, String buildType, RpmParameters rpmParameters, AbstractBuild build, boolean sendFcmPayload, String module, String taxonomy) throws IOException, InterruptedException {
            this.listener = listener;
            this.patternPairs = patternPairs;
            this.server = server;
            this.credentials = credentials;
            this.repositoryKey = repositoryKey;
            this.buildProperties = buildProperties;
            this.proxyConfiguration = proxyConfiguration;
            this.artifactKey = artifactKey;
            this.buildType = buildType;
            this.module = module;
            this.taxonomy = taxonomy;
            this.rpmParameters = rpmParameters;
            this.build = build;
            this.sendFcmPayload = sendFcmPayload;
            this.env = build.getEnvironment(listener);

        }

java.io.IOException: リモートファイル操作に失敗しました: /jenkins/slaveworkspace/workspace/githubMigration at hudson.remoting.Channel@44434cf3:master-replicated: java.io.IOException: Unable to serialize hudson.FilePath$FileCallableWrapper@2ca3869b at hudson .FilePath.act(FilePath.java:977) で hudson.FilePath.act(FilePath.java:959) で dj.pib.productivity.generic.GenericArtifactsDeployer.deploy(GenericArtifactsDeployer.java:148)dj.pib.productivity. generic.ArtifactoryGenericConfigurator$1.tearDown(ArtifactoryGenericConfigurator.java:352) hudson.model.Build$BuildExecution.doRun(Build.java:171) で hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:533) で hudson.model.Run.execute(Run.java:1759) でhudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43) at hudson.model.ResourceController.execute(ResourceController.java:89) at hudson.model.Executor.run(Executor.java:240) 原因: java.io IOException: hudson.remoting.UserRequest.serialize(UserRequest.java:169) で hudson.FilePath$FileCallableWrapper@2ca3869b をシリアル化できません hudson.remoting.UserRequest.(UserRequest.java:63) で hudson.remoting.Channel.call (Channel.java:750) at hudson.FilePath.act(FilePath.java:970) ... 9 その他の原因: java.io.NotSerializableException: hudson.model.FreeStyleBuild java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183) で java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547) で java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508) で java.io. ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431) で java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177) で java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547) で java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream) .java:1508) で java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431) で java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177) で java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347) でhudson.remoting.UserRequest で。_serialize(UserRequest.java:158) at hudson.remoting.UserRequest.serialize(UserRequest.java:167) ... 12 以上 メタデータを収集しています...

私は何を間違っていますか?

編集 1: わかりました。問題は、シリアル化できない filesDeployerCallable で AbstractBuild ビルドを渡していることですが、私が行う作業にはそれが必要です。(abstract は生の型であり、パラメーター化する必要があります) に関する警告が表示されます。どうすればパラメータ化できますか? その hudson.model.abstractModel にあります

4

1 に答える 1

2

ファイルがスレーブに存在するかどうかを確認する方法という質問に答えるにはworkspace.child("relative/path/to/my.file").exists()、マスターから呼び出すだけで十分です。ローカル ファイルとリモート ファイルの違いを隠すことが、FilePath存在する理由です。


Jenkins モデル オブジェクトがシリアライズ可能でないことを回避するには、いくつかの方法があります。

  1. ロジックをマスターに保持し、小さなタスク ( Callables) をスレーブに送信します。これらのタスクが Jenkins モデル オブジェクトをまったく必要としないほど単純であることを確認する方が簡単です。を使用するhudson.Launcherhudson.FilePath、このカテゴリに分類されます。
  2. Callableスレーブに送信する前にシリアライズ可能な情報のみを抽出します。たとえば、ビルド番号だけが必要な場合は、ビルド オブジェクト全体を転送する必要はありません。
  3. オブジェクトプロキシを使用して、ドメイン オブジェクトのリモート プロキシのみがスレーブに存在し、すべてのメソッド呼び出しがチャネル経由でディスパッチされるようにします。
于 2015-06-20T09:56:30.157 に答える