jenkinsci / configuration-as-code-plugin

Jenkins Configuration as Code Plugin
https://plugins.jenkins.io/configuration-as-code
MIT License
2.69k stars 718 forks source link

java.lang.IndexOutOfBoundsException: OverrideMergeStrategy.merge #1832

Closed srz-zumix closed 2 years ago

srz-zumix commented 2 years ago

Jenkins and plugins versions report

Environment ```text Jenkins: 2.263.4 OS: Linux - 5.4.0-70-generic --- ace-editor:1.1 analysis-model-api:10.5.4 ansicolor:1.0.0 ant:1.13 antisamy-markup-formatter:2.1 apache-httpcomponents-client-4-api:4.5.13-1.0 app-detector:1.0.8 authentication-tokens:1.4 authorize-project:1.4.0 badge:1.9 blueocean:1.24.8 blueocean-autofavorite:1.2.4 blueocean-bitbucket-pipeline:1.24.8 blueocean-commons:1.24.8 blueocean-config:1.24.8 blueocean-core-js:1.24.8 blueocean-dashboard:1.24.8 blueocean-display-url:2.4.1 blueocean-events:1.24.8 blueocean-git-pipeline:1.24.8 blueocean-github-pipeline:1.24.8 blueocean-i18n:1.24.8 blueocean-jira:1.24.8 blueocean-jwt:1.24.8 blueocean-personalization:1.24.8 blueocean-pipeline-api-impl:1.24.8 blueocean-pipeline-editor:1.24.8 blueocean-pipeline-scm-api:1.24.8 blueocean-rest:1.24.8 blueocean-rest-impl:1.24.8 blueocean-web:1.24.8 bootstrap4-api:4.6.0-3 bootstrap5-api:5.1.1-1 bouncycastle-api:2.25 branch-api:2.6.2 build-blocker-plugin:1.7.7 build-timeout:1.20 build-timestamp:1.0.3 build-token-root:1.9 build-user-vars-plugin:1.8 caffeine-api:2.9.2-29.v717aac953ff3 categorized-view:1.12 checks-api:1.7.2 cloudbees-bitbucket-branch-source:726.vb0c1ea6c9336 cloudbees-folder:6.17 command-launcher:1.6 conditional-buildstep:1.4.1 config-file-provider:3.8.0 configuration-as-code:1.55 copyartifact:1.46.2 credentials:2.6.1 credentials-binding:1.27 data-tables-api:1.11.3-1 display-url-api:2.3.5 docker-commons:1.17 docker-workflow:1.26 durable-task:1.37 echarts-api:5.2.1-2 envinject:2.3.0 envinject-api:1.8 external-monitor-job:1.7 favorite:2.3.2 font-awesome-api:5.15.4-1 forensics-api:1.5.0 generic-webhook-trigger:1.79 ghprb:1.42.2 git:4.8.3 git-client:3.9.0 git-server:1.9 github:1.34.1 github-api:1.301-378.v9807bd746da5 github-branch-source:2.9.9 google-container-registry-auth:0.3 google-metadata-plugin:0.3.1 google-oauth-plugin:1.0.6 google-storage-plugin:1.5.4.1 groovy-postbuild:2.5 handlebars:3.0.8 handy-uri-templates-2-api:2.1.8-1.0 heavy-job:1.1 htmlpublisher:1.25 influxdb:3.0.2 jackson2-api:2.13.1-246.va8a9f3eaf46a javadoc:1.6 jdk-tool:1.5 jenkins-design-language:1.24.8 jira:3.3 jjwt-api:0.11.2-9.c8b45b8bb173 job-dsl:1.78.3 jobConfigHistory:2.31-rc1098.b666422863b2 jquery:1.12.4-1 jquery-detached:1.2.1 jquery3-api:3.6.0-2 jsch:0.1.55.2 junit:1.53 ldap:1.26 lockable-resources:2.13 log-parser:2.2 mailer:1.34 markdown-formatter:0.2.0 matrix-auth:3.0 matrix-project:1.18 maven-plugin:3.8.1 mercurial:2.16 metrics:4.0.2.8 momentjs:1.1.1 nested-view:1.22 nodelabelparameter:1.9.2 oauth-credentials:0.5 okhttp-api:4.9.3-105.vb96869f8ac3a pam-auth:1.6.1 parameterized-trigger:2.39 pipeline-aggregator-view:1.11 pipeline-build-step:2.15 pipeline-github-lib:1.0 pipeline-githubnotify-step:1.0.5 pipeline-graph-analysis:1.11 pipeline-input-step:427.va6441fa17010 pipeline-milestone-step:1.3.2 pipeline-model-api:1.9.3 pipeline-model-definition:1.9.3 pipeline-model-extensions:1.9.3 pipeline-multibranch-defaults:2.1 pipeline-rest-api:2.20 pipeline-stage-step:291.vf0a8a7aeeb50 pipeline-stage-tags-metadata:1.9.3 pipeline-stage-view:2.20 pipeline-utility-steps:2.11.0 plain-credentials:1.7 platformlabeler:1018.v93737f630767 plugin-util-api:2.5.0 popper-api:1.16.1-2 popper2-api:2.10.2-1 pubsub-light:1.13 rebuild:1.32 resource-disposer:0.17 role-strategy:3.2.0 run-condition:1.5 saml:1.1.8 scm-api:2.6.5 script-security:1118.vba21ca2e3286 sidebar-link:1.12.1 simple-theme-plugin:0.7 slack:2.49 snakeyaml-api:1.29.1 sse-gateway:1.24 ssh-agent:1.22 ssh-credentials:1.18.1 ssh-slaves:1.31.5 structs:308.v852b473a2b8c throttle-concurrents:2.6 timestamper:1.15 token-macro:2.13 trilead-api:1.0.13 variant:1.4 warnings-ng:9.5.1 windows-slaves:1.8 workflow-aggregator:2.6 workflow-api:1108.v57edf648f5d4 workflow-basic-steps:2.24 workflow-cps:2648.va9433432b33c workflow-cps-global-lib:2.19 workflow-durable-task-step:2.40 workflow-job:1145.v7f2433caa07f workflow-multibranch:2.24 workflow-scm-step:2.13 workflow-step-api:622.vb_8e7c15b_c95a_ workflow-support:3.8 ws-cleanup:0.40 xml-job-to-job-dsl:0.1.13 ```

