jenkinsci / configuration-as-code-plugin

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

Views in folders get removed #2590

Closed sendele closed 2 days ago

sendele commented 2 days ago

Jenkins and plugins versions report

Environment ```text Jenkins: 2.479.1 OS: Linux - 5.14.0-427.40.1.el9_4.x86_64 --- ace-editor:1.1 analysis-model-api:12.9.0 ansible:403.v8d0ca_dcb_b_502 ansicolor:1.0.5 ant:511.v0a_a_1a_334f41b_ antisamy-markup-formatter:162.v0e6ec0fcfcf6 apache-httpcomponents-client-4-api:4.5.14-208.v438351942757 apache-httpcomponents-client-5-api:5.4-124.v31e2987e48f4 asm-api:9.7.1-97.v4cc844130d97 atlassian-bitbucket-server-integration:4.1.1 authentication-tokens:1.119.v50285141b_7e1 authorize-project:1.8.1 aws-credentials:231.v08a_59f17d742 aws-java-sdk:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-api-gateway:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-autoscaling:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-cloudformation:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-cloudfront:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-codebuild:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-codedeploy:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-ec2:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-ecr:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-ecs:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-efs:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-elasticbeanstalk:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-elasticloadbalancingv2:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-iam:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-kinesis:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-lambda:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-logs:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-minimal:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-organizations:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-secretsmanager:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-sns:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-sqs:1.12.772-474.v7f79a_2046a_fb_ aws-java-sdk-ssm:1.12.772-474.v7f79a_2046a_fb_ badge:2.4 basic-branch-build-strategies:190.v343a_ee70d920 blueocean:1.27.16 blueocean-autofavorite:1.2.5 blueocean-bitbucket-pipeline:1.27.16 blueocean-commons:1.27.16 blueocean-config:1.27.16 blueocean-core-js:1.27.16 blueocean-dashboard:1.27.16 blueocean-display-url:2.4.3 blueocean-events:1.27.16 blueocean-git-pipeline:1.27.16 blueocean-github-pipeline:1.27.16 blueocean-i18n:1.27.16 blueocean-jwt:1.27.16 blueocean-personalization:1.27.16 blueocean-pipeline-api-impl:1.27.16 blueocean-pipeline-editor:1.27.16 blueocean-pipeline-scm-api:1.27.16 blueocean-rest:1.27.16 blueocean-rest-impl:1.27.16 blueocean-web:1.27.16 bootstrap5-api:5.3.3-1 bouncycastle-api:2.30.1.78.1-248.ve27176eb_46cb_ branch-api:2.1197.vfa_d0c47c267d build-blocker-plugin:166.vc82fc20b_a_ed6 build-monitor-plugin:1.14-942.v18a_5ca_625a_91 build-timeout:1.33 build-user-vars-plugin:182.v378b_9f14b_487 caffeine-api:3.1.8-133.v17b_1ff2e0599 checks-api:2.2.1 cloud-stats:336.v788e4055508b_ cloudbees-bitbucket-branch-source:895.v15dc41668f03 cloudbees-folder:6.955.v81e2a_35c08d3 cobertura:1.17 code-coverage-api:4.99.0 command-launcher:115.vd8b_301cc15d0 commons-compress-api:1.26.1-2 commons-lang3-api:3.17.0-84.vb_b_938040b_078 commons-text-api:1.12.0-129.v99a_50df237f7 config-file-provider:980.v88956a_a_5d6a_d configuration-as-code:1887.v9e47623cb_043 coverage:1.16.1 credentials:1389.vd7a_b_f5fa_50a_2 credentials-binding:687.v619cb_15e923f dark-theme:479.v661b_1b_911c01 dashboard-view:2.517.v776a_b_811a_b_4e data-tables-api:2.1.8-1 dependency-check-jenkins-plugin:5.5.1 display-url-api:2.209.v582ed814ff2f docker-commons:443.v921729d5611d docker-java-api:3.4.0-94.v65ced49b_a_7d5 docker-plugin:1.7.0 docker-workflow:580.vc0c340686b_54 durable-task:577.v2a_8a_4b_7c0247 echarts-api:5.5.1-4 eddsa-api:0.3.0-4.v84c6f0f4969e email-ext:1849.v6dd03b_f6e423 external-monitor-job:215.v2e88e894db_f8 favorite:2.221.v19ca_666b_62f5 font-awesome-api:6.6.0-2 forensics-api:2.6.0 gatling:1.3.0 git:5.6.0 git-client:6.1.0 git-forensics:2.2.1 git-parameter:0.10.0 gitea:220.v4618c82a_40fb_ github:1.40.0 github-api:1.321-478.vc9ce627ce001 github-branch-source:1807.v50351eb_7dd13 gradle:2.13.1 groovy-postbuild:264.vf6e02a_77d5b_c gson-api:2.11.0-85.v1f4e87273c33 handlebars:3.0.8 handy-uri-templates-2-api:2.1.8-30.v7e777411b_148 htmlpublisher:1.36 http_request:1.19 instance-identity:201.vd2a_b_5a_468a_a_6 ionicons-api:74.v93d5eb_813d5f jackson2-api:2.17.0-379.v02de8ec9f64c jakarta-activation-api:2.1.3-1 jakarta-mail-api:2.1.3-1 javax-activation-api:1.2.0-7 javax-mail-api:1.6.2-10 jaxb:2.3.9-1 jdk-tool:80.v8a_dee33ed6f0 jenkins-design-language:1.27.16 jfrog:1.5.6 jjwt-api:0.11.5-112.ve82dfb_224b_a_d job-dsl:1.90 jobcacher:573.v33fa_12644a_91 joda-time-api:2.13.0-93.v9934da_29b_a_e9 jquery3-api:3.7.1-2 jsch:0.2.16-86.v42e010d9484b_ json-api:20240303-101.v7a_8666713110 json-path-api:2.9.0-118.v7f23ed82a_8b_8 junit:1307.vdd5b_2646279e ldap:770.vb_455e934581a_ lockable-resources:1327.ved786b_a_197e0 mailer:489.vd4b_25144138f mapdb-api:1.0.9-40.v58107308b_7a_7 matrix-auth:3.2.3 matrix-project:840.v812f627cb_578 mina-sshd-api-common:2.14.0-133.vcc091215a_358 mina-sshd-api-core:2.14.0-133.vcc091215a_358 momentjs:1.1.1 monitoring:2.3.0 multibranch-build-strategy-extension:51.v88f14e2a_4075 nodejs:1.6.2 okhttp-api:4.11.0-181.v1de5b_83857df pam-auth:1.11 parameterized-scheduler:277.v61a_4b_a_49a_c5c performance:970.ve5406a_d8c219 pipeline-build-step:540.vb_e8849e1a_b_d8 pipeline-github-lib:61.v629f2cc41d83 pipeline-graph-analysis:216.vfd8b_ece330ca_ pipeline-groovy-lib:744.v5b_556ee7c253 pipeline-input-step:495.ve9c153f6067b_ pipeline-milestone-step:119.vdfdc43fc3b_9a_ pipeline-model-api:2.2214.vb_b_34b_2ea_9b_83 pipeline-model-definition:2.2214.vb_b_34b_2ea_9b_83 pipeline-model-extensions:2.2214.vb_b_34b_2ea_9b_83 pipeline-rest-api:2.34 pipeline-stage-step:312.v8cd10304c27a_ pipeline-stage-tags-metadata:2.2214.vb_b_34b_2ea_9b_83 pipeline-stage-view:2.34 pipeline-utility-steps:2.18.0 plain-credentials:183.va_de8f1dd5a_2b_ plot:2.1.12 plugin-util-api:5.1.0 popper2-api:2.11.6-5 preSCMbuildstep:71.v1f2990a_37e27 prism-api:1.29.0-17 pubsub-light:1.18 resource-disposer:0.25 rocketchatnotifier:1.5.2 sbt:81.vb_82499046630 scm-api:698.v8e3b_c788f0a_6 script-security:1367.vdf2fc45f229c snakeyaml-api:2.3-123.v13484c65210a_ sse-gateway:1.27 ssh:2.6.1 ssh-agent:376.v8933585c69d3 ssh-credentials:343.v884f71d78167 ssh-slaves:2.973.v0fa_8c0dea_f9f sshd:3.330.vc866a_8389b_58 structs:338.v848422169819 subversion:1280.v5465ce107f22 swarm:3.48 theme-manager:262.vc57ee4a_eda_5d timestamper:1.28 token-macro:400.v35420b_922dcb_ trilead-api:2.147.vb_73cc728a_32e uno-choice:2.8.5 variant:60.v7290fc0eb_b_cd warnings-ng:11.10.0 windows-slaves:1.8.1 workflow-api:1336.vee415d95c521 workflow-basic-steps:1058.vcb_fc1e3a_21a_9 workflow-cps:3990.vd281dd77a_388 workflow-durable-task-step:1371.vb_7cec8f3b_95e workflow-job:1460.v28178c1ef6e6 workflow-multibranch:795.ve0cb_1f45ca_9a_ workflow-scm-step:427.v4ca_6512e7df1 workflow-step-api:678.v3ee58b_469476 workflow-support:932.vb_555de1b_a_b_94 ws-cleanup:0.48 xml-job-to-job-dsl:0.1.13 ```

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

