{"id":13527160,"url":"https://github.com/jenkinsci/configuration-as-code-plugin","last_synced_at":"2026-06-14T21:01:10.772Z","repository":{"id":37271304,"uuid":"107676801","full_name":"jenkinsci/configuration-as-code-plugin","owner":"jenkinsci","description":"Jenkins Configuration as Code Plugin","archived":false,"fork":false,"pushed_at":"2026-06-14T10:48:51.000Z","size":6406,"stargazers_count":2790,"open_issues_count":116,"forks_count":751,"subscribers_count":76,"default_branch":"master","last_synced_at":"2026-06-14T12:25:07.899Z","etag":null,"topics":["configuration-as-code","hacktoberfest","jcasc","jenkins","jenkins-configuration"],"latest_commit_sha":null,"homepage":"https://plugins.jenkins.io/configuration-as-code","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jenkinsci.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"community_bridge":"jenkins","custom":["https://www.jenkins.io/donate/#why-donate"]}},"created_at":"2017-10-20T12:43:10.000Z","updated_at":"2026-06-13T15:15:43.000Z","dependencies_parsed_at":"2023-10-02T02:41:09.806Z","dependency_job_id":"b0278958-b704-46f6-9197-25ac6b8c9aee","html_url":"https://github.com/jenkinsci/configuration-as-code-plugin","commit_stats":{"total_commits":1835,"total_committers":217,"mean_commits":8.456221198156681,"dds":0.8272479564032698,"last_synced_commit":"f026d9a30bdff84d139e8247e62b2d359503a37f"},"previous_names":[],"tags_count":146,"template":false,"template_full_name":null,"purl":"pkg:github/jenkinsci/configuration-as-code-plugin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenkinsci%2Fconfiguration-as-code-plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenkinsci%2Fconfiguration-as-code-plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenkinsci%2Fconfiguration-as-code-plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenkinsci%2Fconfiguration-as-code-plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jenkinsci","download_url":"https://codeload.github.com/jenkinsci/configuration-as-code-plugin/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenkinsci%2Fconfiguration-as-code-plugin/sbom","scorecard":{"id":330276,"data":{"date":"2025-08-11","repo":{"name":"github.com/jenkinsci/configuration-as-code-plugin","commit":"bc02e8d8dad2fbe57957c3fedc139b953631f000"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":6.3,"checks":[{"name":"Code-Review","score":1,"reason":"Found 5/30 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"20 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/cd.yaml:1","Warn: topLevel 'security-events' permission set to 'write': .github/workflows/jenkins-security-scan.yml:12","Info: topLevel 'contents' permission set to 'read': .github/workflows/jenkins-security-scan.yml:13","Info: topLevel 'actions' permission set to 'read': .github/workflows/jenkins-security-scan.yml:14","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/cd.yaml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/jenkinsci/configuration-as-code-plugin/cd.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/jenkins-security-scan.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/jenkinsci/configuration-as-code-plugin/jenkins-security-scan.yml/master?enable=pin","Info:   0 out of   2 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/jenkinsci/.github/SECURITY.md:1","Info: Found linked content: github.com/jenkinsci/.github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: github.com/jenkinsci/.github/SECURITY.md:1","Info: Found text in security policy: github.com/jenkinsci/.github/SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: all commits (30) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T03:23:51.529Z","repository_id":37271304,"created_at":"2025-08-18T03:23:51.529Z","updated_at":"2025-08-18T03:23:51.529Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34337551,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-14T02:00:07.365Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["configuration-as-code","hacktoberfest","jcasc","jenkins","jenkins-configuration"],"created_at":"2024-08-01T06:01:42.315Z","updated_at":"2026-06-14T21:01:10.696Z","avatar_url":"https://github.com/jenkinsci.png","language":"Java","funding_links":["https://funding.communitybridge.org/projects/jenkins","https://www.jenkins.io/donate/#why-donate"],"categories":["Java","jenkins"],"sub_categories":[],"readme":"# Jenkins Configuration as Code (a.k.a. JCasC) Plugin\n\n[![Build Status](https://ci.jenkins.io/buildStatus/icon?job=Plugins%2Fconfiguration-as-code-plugin%2Fmaster)](https://ci.jenkins.io/job/Plugins/job/configuration-as-code-plugin/job/master/)\n[![Contributors](https://img.shields.io/github/contributors/jenkinsci/configuration-as-code-plugin.svg)](https://github.com/jenkinsci/configuration-as-code-plugin/graphs/contributors)\n[![Jenkins Plugin](https://img.shields.io/jenkins/plugin/v/configuration-as-code.svg)](https://plugins.jenkins.io/configuration-as-code)\n[![GitHub release](https://img.shields.io/github/release/jenkinsci/configuration-as-code-plugin.svg?label=changelog)](https://github.com/jenkinsci/configuration-as-code-plugin/releases/latest)\n[![Jenkins Plugin Installs](https://img.shields.io/jenkins/plugin/i/configuration-as-code.svg?color=blue)](https://plugins.jenkins.io/configuration-as-code)\n[![Gitter](https://badges.gitter.im/jenkinsci/configuration-as-code-plugin.svg)](https://gitter.im/jenkinsci/configuration-as-code-plugin)\n\n\u003cimg src=\"images/logo-head.svg\" width=\"192\"\u003e\n\n\n- [Introduction](#introduction)\n- [Getting Started](#getting-started)\n- [Examples and demos](./demos)\n- [Handling Secrets](./docs/features/secrets.adoc)\n- [Security considerations](#security-considerations)\n- [Exporting configurations](./docs/features/configExport.md)\n- [Validating configurations](./docs/features/jsonSchema.md)\n- [Merge Strategy](./docs/features/mergeStrategy.md)\n- [Triggering Configuration Reload](./docs/features/configurationReload.md)\n- [Installing plugins](#installing-plugins)\n- [Supported Plugins](#supported-plugins)\n- [Adding JCasC support to a plugin](#adding-jCasC-support-to-a-plugin)\n- [Configuration-as-Code extension plugins](#configuration-as-Code-extension-plugins)\n- [Jenkins Enhancement Proposal](#jenkins-enhancement-proposal)\n\n## Introduction\n\nSetting up Jenkins is a complex process, as both Jenkins and its plugins require some tuning and configuration,\nwith dozens of parameters to set within the web UI `manage` section.\n\nExperienced Jenkins users rely on groovy init scripts to customize Jenkins and enforce the desired state. Those\nscripts directly invoke Jenkins API and, as such, can do everything (at your own risk). But they also require\nyou to know Jenkins internals and are confident in writing groovy scripts on top of Jenkins API.\n\nThe Configuration as Code plugin is an _**opinionated**_ way to configure Jenkins based on\nhuman-readable declarative configuration files. Writing such a file should be feasible without being a Jenkins\nexpert, just translating into _code_ a configuration process one is used to executing in the web UI.\n\nThe below configuration file includes root entries for various components of your primary Jenkins installation. The `jenkins` one is for the root Jenkins object, and the other ones are for different global configuration elements.\n\n```yaml\njenkins:\n  systemMessage: \"Jenkins configured automatically by Jenkins Configuration as Code plugin\\n\\n\"\n  globalNodeProperties:\n  - envVars:\n      env:\n      - key: VARIABLE1\n        value: foo\n      - key: VARIABLE2\n        value: bar\n  securityRealm:\n    ldap:\n      configurations:\n        - groupMembershipStrategy:\n            fromUserRecord:\n              attributeName: \"memberOf\"\n          inhibitInferRootDN: false\n          rootDN: \"dc=acme,dc=org\"\n          server: \"ldaps://ldap.acme.org:1636\"\n\n  nodes:\n    - permanent:\n        name: \"static-agent\"\n        remoteFS: \"/home/jenkins\"\n        launcher:\n          inbound:\n            workDirSettings:\n              disabled: true\n              failIfWorkDirIsMissing: false\n              internalDir: \"remoting\"\n              workDirPath: \"/tmp\"\n\n  slaveAgentPort: 50000\n\ntool:\n  git:\n    installations:\n      - name: git\n        home: /usr/local/bin/git\n\ncredentials:\n  system:\n    domainCredentials:\n      - credentials:\n          - basicSSHUserPrivateKey:\n              scope: SYSTEM\n              id: ssh_with_passphrase_provided\n              username: ssh_root\n              passphrase: ${SSH_KEY_PASSWORD}\n              description: \"SSH passphrase with private key file. Private key provided\"\n              privateKeySource:\n                directEntry:\n                  privateKey: ${SSH_PRIVATE_KEY}\n```\n\nAdditionally, we want to have a well-documented syntax file and tooling to assist in writing and testing,\nso end users have full guidance in using this toolset and do not have to search for examples on the Internet.\n\nSee the [presentation slides](https://docs.google.com/presentation/d/1VsvDuffinmxOjg0a7irhgJSRWpCzLg_Yskf7Fw7FpBg/edit?usp=sharing) from DevOps World - Jenkins World 2018 for an overview.\n\n## Getting Started\n\nFirst, start a Jenkins instance with the [Configuration as Code](https://plugins.jenkins.io/configuration-as-code) plugin installed.\n\n- Those running Jenkins as a [Docker](https://github.com/jenkinsci/docker) container (and maybe also [pre-installing plugins](https://github.com/jenkinsci/docker#preinstalling-plugins)), do include [Configuration as Code](https://plugins.jenkins.io/configuration-as-code) plugin.\n\nSecond, the plugin looks for the `CASC_JENKINS_CONFIG` environment variable. The variable points to a comma-separated list of any of the following:\n\n- Path to a folder containing a set of config files. For example, `/var/jenkins_home/casc_configs`.\n- A full path to a single file. For example, `/var/jenkins_home/casc_configs/jenkins.yaml`.\n- A URL pointing to a file served on the web. For example, `https://acme.org/jenkins.yaml`.\n\nIf an element of `CASC_JENKINS_CONFIG` points to a folder, the plugin will recursively traverse the folder to find file(s) with .yml,.yaml,.YAML,.YML suffix. It will exclude hidden files or files that contain a hidden folder in **any part** of the full path. It follows symbolic links for both files and directories.\n\u003cdetails\u003e\u003csummary\u003eExclusion examples\u003c/summary\u003e\n\n`CASC_JENKINS_CONFIG=/jenkins/casc_configs`  \n:heavy_check_mark: `/jenkins/casc_configs/jenkins.yaml`  \n:heavy_check_mark: `/jenkins/casc_configs/dir1/config.yaml`  \n:x: `/jenkins/casc_configs/.dir1/config.yaml`  \n:x: `/jenkins/casc_configs/..dir2/config.yaml`  \n  \n`CASC_JENKINS_CONFIG=/jenkins/.configs/casc_configs` contains hidden folder `.config`  \n:x: `/jenkins/.configs/casc_configs/jenkins.yaml`  \n:x: `/jenkins/.configs/casc_configs/dir1/config.yaml`  \n:x: `/jenkins/.configs/casc_configs/.dir1/config.yaml`  \n:x: `/jenkins/.configs/casc_configs/..dir2/config.yaml`  \n\u003c/details\u003e\n\nAll configuration files that are discovered MUST be supplementary. They cannot overwrite each other's configuration values. This creates a conflict and raises a `ConfiguratorException`. Thus, the order of traversal does not matter to the final outcome.\n\nInstead of setting the `CASC_JENKINS_CONFIG` environment variable, you can also define using\nthe `casc.jenkins.config` Java property.  This is useful when installing Jenkins via a package\nmanagement tool and can't set an environment variable outside of a package-managed file, which could\nbe overwritten by an update.  For RHEL/CentOS systems, you can append the following to the\n`JENKINS_JAVA_OPTIONS` entry in `/etc/sysconfig/jenkins`\n \n  `-Dcasc.jenkins.config=/jenkins/casc_configs`\n \nIf you do not set the `CASC_JENKINS_CONFIG` environment variable or the `casc.jenkins.config` Java\nproperty, the plugin will default to looking for a single config file in\n`$JENKINS_HOME/jenkins.yaml`.\n\nIf set up correctly, you should be able to browse the Configuration as Code page `Manage Jenkins` -\u003e `Configuration as Code`.\n\n## Initial Configuration\n\nWhen configuring the first Jenkins instance, browse the examples shown in the [demos](demos)\ndirectory of this repository. If you have a plugin that does not have an example, consult the reference\nhelp document. Click the `Documentation` link at the bottom of the Configuration as Code page in your Jenkins instance.\n\n![Reference Page](images/reference.png)\n\nIf you want to configure a specific plugin, search the page for the name of the plugin. The page will\nshow you which root element belongs to the configuration. Most installed plugins belong under the `unclassified` root\nelement.\n\n![Unclassified Section](images/unclassified.png)\n\n## Examples\n\nSee [demos](demos) folder with various samples.\n\n### LDAP\n\nReplace user interface based configuration for LDAP with the text-based configuration.\n\n![configuration form](images/sample_form.png)\n\n```yaml\njenkins:\n  securityRealm:\n    ldap:\n      configurations:\n        - groupMembershipStrategy:\n            fromUserRecord:\n              attributeName: \"memberOf\"\n          inhibitInferRootDN: false\n          rootDN: \"dc=acme,dc=org\"\n          server: \"ldaps://ldap.acme.org:1636\"\n```\n\n### Yaml Aliases and Anchors\n\nReplace repeated elements with yaml anchors.\nAnchor keys must be prefixed with `x-` due to JCasC handling unknown root elements.\n\n```yaml\nx-jenkins-linux-node: \u0026jenkins_linux_node_anchor\n  remoteFS: \"/home/jenkins\"\n  launcher:\n    inbound:\n      workDirSettings:\n        disabled: true\n        failIfWorkDirIsMissing: false\n        internalDir: \"remoting\"\n        workDirPath: \"/tmp\"\n\njenkins:\n  nodes:\n    - permanent:\n        name: \"static-agent1\"\n        \u003c\u003c: *jenkins_linux_node_anchor\n    - permanent:\n        name: \"static-agent2\"\n        \u003c\u003c: *jenkins_linux_node_anchor\n```\n\nWhich produces two permanent agent nodes which can also be written like this.\n\n```yaml\njenkins:\n  nodes:\n    - permanent:\n        name: \"static-agent1\"\n        remoteFS: \"/home/jenkins\"\n        launcher:\n          inbound:\n            workDirSettings:\n              disabled: true\n              failIfWorkDirIsMissing: false\n              internalDir: \"remoting\"\n              workDirPath: \"/tmp\"\n    - permanent:\n        name: \"static-agent2\"\n        remoteFS: \"/home/jenkins\"\n        launcher:\n          inbound:\n            workDirSettings:\n              disabled: true\n              failIfWorkDirIsMissing: false\n              internalDir: \"remoting\"\n              workDirPath: \"/tmp\"\n```\n\n## Security considerations\nOnly Jenkins administrators are able to create or update a Jenkins instance using configuration as code configuration files.\nHowever, in some environments, administrators may choose to allow less privileged users to modify portions of the configuration files, for example by storing them in an SCM repository that those users have access to.\nAllowing non-administrators to edit these configuration files can pose various security risks, so any changes made by non-administrators must be reviewed for safety before they are applied.\n\nHere are some examples of changes that could be problematic:\n\n- Modification of the security realm or authorization strategy settings could give users higher permissions than intended.\n- Interpolation of secrets in unprotected contexts may expose sensitive data. For example, a snippet like `systemMessage: \"${SENSITIVE_VARIABLE}\"` could expose the value of a sensitive environment variable to all users who are able to access Jenkins.\n\n## Installing plugins\n\nWe don't support installing plugins with JCasC, so you need to use something else for this,\n\nDockers users can use:\\\n[https://github.com/jenkinsci/docker/#preinstalling-plugins](https://github.com/jenkinsci/docker/#preinstalling-plugins)\n\nKubernetes users:\\\n[https://github.com/jenkinsci/helm-charts](https://github.com/jenkinsci/helm-charts)\n\n## Supported Plugins\n\nMost plugins should be supported out-of-the-box or maybe require some minimal changes. See this [dashboard](https://issues.jenkins.io/secure/Dashboard.jspa?selectPageId=18341) for known compatibility issues.\n\n## Adding JCasC support to a plugin\n\nPlugin developers wanting to support JCasC in their plugin should [check out our how-to guide](docs/developer/plugins.md).\n\n## Configuration-as-Code extension plugins\n\n- [configuration-as-code-groovy-plugin](https://github.com/jenkinsci/configuration-as-code-groovy-plugin)\\\n  Allows specifying groovy code that should run on during configuration.\n\n## Developer Documentation\n\nSee the [Developer Guide](docs/developer/README.md).\n\n## Jenkins Enhancement Proposal\n\nAs configuration as code is demonstrated to be a highly requested topic in the Jenkins community, we have published\n[JEP 201](https://github.com/jenkinsci/jep/tree/master/jep/201) as a proposal to make this a standard component\nof the Jenkins project. The proposal was accepted. :tada:\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjenkinsci%2Fconfiguration-as-code-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjenkinsci%2Fconfiguration-as-code-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjenkinsci%2Fconfiguration-as-code-plugin/lists"}