What Operating System are you using (both controller, and any agents involved in the problem)?

Controller: Ubuntu 20.04

Reproduction steps

  1. Set MergeStrategy to override

-Dcasc.merge.strategy=override

https://github.com/jenkinsci/configuration-as-code-plugin/blob/master/docs/features/mergeStrategy.md

  1. Load from directory:
# a.yml
jenkins:
  agentProtocols:
  - "JNLP4-connect"
  - "Ping"
unclassified:
  casCGlobalConfig:
    configurationPath: ""
# b.yml
unclassified:
  location:
    url: "http://localhost:8080/"

Expected Results

Load succeeds

Actual Results

java.lang.IndexOutOfBoundsException

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.ArrayList.rangeCheck(ArrayList.java:659)
    at java.util.ArrayList.remove(ArrayList.java:498)
    at io.jenkins.plugins.casc.yaml.OverrideMergeStrategy.merge(OverrideMergeStrategy.java:52)
    at io.jenkins.plugins.casc.yaml.YamlUtils.merge(YamlUtils.java:47)
    at io.jenkins.plugins.casc.yaml.YamlUtils.loadFrom(YamlUtils.java:102)
    at io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:637)
    at io.jenkins.plugins.casc.ConfigurationAsCode.configure(ConfigurationAsCode.java:306)
    at io.jenkins.plugins.casc.ConfigurationAsCode.init(ConfigurationAsCode.java:298)
Caused: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:104)
Caused: java.lang.Error
    at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:110)
    at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:175)
    at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:296)
    at jenkins.model.Jenkins$5.runTask(Jenkins.java:1131)
    at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:214)
    at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117)
    at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused: org.jvnet.hudson.reactor.ReactorException
    at org.jvnet.hudson.reactor.Reactor.execute(Reactor.java:282)
    at jenkins.InitReactorRunner.run(InitReactorRunner.java:50)
    at jenkins.model.Jenkins.executeReactor(Jenkins.java:1164)
    at jenkins.model.Jenkins.<init>(Jenkins.java:964)
    at hudson.model.Hudson.<init>(Hudson.java:85)
    at hudson.model.Hudson.<init>(Hudson.java:81)
    at hudson.WebAppMain$3.run(WebAppMain.java:295)
Caused: hudson.util.HudsonFailedToLoad
    at hudson.WebAppMain$3.run(WebAppMain.java:312)

Anything else?

No response

timja commented 2 years ago