Linux - 5.14.0-427.40.1.el9_4.x86_64

Reproduction steps

Setup:

Code in casc.yml:

jobs:
  - script: >
      folder('myfolder') {
          description('My description')
      }
  - script: >
      job('myfolder/Seed_Job') {
          [...]
      }

Expected Results

When running casc again, it should should preserve all views and jobs within the folder.

Actual Results

When running casc (or restarting Jenkins), it deletes all views in the folder and the seed job has to be triggered again. Jobs are preserved as expected.

Anything else?

Note that the folder is defined without jobs and/or views in casc.yml

Automatically triggering the seed job after a casc run might be possible, but is kinda awkward.

Not sure if this is a bug in casc or the Folder plugin.

timja commented 2 days ago

You will need to add the folders themselves by JobDSL I expect.

JCasC has support for top level views, but anything at a job level is done through jobdsl and is not a feature of the JCasC plugin (other than jobdsl has integrated to allow running jobdsl through JCasC)

sendele commented 20 hours ago

Thank you very much for the quick response!

Just to get it right, do you suppose to just add a single seed job in JCasC that creates all folders and potentially more seed jobs in them? It was hard for us to find information about best practices concerning for a setup of a multi-project setup using folders in JCasC.

An call you tell me where to find an official list of JobDSL features that are integrated to allow running through JCasC?

timja commented 20 hours ago

Anything under jobs is fully deleted to JobDsl so everything should be supported.

More info on here: https://github.com/jenkinsci/job-dsl-plugin/wiki

and also in your Jenkins instance there will more more docs see: https://github.com/jenkinsci/job-dsl-plugin#documentation


You can create many jobs using your seed job yes, here's an example of how I've done it before: https://github.com/hmcts/cnp-jenkins-config/blob/master/jobdsl/organisations-beta.groovy

sendele commented 20 hours ago

Thanks a lot!

For anyone stumbling upon this, the views being deleted is a known issue in Job DSL: https://issues.jenkins.io/browse/JENKINS-31308