mirror of
https://github.com/ceph/ceph-csi.git
synced 2025-01-18 02:39:30 +00:00
add scripts and configuration to deploy with Jenkins Job Builder
These files make it possible to - build a container image that includes Jenkins Job Builder - store the container image in the OpenShift ImageStream - use the container to validate or deploy the Jenkins Jobs More details about the files are included in the README.md. Signed-off-by: Niels de Vos <ndevos@redhat.com>
This commit is contained in:
parent
5caafe7539
commit
6d906b415f
22
deploy/Dockerfile
Normal file
22
deploy/Dockerfile
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
FROM centos:latest
|
||||||
|
|
||||||
|
RUN true \
|
||||||
|
&& yum -y install git make python3-pip \
|
||||||
|
&& pip3 install jenkins-job-builder \
|
||||||
|
&& yum -y clean all \
|
||||||
|
&& true
|
||||||
|
|
||||||
|
ENV MAKE_TARGET=${MAKE_TARGET:-test}
|
||||||
|
|
||||||
|
# Environment that needs to be set before executing checkout-repo.sh
|
||||||
|
# ENV GIT_REPO=https://github.com/ceph/ceph-csi
|
||||||
|
# ENV GIT_REF=ci/centos
|
||||||
|
ADD checkout-repo.sh /opt/build/
|
||||||
|
|
||||||
|
# make WORKDIR writable, otherwise git checkout fails
|
||||||
|
RUN chmod ugo=rwx /opt/build
|
||||||
|
|
||||||
|
ENV HOME=/opt/build
|
||||||
|
WORKDIR /opt/build
|
||||||
|
|
||||||
|
CMD ["sh", "-c", "./checkout-repo.sh && make -C deploy ${MAKE_TARGET}"]
|
8
deploy/Makefile
Normal file
8
deploy/Makefile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
WORKDIR ?= $(CURDIR)/../
|
||||||
|
OUTPUT ?= $(WORKDIR)/_output/
|
||||||
|
|
||||||
|
test:
|
||||||
|
jenkins-jobs test -o $(OUTPUT) $(WORKDIR)
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
jenkins-jobs update $(WORKDIR)
|
46
deploy/README.md
Normal file
46
deploy/README.md
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# Deploying Jenkins Jobs through OpenShift
|
||||||
|
|
||||||
|
This `deploy/` directory contains the configuration to prepare running Jenkins
|
||||||
|
Job Builder on OpenShift and update/add Jenkins Jobs in an environment hosted
|
||||||
|
in the same OpenShift project.
|
||||||
|
|
||||||
|
The used Jenkins environment is expected to be deployed already. This is done
|
||||||
|
by the CentOS CI team when a [request for CI resources](ci_request) is handled.
|
||||||
|
The deploying and configuration of Jenkins is therefor not part of this
|
||||||
|
document.
|
||||||
|
|
||||||
|
## Building the Jenkins Job Builder container image
|
||||||
|
|
||||||
|
OpenShift has a feature called ImageStreams. This can be used to build the
|
||||||
|
container image that contains the `jenkins-jobs` executable to test and
|
||||||
|
update/add jobs in a Jenkins environment.
|
||||||
|
|
||||||
|
All `.yaml` files in this directory need to be pushed into OpenShift, use `oc
|
||||||
|
create -f <file>` for that.
|
||||||
|
|
||||||
|
- the `Dockerfile` uses `pip` to install `jenkins-jobs`, the BuildConfig object
|
||||||
|
in OpenShift can then be used to build the image
|
||||||
|
- `checkout-repo.sh` will be included in the container image, and checks out
|
||||||
|
the `ci/centos` branch of the repository
|
||||||
|
- together with the `Makefile` (checked out with `checkout-repo.sh`), the
|
||||||
|
Jenkins Jobs can be validated or deployed
|
||||||
|
- `jjb-buildconfig.yaml` creates the ImageStream and the BuildConfig objects.
|
||||||
|
Once created with `oc create`, the OpenShift Console shows a `Build` button
|
||||||
|
for the `jjb` image under the Builds/Builds menu
|
||||||
|
- `jjb-config.yaml` is the `/etc/jenkins_jobs/jenkins_jobs.ini` configuration
|
||||||
|
files that contains username, password/token and URL to the Jenkins instance
|
||||||
|
(**edit this file before pushing to OpenShift**)
|
||||||
|
- `jjb-validate.yaml` is the OpenShift Job that creates a Pod, runs the
|
||||||
|
validation test and exits. The job needs to be deleted from OpenShift before
|
||||||
|
it can be run again.
|
||||||
|
- `jjb-deploy.yaml` is the OpenShift Job that creates a Pod, runs
|
||||||
|
`jenkins-jobs` to push the new jobs to the Jenkins environment. This pod uses
|
||||||
|
the jjb-config ConfigMap to connect and login to the Jenkins instance. The
|
||||||
|
job needs to be deleted from OpenShift before it can be run again.
|
||||||
|
- `jjb.sh` is a helper script that can be used to validate/deploy the Jenkins
|
||||||
|
Jobs in the parent directory. It creates the validate or deploy job, waits
|
||||||
|
until the job finishes, shows the log and exits with 0 on success. This
|
||||||
|
script can be used in Jenkins Jobs to automate the validation and deployment of
|
||||||
|
jobs.
|
||||||
|
|
||||||
|
[ci_request]: https://wiki.centos.org/QaWiki/CI/GettingStarted
|
17
deploy/checkout-repo.sh
Executable file
17
deploy/checkout-repo.sh
Executable file
@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
fail() {
|
||||||
|
echo "${@}" > /dev/stderr
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
[ -n "${GIT_REPO}" ] || fail 'GIT_REPO environment variable not set'
|
||||||
|
[ -n "${GIT_REF}" ] || fail 'GIT_REF environment variable not set'
|
||||||
|
|
||||||
|
# exit in case a command fails
|
||||||
|
set -e
|
||||||
|
|
||||||
|
git init .
|
||||||
|
git remote add origin "${GIT_REPO}"
|
||||||
|
git fetch origin "${GIT_REF}"
|
||||||
|
git checkout "${GIT_REF}"
|
30
deploy/jjb-buildconfig.yaml
Normal file
30
deploy/jjb-buildconfig.yaml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ImageStream
|
||||||
|
metadata:
|
||||||
|
name: jjb
|
||||||
|
labels:
|
||||||
|
app: jjb
|
||||||
|
spec:
|
||||||
|
tags:
|
||||||
|
- name: latest
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: BuildConfig
|
||||||
|
metadata:
|
||||||
|
name: jjb
|
||||||
|
labels:
|
||||||
|
app: jjb
|
||||||
|
spec:
|
||||||
|
runPolicy: Serial
|
||||||
|
source:
|
||||||
|
git:
|
||||||
|
uri: https://github.com/ceph/ceph-csi
|
||||||
|
ref: ci/centos
|
||||||
|
contextDir: deploy
|
||||||
|
strategy:
|
||||||
|
dockerStrategy: {}
|
||||||
|
output:
|
||||||
|
to:
|
||||||
|
kind: ImageStreamTag
|
||||||
|
name: jjb:latest
|
13
deploy/jjb-config.yaml
Normal file
13
deploy/jjb-config.yaml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: jenkins-jobs
|
||||||
|
labels:
|
||||||
|
app: jjb
|
||||||
|
data:
|
||||||
|
jenkins_jobs.ini: |-
|
||||||
|
[jenkins]
|
||||||
|
user=ndevos-admin-edit-view
|
||||||
|
password=<token-from-user-config-in-webui>
|
||||||
|
url=https://jenkins-ceph-csi.apps.ci.centos.org/
|
33
deploy/jjb-deploy.yaml
Normal file
33
deploy/jjb-deploy.yaml
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
---
|
||||||
|
apiVersion: batch/v1
|
||||||
|
kind: Job
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: jjb
|
||||||
|
name: jjb-deploy
|
||||||
|
spec:
|
||||||
|
ttlSecondsAfterFinished: 0
|
||||||
|
backoffLimit: 1
|
||||||
|
template:
|
||||||
|
labels:
|
||||||
|
app: jjb
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: jjb
|
||||||
|
image: 172.30.254.79:5000/ceph-csi/jjb:latest
|
||||||
|
env:
|
||||||
|
- name: GIT_REPO
|
||||||
|
value: https://github.com/ceph/ceph-csi
|
||||||
|
- name: GIT_REF
|
||||||
|
value: ci/centos
|
||||||
|
- name: MAKE_TARGET
|
||||||
|
value: deploy
|
||||||
|
volumeMounts:
|
||||||
|
- name: etc-jj
|
||||||
|
mountPath: /etc/jenkins_jobs
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: etc-jj
|
||||||
|
configMap:
|
||||||
|
name: jenkins-jobs
|
||||||
|
restartPolicy: Never
|
23
deploy/jjb-validate.yaml
Normal file
23
deploy/jjb-validate.yaml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
apiVersion: batch/v1
|
||||||
|
kind: Job
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: jjb-validate
|
||||||
|
name: jjb-validate
|
||||||
|
spec:
|
||||||
|
ttlSecondsAfterFinished: 0
|
||||||
|
backoffLimit: 1
|
||||||
|
template:
|
||||||
|
labels:
|
||||||
|
app: jjb-validate
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: jjb-validate
|
||||||
|
image: 172.30.254.79:5000/ceph-csi/jjb:latest
|
||||||
|
env:
|
||||||
|
- name: GIT_REPO
|
||||||
|
value: https://github.com/ceph/ceph-csi
|
||||||
|
- name: GIT_REF
|
||||||
|
value: ci/centos
|
||||||
|
restartPolicy: Never
|
57
deploy/jjb.sh
Executable file
57
deploy/jjb.sh
Executable file
@ -0,0 +1,57 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Create a new Job in OCP that runs the jbb-validate container once. This
|
||||||
|
# script will wait for completion of the validation, and uses the result of the
|
||||||
|
# container to report the status.
|
||||||
|
#
|
||||||
|
|
||||||
|
CMD="${1}"
|
||||||
|
|
||||||
|
get_pod_status() {
|
||||||
|
oc get pod/${1} --no-headers -o=jsonpath='{.status.phase}'
|
||||||
|
}
|
||||||
|
|
||||||
|
case "${CMD}" in
|
||||||
|
"validate")
|
||||||
|
;;
|
||||||
|
"deploy")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "no such command: ${CMD}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# make sure there is a valid OCP session
|
||||||
|
oc version || exit 1
|
||||||
|
|
||||||
|
# the deploy directory where this script is located, contains files we need
|
||||||
|
cd $(dirname ${0})
|
||||||
|
|
||||||
|
oc create -f jjb-${CMD}.yaml
|
||||||
|
|
||||||
|
# loop until pod is available
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
jjb_pod=$(oc get pods --no-headers -l job-name=jjb-${CMD} -o=jsonpath='{.items[0].metadata.name}')
|
||||||
|
[ ${?} = 0 ] && [ -n "${jjb_pod}" ] && break
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
# loop until the pod has finished
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
status=$(get_pod_status "${jjb_pod}")
|
||||||
|
# TODO: is Running as a status sufficient, did it terminate yet?
|
||||||
|
[ ${?} = 0 ] && ( [ "${status}" = "Succeeded" ] || [ "${status}" = "Failed" ] ) && break
|
||||||
|
sleep 0.5
|
||||||
|
done
|
||||||
|
|
||||||
|
# show the log of the finished pod
|
||||||
|
oc logs "${jjb_pod}"
|
||||||
|
|
||||||
|
# delete the job, so a next run can create it again
|
||||||
|
oc delete --wait -f jjb-${CMD}.yaml
|
||||||
|
|
||||||
|
# return the exit status of the pod
|
||||||
|
[ "${status}" = 'Succeeded' ]
|
Loading…
Reference in New Issue
Block a user