blob: c6ea4bd60baee0f14439147588899730685cccb6 [file] [log] [blame]
#!/bin/bash
###############################################################################
#
# Script used to assist in launching Kubernetes jobs/pods. Expects to be used
# as an supplemental script to the build-setup.sh script as such will use some
# of the variables it expects to carry over from that script.
#
###############################################################################
#
# Requirements:
# - Docker login credentials defined inside ~/.docker/config.json
# - Kubectl installed and configured on machine running the script
# - Access to a Kubernetes Cluster using v1.5.2 or newer
# - NFS directories for OpenBMC repo cache, BitBake shared state cache, and
# shared Jenkins home directory that holds workspaces.
# - All NFS directories should have RWX permissions for user being used to run
# the build-setup.sh script
# - Persistent Volume and Claims created and mounted to NFS directories
# - Image pull secret exists for image pulls in Kubernetes cluster namespace
#
###############################################################################
# Variables used to create Kubernetes Job:
# namespace = the namespace to be used within the Kubernetes cluster
# hclaim = name of the Jenkins slave home PVC on Kubernetes cluster
# sclaim = name of the shared state cache PVC on Kubernetes cluster
# oclaim = name of OpenBMC cache repo PVC on the Kubernetes cluster
# registry = the registry to use to pull and push images
# imgplsec = the image pull secret used to access registry if needed
# timeout = the amount of time in seconds that the build will wait for
# the pod to start running on the cluster
# imgname = the name the image will be given when built, must include
# the repo in name for the push command to work.
# podname = the name of the pod, will be needed to trace down the logs
#
###############################################################################
# Kubernetes Variables
namespace=${namespace:-openbmc}
hclaim=${hclaim:-jenkins}
sclaim=${sclaim:-shared-state-cache}
oclaim=${oclaim:-openbmc-reference-repo}
imgrepo=${imgrepo:-master.cfc:8500/openbmc/}
imgplsec=${imgplsec:-regkey}
timeout=${timeout:-60}
# Give the Docker image and the pod a name
imgname=${imgname:-${imgrepo}${distro}:${imgtag}-${ARCH}}
podname=${podname:-openbmc${BUILD_ID}-${target}-builder}
# Build the Docker image, using the Dockerfile carried from build-setup.sh
docker build -t ${imgname} - <<< "${Dockerfile}"
# Push the image that was built to the image repository
docker push ${imgname}
if [[ "${launch}" == "pod" ]]; then
yamlfile=$(cat << EOF
apiVersion: v1
kind: Pod
metadata:
name: ${podname}
namespace: ${namespace}
spec:
nodeSelector:
worker: "true"
arch: ${ARCH}
volumes:
- name: home
persistentVolumeClaim:
claimName: ${hclaim}
- name: sscdir
persistentVolumeClaim:
claimName: ${sclaim}
- name: obmccache
persistentVolumeClaim:
claimName: ${oclaim}
hostNetwork: True
containers:
- image: ${imgname}
name: builder
command: ["${WORKSPACE}/build.sh"]
workingDir: ${HOME}
env:
- name: WORKSPACE
value: ${WORKSPACE}
- name: obmcdir
value: ${obmcdir}
securityContext:
capabilities:
add:
- SYS_ADMIN
volumeMounts:
- name: home
mountPath: ${HOME}
- name: sscdir
mountPath: ${sscdir}
- name: obmccache
mountPath: ${ocache}
imagePullSecrets:
- name: ${imgplsec}
EOF
)
elif [[ "${launch}" == "job" ]]; then
yamlfile=$(cat << EOF
apiVersion: batch/v1
kind: Job
metadata:
name: openbmc${BUILD_ID}-${target}
namespace: ${namespace}
labels:
app: openbmc
stage: build
spec:
template:
metadata:
name: ${podname}
labels:
target: ${target}
spec:
nodeSelector:
worker: "true"
arch: ${ARCH}
volumes:
- name: home
persistentVolumeClaim:
claimName: ${hclaim}
- name: sscdir
persistentVolumeClaim:
claimName: ${sclaim}
- name: obmccache
persistentVolumeClaim:
claimName: ${oclaim}
restartPolicy: Never
hostNetwork: True
containers:
- image: ${imgname}
name: builder
command: ["${WORKSPACE}/build.sh"]
workingDir: ${HOME}
env:
- name: WORKSPACE
value: ${WORKSPACE}
- name: obmcdir
value: ${obmcdir}
securityContext:
capabilities:
add:
- SYS_ADMIN
volumeMounts:
- name: home
mountPath: ${HOME}
- name: sscdir
mountPath: ${sscdir}
- name: obmccache
mountPath: ${ocache}
imagePullSecrets:
- name: ${imgplsec}
EOF
)
fi
kubectl create -f - <<< "${yamlfile}"
# Wait for Pod to be running before tailing log file
while [ -z "$(kubectl describe pod ${podname} -n ${namespace} | grep Status: | grep Running)" ]; do
if [ ${timeout} -lt 0 ];then
kubectl delete -f - <<< "${yamlfile}"
echo "Timeout Occured: Job failed to start running in time"
exit 1
else
sleep 1
let timeout-=1
fi
done
# Once pod is running track logs
kubectl logs -f ${podname} -n ${namespace}
# When job is completed wipe the job
kubectl delete -f - <<< "${yamlfile}"