Trigger backup before Jenkins master pod deletion
This commit is contained in:
parent
d7fdac5e9a
commit
9e6c44484c
|
|
@ -55,7 +55,6 @@ Base configuration:
|
||||||
|
|
||||||
User configuration:
|
User configuration:
|
||||||
* backup and restore for Jenkins jobs running as standalone job (AWS, GCP, Azure)
|
* backup and restore for Jenkins jobs running as standalone job (AWS, GCP, Azure)
|
||||||
* trigger backup job before pod deletion using preStop k8s hooks
|
|
||||||
* verify Jenkins configuration events
|
* verify Jenkins configuration events
|
||||||
|
|
||||||
[installation]:docs/installation.md
|
[installation]:docs/installation.md
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const (
|
||||||
jenkinsScriptsVolumeName = "scripts"
|
jenkinsScriptsVolumeName = "scripts"
|
||||||
jenkinsScriptsVolumePath = "/var/jenkins/scripts"
|
jenkinsScriptsVolumePath = "/var/jenkins/scripts"
|
||||||
initScriptName = "init.sh"
|
initScriptName = "init.sh"
|
||||||
|
backupScriptName = "backup.sh"
|
||||||
|
|
||||||
jenkinsOperatorCredentialsVolumeName = "operator-credentials"
|
jenkinsOperatorCredentialsVolumeName = "operator-credentials"
|
||||||
jenkinsOperatorCredentialsVolumePath = "/var/jenkins/operator-credentials"
|
jenkinsOperatorCredentialsVolumePath = "/var/jenkins/operator-credentials"
|
||||||
|
|
@ -34,7 +35,9 @@ const (
|
||||||
JenkinsUserConfigurationVolumePath = "/var/jenkins/user-configuration"
|
JenkinsUserConfigurationVolumePath = "/var/jenkins/user-configuration"
|
||||||
|
|
||||||
jenkinsBackupCredentialsVolumeName = "backup-credentials"
|
jenkinsBackupCredentialsVolumeName = "backup-credentials"
|
||||||
jenkinsBackupCredentialsVolumePath = "/var/jenkins/backup-credentials"
|
// JenkinsBackupCredentialsVolumePath is a path where are credentials used for backup/restore
|
||||||
|
// credentials are provided by user
|
||||||
|
JenkinsBackupCredentialsVolumePath = "/var/jenkins/backup-credentials"
|
||||||
|
|
||||||
httpPortName = "http"
|
httpPortName = "http"
|
||||||
slavePortName = "slavelistener"
|
slavePortName = "slavelistener"
|
||||||
|
|
@ -81,6 +84,16 @@ func NewJenkinsMasterPod(objectMeta metav1.ObjectMeta, jenkins *virtuslabv1alpha
|
||||||
"bash",
|
"bash",
|
||||||
fmt.Sprintf("%s/%s", jenkinsScriptsVolumePath, initScriptName),
|
fmt.Sprintf("%s/%s", jenkinsScriptsVolumePath, initScriptName),
|
||||||
},
|
},
|
||||||
|
Lifecycle: &corev1.Lifecycle{
|
||||||
|
PreStop: &corev1.Handler{
|
||||||
|
Exec: &corev1.ExecAction{
|
||||||
|
Command: []string{
|
||||||
|
"bash",
|
||||||
|
fmt.Sprintf("%s/%s", jenkinsScriptsVolumePath, backupScriptName),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
LivenessProbe: &corev1.Probe{
|
LivenessProbe: &corev1.Probe{
|
||||||
Handler: corev1.Handler{
|
Handler: corev1.Handler{
|
||||||
HTTPGet: &corev1.HTTPGetAction{
|
HTTPGet: &corev1.HTTPGetAction{
|
||||||
|
|
@ -157,7 +170,7 @@ func NewJenkinsMasterPod(objectMeta metav1.ObjectMeta, jenkins *virtuslabv1alpha
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: jenkinsBackupCredentialsVolumeName,
|
Name: jenkinsBackupCredentialsVolumeName,
|
||||||
MountPath: jenkinsBackupCredentialsVolumePath,
|
MountPath: JenkinsBackupCredentialsVolumePath,
|
||||||
ReadOnly: true,
|
ReadOnly: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -264,6 +264,70 @@ echo "Installing plugins - end"
|
||||||
/sbin/tini -s -- /usr/local/bin/jenkins.sh
|
/sbin/tini -s -- /usr/local/bin/jenkins.sh
|
||||||
`))
|
`))
|
||||||
|
|
||||||
|
const backupBashFmt = `#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# don't add set -e
|
||||||
|
|
||||||
|
JENKINS_SERVER="http://%s:$(cat %s/%s)@localhost:%d"
|
||||||
|
JOB="%s"
|
||||||
|
JOB_QUERY=/job/${JOB}
|
||||||
|
|
||||||
|
echo 'Starting the build'
|
||||||
|
curl -f -v -X POST "${JENKINS_SERVER}${JOB_QUERY}/build?delay=0sec" || exit -1
|
||||||
|
sleep 3 # give some time for Jenkins to update builds numbers
|
||||||
|
|
||||||
|
BUILD_STATUS_QUERY=/lastBuild/api/json
|
||||||
|
|
||||||
|
CURRENT_BUILD_NUMBER_QUERY=/lastBuild/buildNumber
|
||||||
|
CURRENT_BUILD_JSON=$(curl -s -f "${JENKINS_SERVER}${JOB_QUERY}${CURRENT_BUILD_NUMBER_QUERY}")
|
||||||
|
LAST_STABLE_BUILD_NUMBER_QUERY=/lastStableBuild/buildNumber
|
||||||
|
|
||||||
|
check_build()
|
||||||
|
{
|
||||||
|
GOOD_BUILD="Last build successful. "
|
||||||
|
BAD_BUILD="Last build failed. "
|
||||||
|
JOB_STATUS_JSON=$(curl -s -f "${JENKINS_SERVER}${JOB_QUERY}${BUILD_STATUS_QUERY}")
|
||||||
|
RESULT=$(echo "${JOB_STATUS_JSON}" | sed -n 's/.*"result":\([\"A-Za-z]*\),.*/\1/p')
|
||||||
|
CURRENT_BUILD_NUMBER=${CURRENT_BUILD_JSON}
|
||||||
|
LAST_STABLE_BUILD_JSON=$(curl --silent "${JENKINS_SERVER}${JOB_QUERY}${LAST_STABLE_BUILD_NUMBER_QUERY}")
|
||||||
|
LAST_STABLE_BUILD_NUMBER=${LAST_STABLE_BUILD_JSON}
|
||||||
|
LAST_BUILD_STATUS=${GOOD_BUILD}
|
||||||
|
echo "${LAST_STABLE_BUILD_NUMBER}" | grep "is not available" > /dev/null
|
||||||
|
GREP_RETURN_CODE=$?
|
||||||
|
if [[ ${GREP_RETURN_CODE} -ne 0 ]]
|
||||||
|
then
|
||||||
|
if [[ $(expr ${CURRENT_BUILD_NUMBER} - 1) -gt ${LAST_STABLE_BUILD_NUMBER} ]]
|
||||||
|
then
|
||||||
|
LAST_BUILD_STATUS=${BAD_BUILD}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${RESULT}" = "null" ]]
|
||||||
|
then
|
||||||
|
echo "${LAST_BUILD_STATUS}Building ${JOB} ${CURRENT_BUILD_NUMBER}... last stable was ${LAST_STABLE_BUILD_NUMBER}"
|
||||||
|
elif [[ "${RESULT}" = "\"SUCCESS\"" ]]
|
||||||
|
then
|
||||||
|
echo "${LAST_BUILD_STATUS}${JOB} ${CURRENT_BUILD_NUMBER} completed successfully."
|
||||||
|
exit 0
|
||||||
|
elif [[ "${RESULT}" = "\"FAILURE\"" ]]
|
||||||
|
then
|
||||||
|
LAST_BUILD_STATUS=${BAD_BUILD}
|
||||||
|
echo "${LAST_BUILD_STATUS}${JOB} ${CURRENT_BUILD_NUMBER} failed"
|
||||||
|
exit -1
|
||||||
|
else
|
||||||
|
LAST_BUILD_STATUS=${BAD_BUILD}
|
||||||
|
echo "${LAST_BUILD_STATUS}${JOB} ${CURRENT_BUILD_NUMBER} status unknown - '${RESULT}'"
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
while [[ true ]]
|
||||||
|
do
|
||||||
|
check_build
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
`
|
||||||
|
|
||||||
func buildConfigMapTypeMeta() metav1.TypeMeta {
|
func buildConfigMapTypeMeta() metav1.TypeMeta {
|
||||||
return metav1.TypeMeta{
|
return metav1.TypeMeta{
|
||||||
Kind: "ConfigMap",
|
Kind: "ConfigMap",
|
||||||
|
|
@ -313,6 +377,8 @@ func NewScriptsConfigMap(meta metav1.ObjectMeta, jenkins *virtuslabv1alpha1.Jenk
|
||||||
Data: map[string]string{
|
Data: map[string]string{
|
||||||
initScriptName: *initBashScript,
|
initScriptName: *initBashScript,
|
||||||
installPluginsCommand: fmt.Sprintf(installPluginsBashFmt, jenkinsHomePath),
|
installPluginsCommand: fmt.Sprintf(installPluginsBashFmt, jenkinsHomePath),
|
||||||
|
backupScriptName: fmt.Sprintf(backupBashFmt,
|
||||||
|
OperatorUserName, jenkinsOperatorCredentialsVolumePath, OperatorCredentialsSecretTokenKey, HTTPPortInt, constants.BackupJobName),
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue