{ lib, ... }: with builtins; # https://jenkinsci.github.io/job-dsl-plugin/ { # source container url and credentialsId job = name: { url , credentialsId , branch ? "master" , # https://docs.openstack.org/infra/jenkins-job-builder/triggers.html triggers ? [{ pollscm = { cron = "H/30 * * * *"; ignore-post-commit-hooks = true; }; }] , ... }: config: { job = { inherit name triggers; sandbox = true; project-type = "pipeline"; dsl = let stage = elem: let stageName = head (attrNames elem); stateScripts = map (stage: lib.getAttr (typeOf stage) { string = '' withEnv(['PATH=/run/current-system/sw/bin/','NIX_PATH=/var/src/']) { sh '${toString stage}' }''; set = let script = '' withEnv(['PATH=/run/current-system/sw/bin/','NIX_PATH=/var/src/']) { sh '${toString stage.script}' } ''; in if (stage.credentialsId != null) then '' sshagent(['${stage.credentialsId}']) { ${script} } '' else script; }) (getAttr stageName elem); in '' stage('${stageName}') { steps { ${concatStringsSep "\n" stateScripts} } } ''; stages = map stage config; in '' pipeline { agent any post { failure { mattermostSend channel: 'notification', color: '#FF0000', message: "Failed to build : [''${env.JOB_NAME}-''${env.BUILD_NUMBER}](''${env.BUILD_URL})" } success { mattermostSend channel: 'jenkins', color: '#00FF00', message: "Successfully build : [''${env.JOB_NAME}-''${env.BUILD_NUMBER}](''${env.JOB_URL})" } } stages{ stage('Pull') { steps { checkout( [$class: 'GitSCM' , branches: [[name: '*/${branch}']] , doGenerateSubmoduleConfigurations: false , extensions: [[$class: 'LocalBranch', localBranch: 'master']] , submoduleCfg: [] , userRemoteConfigs: [[ credentialsId: '${credentialsId}' , url: '${url}']] ] ) } } ${concatStringsSep "\n" stages} } } ''; }; }; # creates a sync job # source and target container url and credentialsId syncJob = name: source: target: { job = { name = name; sandbox = true; project-type = "pipeline"; triggers = [{ pollscm = { cron = "H/30 * * * *"; ignore-post-commit-hooks = true; }; }]; dsl = '' pipeline { agent any post { failure { mattermostSend channel: 'notification', color: '#FF0000', message: "Failed to build : [''${env.JOB_NAME}-''${env.BUILD_NUMBER}](''${env.BUILD_URL})" } success { mattermostSend channel: 'jenkins', color: '#00FF00', message: "Successfully build : [''${env.JOB_NAME}-''${env.BUILD_NUMBER}](''${env.JOB_URL})" } } stages{ stage('Pull') { steps { checkout( [$class: 'GitSCM' , branches: [[name: '*/master']] , doGenerateSubmoduleConfigurations: false , extensions: [[$class: 'LocalBranch', localBranch: 'master']] , submoduleCfg: [] , userRemoteConfigs: [[ credentialsId: '${source.credentialsId}' , url: '${source.url}']] ] ) } } stage('Push') { steps { sshagent(['${target.credentialsId}']) { withEnv(['PATH=/run/current-system/sw/bin/','NIX_PATH=/var/src/']) { sh "git push -f ${target.url}" } } } } stage('Push Tags') { steps { sshagent(['${target.credentialsId}']) { withEnv(['PATH=/run/current-system/sw/bin/']) { sh "git push -f ${target.url} --tags" } } } } } } ''; }; }; }