161 lines
5 KiB
Nix
161 lines
5 KiB
Nix
{ 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"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
'';
|
|
};
|
|
};
|
|
|
|
}
|