cc @LinuxSuRen

jonesbusy commented 2 years ago

Hi!

Same issue here with 2 configuration file

2022-02-08 12:20:49.757+0000 [id=16]    WARNING h.i.i.InstallUncaughtExceptionHandler#handleException: Caught unhandled exception with ID e74da7ad-ef11-4632-ae04-6c722fec27f1
java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 1
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:372)
    at java.base/java.util.ArrayList.remove(ArrayList.java:536)
    at io.jenkins.plugins.casc.yaml.OverrideMergeStrategy.merge(OverrideMergeStrategy.java:52)
    at io.jenkins.plugins.casc.yaml.YamlUtils.merge(YamlUtils.java:47)
    at io.jenkins.plugins.casc.yaml.YamlUtils.loadFrom(YamlUtils.java:102)
    at io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:637)
    at io.jenkins.plugins.casc.ConfigurationAsCode.configure(ConfigurationAsCode.java:306)
    at io.jenkins.plugins.casc.TokenReloadAction.doIndex(TokenReloadAction.java:59)
    at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:710)
    at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:393)
    at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:405)
    at org.kohsuke.stapler.interceptor.RequirePOST$Processor.invoke(RequirePOST.java:77)
    at org.kohsuke.stapler.PreInvokeInterceptedFunction.invoke(PreInvokeInterceptedFunction.java:26)
    at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:208)
    at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:141)
    at org.kohsuke.stapler.IndexDispatcher.dispatch(IndexDispatcher.java:27)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:766)

File are

        jenkins:
          securityRealm: "openShiftOAuth2"
          authorizationStrategy:
            projectMatrix:
              permissions:
                - "Overall/Administer:authenticated"
          agentProtocols:
          - "JNLP4-connect"
          - "Ping"
          crumbIssuer:
            standard:
              excludeClientIPFromCrumb: true
          disableRememberMe: true
          labelString: "built-in"
          markupFormatter:
            rawHtml:
              disableSyntaxHighlighting: false
          mode: EXCLUSIVE
          noUsageStatistics: true
          projectNamingStrategy: "standard"
          quietPeriod: 5
          remotingSecurity:
            enabled: true
          scmCheckoutRetryCount: 0
          slaveAgentPort: 50000
          primaryView:
            all:
              name: "all"
          numExecutors: 0
          systemMessage: "Jcasc instance"
        tool:
          git:
            installations:
            - home: "/usr/bin/git"
              name: "Default"
        unclassified:
          location:
            adminAddress: "instance_jenkins@my-companynet.local"
            url: "https://jenkins-instance-my-company-samples-helm.apps.domain.foo.my-company.com/"
          buildDiscarders:
            configuredBuildDiscarders:
            - "jobBuildDiscarder"
          defaultFolderConfiguration:
            healthMetrics:
            - worstChildHealthMetric:
                recursive: true
          globalDefaultFlowDurabilityLevel:
            durabilityHint: PERFORMANCE_OPTIMIZED
          junitTestResultStorage:
            storage: "file"
          mavenModuleSet:
            localRepository: "default"
          pollSCM:
            pollingThreadCount: 10
          timestamper:
            allPipelines: true
            elapsedTimeFormat: "'<b>'HH:mm:ss.S'</b> '"
            systemTimeFormat: "'<b>'HH:mm:ss'</b> '"
          warningsParsers:
            consoleLogScanningPermitted: false
          login-theme-plugin:
            footer: ""
            head: ""
            header: ""
            useDefaultTheme: true
        security:
          envInject:
            enableLoadingFromMaster: false
            enablePermissions: false
            hideInjectedVars: true
          apiToken:
            creationOfLegacyTokenEnabled: false
            tokenGenerationOnCreationEnabled: false
            usageStatisticsEnabled: false
          globalJobDslSecurityConfiguration:
            useScriptSecurity: false
          queueItemAuthenticator:
            authenticators:
            - global:
                strategy: "triggeringUsersAuthorizationStrategy"
          sSHD:
            port: -1
jenkins:
  nodes:
  - permanent:
      labelString: windows
      launcher:
        jnlp:
          webSocket: true
          workDirSettings:
            disabled: false
            failIfWorkDirIsMissing: false
            internalDir: remoting
      mode: EXCLUSIVE
      name: win-node
      numExecutors: 1
      remoteFS: c:\jenkins
      retentionStrategy: always

Any help appreciated!

Thanks.