{"id":49410,"date":"2025-05-21T06:48:37","date_gmt":"2025-05-21T06:48:37","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49410"},"modified":"2026-02-21T07:28:38","modified_gmt":"2026-02-21T07:28:38","slug":"rundeck-project-scm-export-and-scm-import","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/rundeck-project-scm-export-and-scm-import\/","title":{"rendered":"Rundeck Project SCM Export and SCM Import"},"content":{"rendered":"\n<p>The <strong>Rundeck Project SCM Export<\/strong> and <strong>SCM Import<\/strong> features are designed to <strong>version control your job definitions and project configuration<\/strong>, by integrating Rundeck projects with a <strong>source control management system<\/strong> (SCM), typically Git.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde0 Why SCM Integration Matters in Rundeck<\/h2>\n\n\n\n<p>When you&#8217;re managing automation jobs in production, it&#8217;s crucial to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Version your job definitions<\/li>\n\n\n\n<li>Audit who changed what and when<\/li>\n\n\n\n<li>Sync changes across environments (dev \u2192 staging \u2192 prod)<\/li>\n\n\n\n<li>Enable team collaboration<\/li>\n\n\n\n<li>Backup and restore project configuration<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd01 Rundown of SCM Import vs. Export<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Purpose<\/th><th>Typical Use<\/th><\/tr><\/thead><tbody><tr><td><strong>SCM Import<\/strong><\/td><td>Pulls job definitions from a Git repo into Rundeck<\/td><td>Manage Rundeck from source control<\/td><\/tr><tr><td><strong>SCM Export<\/strong><\/td><td>Pushes job changes in Rundeck to a Git repo<\/td><td>Let Rundeck act as the source of truth<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd3d <strong>SCM Import Plugin<\/strong> (Git \u2192 Rundeck)<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"878\" height=\"582\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/05\/image-11.png\" alt=\"\" class=\"wp-image-49411\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/05\/image-11.png 878w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/05\/image-11-300x199.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/05\/image-11-768x509.png 768w\" sizes=\"auto, (max-width: 878px) 100vw, 878px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u2705 Use Case<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You <strong>store Rundeck jobs in Git<\/strong><\/li>\n\n\n\n<li>Rundeck automatically <strong>imports<\/strong> the latest changes from the repository<\/li>\n\n\n\n<li>Useful in <strong>CI\/CD pipelines<\/strong> or for managing jobs as code<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd27 Behavior<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>When jobs are added\/updated in Git \u2192 Rundeck pulls and reflects those changes<\/li>\n\n\n\n<li>Can be set to <strong>auto-import<\/strong> or <strong>manual pull<\/strong><\/li>\n\n\n\n<li>Requires correct YAML\/XML format in the repo<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd3c <strong>SCM Export Plugin<\/strong> (Rundeck \u2192 Git)<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"587\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/05\/image-12.png\" alt=\"\" class=\"wp-image-49412\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/05\/image-12.png 803w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/05\/image-12-300x219.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/05\/image-12-768x561.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u2705 Use Case<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You <strong>create or modify jobs within Rundeck GUI<\/strong><\/li>\n\n\n\n<li>You want those changes <strong>committed to Git<\/strong> for versioning<\/li>\n\n\n\n<li>Useful for <strong>auditing<\/strong>, <strong>backups<\/strong>, and <strong>collaboration<\/strong><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd27 Behavior<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rundeck tracks changes to jobs<\/li>\n\n\n\n<li>Changes can be <strong>auto-committed<\/strong> or <strong>reviewed before commit<\/strong><\/li>\n\n\n\n<li>Commit messages and author info can be customized<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd01 Typical Workflow in a Team<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Developer <strong>edits a job<\/strong> in the Rundeck GUI<\/li>\n\n\n\n<li><strong>SCM Export<\/strong> pushes that change to Git (like <code>jobs\/web-server.yaml<\/code>)<\/li>\n\n\n\n<li>Another team member <strong>updates the same file in Git<\/strong> (e.g., via PR)<\/li>\n\n\n\n<li><strong>SCM Import<\/strong> detects the change and <strong>pulls it back<\/strong> into Rundeck<\/li>\n<\/ol>\n\n\n\n<p>This ensures <strong>bi-directional sync<\/strong> between Git and Rundeck.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd27 How to Enable<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to:<br><strong>Project Settings \u2192 SCM \u2192 Export\/Import<\/strong><\/li>\n\n\n\n<li>Choose:\n<ul class=\"wp-block-list\">\n<li>SCM Type: <code>Git<\/code><\/li>\n\n\n\n<li>Storage: local Git repo or SSH\/HTTPS remote<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Configure:\n<ul class=\"wp-block-list\">\n<li>Repo URL<\/li>\n\n\n\n<li>Branch<\/li>\n\n\n\n<li>File format: YAML, XML<\/li>\n\n\n\n<li>Auto-import\/export options<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udce6 File Structure in Git Repo<\/h2>\n\n\n\n<p>A typical exported repo looks like:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">jobs\/\n\u251c\u2500\u2500 job-1.yaml\n\u251c\u2500\u2500 job-2.yaml\nscm-status.json\n<\/code><\/span><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li>Each job gets its own file<\/li>\n\n\n\n<li>Metadata like UUID and project name are retained<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 Benefits<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Benefit<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>\ud83d\udd53 <strong>Versioning<\/strong><\/td><td>Track every change to a job with Git history<\/td><\/tr><tr><td>\ud83d\udc65 <strong>Team collaboration<\/strong><\/td><td>Manage jobs via pull requests and reviews<\/td><\/tr><tr><td>\u267b\ufe0f <strong>Sync across environments<\/strong><\/td><td>Use Git to promote jobs across dev \u2192 prod<\/td><\/tr><tr><td>\ud83d\udd10 <strong>Auditability<\/strong><\/td><td>Know who changed what and when<\/td><\/tr><tr><td>\ud83d\udce6 <strong>Backup &amp; Restore<\/strong><\/td><td>Git becomes a resilient backup of job configs<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u26a0\ufe0f Things to Keep in Mind<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jobs must have <strong>unique UUIDs<\/strong> to prevent duplication<\/li>\n\n\n\n<li>Conflicts between Git and GUI may occur (manual resolution needed)<\/li>\n\n\n\n<li>You may need to <strong>ignore <code>scm-status.json<\/code><\/strong> in <code>.gitignore<\/code><\/li>\n\n\n\n<li>Secure Git access (SSH keys or HTTPS tokens) must be configured properly<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The Rundeck Project SCM Export and SCM Import features are designed to version control your job definitions and project configuration, by integrating Rundeck projects with a source control management system&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-49410","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=49410"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49410\/revisions"}],"predecessor-version":[{"id":58980,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49410\/revisions\/58980"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}