From 4d6a8484c10fcdabb1b92fbfe83397f698604cc6 Mon Sep 17 00:00:00 2001 From: Marlon Beijer Date: Sat, 6 Jun 2020 16:22:28 +0200 Subject: [PATCH] QoL fixes for Jenkins --- JenkinsEnv.json | 32 +++++++++++++++ Jenkinsfile | 102 ++++++++++++++++++++++++++++++++++++++++++++++ ppc-warpos.docker | 46 +++++++++++++++++++++ 3 files changed, 180 insertions(+) create mode 100644 JenkinsEnv.json create mode 100644 Jenkinsfile create mode 100644 ppc-warpos.docker diff --git a/JenkinsEnv.json b/JenkinsEnv.json new file mode 100644 index 0000000..c850fa1 --- /dev/null +++ b/JenkinsEnv.json @@ -0,0 +1,32 @@ +{ + "builds": [ + { + "DockerRoot": "amigadev", + "DockerImage": "crosstools", + "DockerTag": "m68k-amigaos", + "Dockerfile": "m68k-amigaos.docker", + "BuildIfSuccessful": "" + }, + { + "DockerRoot": "amigadev", + "DockerImage": "crosstools", + "DockerTag": "ppc-amigaos", + "Dockerfile": "ppc-amigaos.docker", + "BuildIfSuccessful": "" + }, + { + "DockerRoot": "amigadev", + "DockerImage": "crosstools", + "DockerTag": "ppc-morphos", + "Dockerfile": "ppc-morphos.docker", + "BuildIfSuccessful": "" + }, + { + "DockerRoot": "amigadev", + "DockerImage": "crosstools", + "DockerTag": "x86_64-aros", + "Dockerfile": "x86_64-aros.docker", + "BuildIfSuccessful": "" + } + ] +} \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..36266f7 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,102 @@ +def notify(status){ + emailext ( + body: '$DEFAULT_CONTENT', + recipientProviders: [ + [$class: 'CulpritsRecipientProvider'], + [$class: 'DevelopersRecipientProvider'], + [$class: 'RequesterRecipientProvider'] + ], + replyTo: '$DEFAULT_REPLYTO', + subject: '$DEFAULT_SUBJECT', + to: '$DEFAULT_RECIPIENTS' + ) +} + +@NonCPS +def killall_jobs() { + def jobname = env.JOB_NAME + def buildnum = env.BUILD_NUMBER.toInteger() + def killnums = "" + def job = Jenkins.instance.getItemByFullName(jobname) + def fixed_job_name = env.JOB_NAME.replace('%2F','/') + + for (build in job.builds) { + if (!build.isBuilding()) { continue; } + if (buildnum == build.getNumber().toInteger()) { continue; println "equals" } + if (buildnum < build.getNumber().toInteger()) { continue; println "newer" } + + echo "Kill task = ${build}" + + killnums += "#" + build.getNumber().toInteger() + ", " + + build.doStop(); + } + + if (killnums != "") { + slackSend color: "danger", channel: "#jenkins", message: "Killing task(s) ${fixed_job_name} ${killnums} in favor of #${buildnum}, ignore following failed builds for ${killnums}" + } + echo "Done killing" +} + +def buildStep(DOCKER_ROOT, DOCKERIMAGE, DOCKERTAG, DOCKERFILE, BUILD_NEXT) { + def fixed_job_name = env.JOB_NAME.replace('%2F','/') + try { + checkout scm; + + def buildenv = ''; + def tag = ''; + if (env.BRANCH_NAME.equals('master')) { + buildenv = 'production'; + tag = "${DOCKERTAG}"; + } else if (env.BRANCH_NAME.equals('dev')) { + buildenv = 'development'; + tag = "${DOCKERTAG}-dev"; + } else { + throw new Exception("Invalid branch, stopping build!"); + } + + docker.withRegistry("https://index.docker.io/v1/", "dockerhub") { + def customImage + stage("Building ${DOCKERIMAGE}:${tag}...") { + customImage = docker.build("${DOCKER_ROOT}/${DOCKERIMAGE}:${tag}", "--build-arg BUILDENV=${buildenv} --network=host --pull -f ${DOCKERFILE} ."); + } + + stage("Pushing to docker hub registry...") { + customImage.push(); + } + } + + if (!BUILD_NEXT.equals('')) { + build "${BUILD_NEXT}/${env.BRANCH_NAME}"; + } + } catch(err) { + slackSend color: "danger", channel: "#jenkins", message: "Build Failed: ${fixed_job_name} #${env.BUILD_NUMBER} Target: ${DOCKER_ROOT}/${DOCKERIMAGE}:${tag} (<${env.BUILD_URL}|Open>)" + currentBuild.result = 'FAILURE' + notify("Build Failed: ${fixed_job_name} #${env.BUILD_NUMBER} Target: ${DOCKER_ROOT}/${DOCKERIMAGE}:${tag}") + throw err + } +} + +node('master') { + killall_jobs(); + def fixed_job_name = env.JOB_NAME.replace('%2F','/'); + slackSend color: "good", channel: "#jenkins", message: "Build Started: ${fixed_job_name} #${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)"; + + checkout scm; + + def branches = [:] + def project = readJSON file: "JenkinsEnv.json"; + + project.builds.each { v -> + branches["Build ${v.DockerRoot}/${v.DockerImage}"] = { + node { + buildStep(v.DockerRoot, v.DockerImage, v.DockerTag, v.Dockerfile, v.BuildIfSuccessful) + } + } + } + + sh "rm -rf ./*" + + parallel branches; +} + diff --git a/ppc-warpos.docker b/ppc-warpos.docker new file mode 100644 index 0000000..63fe6e5 --- /dev/null +++ b/ppc-warpos.docker @@ -0,0 +1,46 @@ +FROM amigadev/morphos-cross-toolchain:warpos as build-env + +FROM amigadev/docker-base:latest + +ENV CROSS_PFX ppc-warpos +ENV OS_NAME WarpOS + +COPY --from=build-env /opt/${CROSS_PFX} /opt/${CROSS_PFX} + +# START COMMON +MAINTAINER Marlon Beijer "marlon@amigadev.com" +RUN apt update && apt install -y libtool automake autoconf && apt autoremove -y +RUN echo "root:root" | chpasswd +RUN chmod 777 -R /opt/${CROSS_PFX} +RUN ln -s /opt/${CROSS_PFX} /tools +ENV CROSS_ROOT /opt/${CROSS_PFX} + +WORKDIR /work +ENTRYPOINT ["/entry/entrypoint.sh"] + +COPY imagefiles/cmake.sh /usr/local/bin/cmake +COPY imagefiles/ccmake.sh /usr/local/bin/ccmake +COPY imagefiles/entrypoint.sh /entry/ + +ENV AS=${CROSS_ROOT}/bin/${CROSS_PFX}-as \ + LD=${CROSS_ROOT}/bin/${CROSS_PFX}-ld \ + AR=${CROSS_ROOT}/bin/${CROSS_PFX}-ar \ + CC=${CROSS_ROOT}/bin/${CROSS_PFX}-gcc \ + CXX=${CROSS_ROOT}/bin/${CROSS_PFX}-g++ \ + RANLIB=${CROSS_ROOT}/bin/${CROSS_PFX}-ranlib + +RUN ln -sf ${CROSS_ROOT}/bin/${CROSS_PFX}-as /usr/bin/as && \ + ln -sf ${CROSS_ROOT}/bin/${CROSS_PFX}-ar /usr/bin/ar && \ + ln -sf ${CROSS_ROOT}/bin/${CROSS_PFX}-ld /usr/bin/ld && \ + ln -sf ${CROSS_ROOT}/bin/${CROSS_PFX}-gcc /usr/bin/gcc && \ + ln -sf ${CROSS_ROOT}/bin/${CROSS_PFX}-g++ /usr/bin/g++ && \ + ln -sf ${CROSS_ROOT}/bin/${CROSS_PFX}-ranlib /usr/bin/ranlib + +COPY dependencies/toolchains/${CROSS_PFX}.cmake ${CROSS_ROOT}/lib/ +COPY dependencies/toolchains/Modules/${CROSS_PFX} /CMakeModules +RUN mv -fv /CMakeModules/* /usr/share/cmake-`cmake --version|awk '{ print $3;exit }'|awk -F. '{print $1"."$2}'`/Modules/ +RUN ln -s /usr/share/cmake-`cmake --version|awk '{ print $3;exit }'|awk -F. '{print $1"."$2}'`/Modules/Platform/Generic.cmake /usr/share/cmake-`cmake --version|awk '{ print $3;exit }'|awk -F. '{print $1"."$2}'`/Modules/Platform/${OS_NAME}.cmake +ENV CMAKE_TOOLCHAIN_FILE ${CROSS_ROOT}/lib/${CROSS_PFX}.cmake +ENV CMAKE_PREFIX_PATH /opt/${CROSS_PFX}:/opt/${CROSS_PFX}/usr +ENV PATH ${PATH}:${CROSS_ROOT}/bin +# END COMMON