├── Jenkinsfile ├── LICENSE ├── README.md ├── buildscripts ├── buildImage.groovy ├── releaseImage.groovy └── settings.groovy └── java-openjdk ├── Dockerfile ├── Jenkinsfile └── settings.groovy /Jenkinsfile: -------------------------------------------------------------------------------- 1 | /** Jenkins 2.0 Buildfile 2 | * 3 | * Master Jenkins 2.0 can be started by typing: 4 | * docker run -d -p 8090:8080 --name jenkins blacklabelops/jenkins 5 | * 6 | * Slave 'docker' can be started by typing: 7 | * docker run -d -v /var/run/docker.sock:/var/run/docker.sock --link jenkins:jenkins -e "SWARM_CLIENT_LABELS=docker" blacklabelops/swarm-dockerhost 8 | **/ 9 | node { 10 | checkout scm 11 | stage 'Build & Test Images' 12 | parallel( 13 | "image-openjdk": { load 'java-openjdk/Jenkinsfile' }) 14 | } 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Steffen Bleul 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dockerized Java Images 2 | 3 | ## Supported OpenJDK Images 4 | 5 | | Java Version | Tag | Dockerfile | 6 | |--------------|-----|------------| 7 | | Java JRE 8 | openjre.8 | [Dockerfile](https://github.com/blacklabelops/java/blob/master/java-openjdk/Dockerfile) | 8 | | Java JDK 8 | openjdk.8 | [Dockerfile](https://github.com/blacklabelops/java/blob/master/java-openjdk/Dockerfile) | 9 | 10 | # Make It Short 11 | 12 | ~~~~ 13 | $ docker run blacklabelops/java java -version 14 | ~~~~ 15 | 16 | > Will print the java version on console. 17 | 18 | # How-To Extend 19 | 20 | Example Dockerfile: 21 | 22 | ~~~~ 23 | FROM blacklabelops/java 24 | MAINTAINER Your Name 25 | 26 | RUN Install-Your-Tooling 27 | ~~~~ 28 | 29 | > Will use Java JRE 8 as your base image. 30 | 31 | Need the JDK? 32 | 33 | Example Dockerfile: 34 | 35 | ~~~~ 36 | FROM blacklabelops/java:jdk8 37 | MAINTAINER Your Name 38 | 39 | RUN Install-Your-Tooling 40 | ~~~~ 41 | 42 | > Will use Java JDK 8 as your base image. 43 | 44 | # Build Image 45 | 46 | Take a Dockerfile and build with the default arguments: 47 | 48 | ~~~~ 49 | $ docker build -t blacklabelops/java -f java-openjdk/Dockerfile . 50 | ~~~~ 51 | 52 | Build a specific version with the following build arguments: 53 | 54 | * JAVA_DISTRIBUTION: jdk, jre, or server-jre (default: jdk) 55 | * JAVA_MAJOR_VERSION: 7 or 8 56 | * JAVA_UPDATE_VERSION: The minor version. 57 | * JAVA_BUILD_NUMBER: The build number. 58 | 59 | # References 60 | 61 | * [Docker Homepage](https://www.docker.com/) 62 | * [Docker Userguide](https://docs.docker.com/userguide/) 63 | -------------------------------------------------------------------------------- /buildscripts/buildImage.groovy: -------------------------------------------------------------------------------- 1 | /** 2 | * Jenkins 2.0 Buildfile 3 | **/ 4 | 5 | def getBranchName() { 6 | def branchName = env.JOB_NAME.replaceFirst('.+/', '') 7 | echo 'Building on Branch: ' + branchName 8 | def tagPostfix = '' 9 | if (branchName != null && !'master'.equals(branchName)) { 10 | tagPostfix = branchName 11 | } 12 | return tagPostfix 13 | } 14 | 15 | def buildJobPullImages(dockerImages) { 16 | for (int i=0;i < dockerImages.length;i++) { 17 | pullImage(dockerImages[i]) 18 | } 19 | } 20 | 21 | def buildJobCI(dockerWorkspace,dockerImageName,dockerTestCommands,branchName,imageargs) { 22 | for (int i=0;i < imageargs.length;i++) { 23 | if (!"latest".equals(imageargs[i][0])) { 24 | echo 'Setting new tagname' 25 | tagname = imageargs[i][0] + "." + imageargs[i][2] 26 | echo 'Tagname: ' + tagname 27 | 28 | echo 'Building Image' 29 | buildImage(dockerWorkspace,dockerImageName,tagname,branchName,imageargs[i]) 30 | 31 | echo 'Testing Image' 32 | if ("jre".equals(imageargs[i][1])) { 33 | echo 'Triggering JRE Test' 34 | testImage(dockerImageName,tagname,branchName,dockerTestCommands.dockerTestCommandsJRE) 35 | } else { 36 | echo 'Triggering JDK Test' 37 | testImage(dockerImageName,tagname,branchName,dockerTestCommands.dockerTestCommandsJDK) 38 | } 39 | 40 | echo 'Setting new tagname' 41 | tagname = imageargs[i][0] + "." + imageargs[i][2] + "." + imageargs[i][3] 42 | echo 'Tagname: ' + tagname 43 | 44 | echo 'Building Image' 45 | buildImage(dockerWorkspace,dockerImageName,tagname,branchName,imageargs[i]) 46 | 47 | echo 'Testing Image' 48 | if ("jre".equals(imageargs[i][1])) { 49 | echo 'Triggering JRE Test' 50 | testImage(dockerImageName,tagname,branchName,dockerTestCommands.dockerTestCommandsJRE) 51 | } else { 52 | echo 'Triggering JDK Test' 53 | testImage(dockerImageName,tagname,branchName,dockerTestCommands.dockerTestCommandsJDK) 54 | } 55 | } else { 56 | echo 'Building Image' 57 | buildImage(dockerWorkspace,dockerImageName,imageargs[i][0],branchName,imageargs[i]) 58 | 59 | echo 'Testing Image' 60 | if ("jre".equals(imageargs[i][1]) || "server-jre".equals(imageargs[i][1])) { 61 | echo 'Triggering JRE Test' 62 | testImage(dockerImageName,imageargs[i][0],branchName,dockerTestCommands.dockerTestCommandsJRE) 63 | } else { 64 | echo 'Triggering JDK Test' 65 | testImage(dockerImageName,imageargs[i][0],branchName,dockerTestCommands.dockerTestCommandsJDK) 66 | } 67 | } 68 | } 69 | } 70 | 71 | def pullImage(imageName) { 72 | echo 'Refreshing image: ' + imageName 73 | sh 'docker pull ' + imageName 74 | } 75 | 76 | def testImage(imageName, tagName, branchName, dockerCommands) { 77 | def branchSuffix = branchName?.trim() ? '-' + branchName : '' 78 | def image = imageName + ':' + tagName + branchSuffix 79 | for (int i=0;i < dockerCommands.length;i++) { 80 | echo 'Testing image: ' + image 81 | sh 'docker run --rm ' + image + ' ' + dockerCommands[i] 82 | } 83 | } 84 | 85 | def buildImage(dockerWorkspace, imageName, tagName, branchName, buildargs) { 86 | def branchSuffix = branchName?.trim() ? '-' + branchName : '' 87 | def image = imageName + ':' + tagName + branchSuffix 88 | echo 'Building image: ' + image 89 | if (buildargs.length > 5) 90 | sh 'cd ' + dockerWorkspace + ' && docker build --no-cache --build-arg JAVA_DISTRIBUTION=' + buildargs[1] + ' --build-arg JAVA_MAJOR_VERSION=' + buildargs[2] + ' --build-arg JAVA_UPDATE_VERSION=' + buildargs[3] + ' --build-arg JAVA_BUILD_NUMBER=' + buildargs[4] + ' --build-arg JAVA_HASH=' + buildargs[5] + ' --build-arg BUILD_DATE="' + new Date().format('dd/MM/yyyy-HH:mmZ') + '" -t ' + image + ' .' 91 | else 92 | sh 'cd ' + dockerWorkspace + ' && docker build --no-cache --build-arg JAVA_DISTRIBUTION=' + buildargs[1] + ' --build-arg JAVA_MAJOR_VERSION=' + buildargs[2] + ' --build-arg JAVA_UPDATE_VERSION=' + buildargs[3] + ' --build-arg JAVA_BUILD_NUMBER=' + buildargs[4] + ' --build-arg JAVA_HASH=' + ' --build-arg BUILD_DATE="' + new Date().format('dd/MM/yyyy-HH:mm-Z') + '" -t ' + image + ' .' 93 | } 94 | 95 | return this; 96 | -------------------------------------------------------------------------------- /buildscripts/releaseImage.groovy: -------------------------------------------------------------------------------- 1 | /** 2 | * Jenkins 2.0 Buildfile 3 | **/ 4 | 5 | def pushImages(dockerRepositories,branchName,imageargs) { 6 | stage 'Repository-Push' 7 | for (int i=0;i < imageargs.length;i++) { 8 | if (!"latest".equals(imageargs[i][0])) { 9 | echo 'Setting new tagname' 10 | tagname = imageargs[i][0] + "." + imageargs[i][2] 11 | echo 'Tagname: ' + tagname 12 | 13 | echo 'Pushing Image' 14 | dockerPush(dockerImageName,tagname,branchName,dockerRepositories[0][0]) 15 | 16 | echo 'Setting new tagname' 17 | tagname = imageargs[i][0] + "." + imageargs[i][2] + "." + imageargs[i][3] 18 | echo 'Tagname: ' + tagname 19 | 20 | echo 'Pushing Image' 21 | dockerPush(dockerImageName,tagname,branchName,dockerRepositories[0][0]) 22 | } else { 23 | dockerPush(dockerImageName,imageargs[i][0],branchName,dockerRepositories[0][0]) 24 | } 25 | } 26 | } 27 | 28 | /** 29 | * Docker needs three parameters to work, I distributed those Credentials inside 30 | * two Jenkins-UsernamePassword Credentials. 31 | * Credentials 'Dockerhub' with Dockerhub username and password 32 | * Credentials 'DockerhubEmail' with the email inside the password field. 33 | **/ 34 | def repositoryLogin(remoteRepository,credentialsAId,credentialsBId) { 35 | echo 'Login to Dockerhub with Credentials Dockerhub and DockerhubEmail' 36 | withCredentials([[$class: 'UsernamePasswordMultiBinding', 37 | credentialsId: credentialsAId, 38 | usernameVariable: 'USERNAME', 39 | passwordVariable: 'PASSWORD']]) { 40 | withCredentials([[$class: 'UsernamePasswordMultiBinding', 41 | credentialsId: credentialsBId, 42 | usernameVariable: 'DUMMY', 43 | passwordVariable: 'EMAIL']]) { 44 | sh 'docker login --email $EMAIL --username $USERNAME --password $PASSWORD ' + remoteRepository 45 | } 46 | } 47 | } 48 | 49 | def dockerPush(imageName, tagName, branchName, remoteRepository) { 50 | def branchSuffix = branchName?.trim() ? '-' + branchName : '' 51 | def repositoyToken = remoteRepository?.trim() ? remoteRepository + '/' : '' 52 | def image = remoteRepository + imageName + ':' + tagName + branchSuffix 53 | sh 'docker push ' + image 54 | } 55 | 56 | return this; 57 | -------------------------------------------------------------------------------- /buildscripts/settings.groovy: -------------------------------------------------------------------------------- 1 | /** 2 | * Jenkins 2.0 Buildfile 3 | **/ 4 | 5 | /** 6 | * Build parameters, must be adjusted when forked! 7 | **/ 8 | dockerImageName = 'blacklabelops/java' 9 | dockerTestCommandsJDK = 10 | ["java -version", 11 | "javac -version", 12 | "which java"] as String[] 13 | dockerTestCommandsJRE = 14 | ["java -version", 15 | "which java"] as String[] 16 | dockerRepositories = [["","Dockerhub","DockerhubEmail"]] as String[][] 17 | 18 | oracle_8_java_major_version = "8" 19 | oracle_8_java_update_version = "162" 20 | oracle_8_java_build_number = "12" 21 | oracle_8_java_hash="0da788060d494f5095bf8624735fa2f1" 22 | 23 | openjdk_8_java_major_version = "8" 24 | openjdk_8_java_update_version = "151" 25 | openjdk_8_java_build_number = "12-r0" 26 | 27 | http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz 28 | 29 | return this; 30 | -------------------------------------------------------------------------------- /java-openjdk/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM blacklabelops/alpine:3.7 2 | 3 | ARG JAVA_DISTRIBUTION=jre 4 | ARG JAVA_MAJOR_VERSION=8 5 | ARG JAVA_UPDATE_VERSION=latest 6 | ARG JAVA_BUILD_NUMBER= 7 | ARG JAVA_HASH= 8 | ARG BUILD_DATE=undefined 9 | 10 | RUN if [ "${JAVA_DISTRIBUTION}" = "jre" ]; \ 11 | then export JAVA_PACKAGE_POSTFIX_VERSION=-jre ; \ 12 | else export JAVA_PACKAGE_POSTFIX_VERSION= ; \ 13 | fi && \ 14 | export JAVA_VERSION=${JAVA_MAJOR_VERSION}.${JAVA_UPDATE_VERSION}.${JAVA_BUILD_NUMBER} && \ 15 | if [ "${JAVA_UPDATE_VERSION}" = "latest" ]; \ 16 | then apk add --update openjdk${JAVA_MAJOR_VERSION}${JAVA_PACKAGE_POSTFIX_VERSION} ; \ 17 | else apk add --update "openjdk${JAVA_MAJOR_VERSION}${JAVA_PACKAGE_POSTFIX_VERSION}=${JAVA_VERSION}" ; \ 18 | fi && \ 19 | # Clean caches and tmps 20 | rm -rf /var/cache/apk/* && \ 21 | rm -rf /tmp/* && \ 22 | rm -rf /var/log/* 23 | 24 | ENV JAVA_HOME=/usr/lib/jvm/default-jvm 25 | ENV PATH=$JAVA_HOME/bin:$PATH 26 | 27 | LABEL com.blacklabelops.image.name.java="java-"${JAVA_DISTRIBUTION}"-base-image" \ 28 | com.blacklabelops.application.name.java="java" \ 29 | com.blacklabelops.application.version.java=${JAVA_DISTRIBUTION}${JAVA_MAJOR_VERSION}"-"${JAVA_UPDATE_VERSION}"-b"${JAVA_BUILD_NUMBER} \ 30 | com.blacklabelops.image.builddate.java=${BUILD_DATE} 31 | -------------------------------------------------------------------------------- /java-openjdk/Jenkinsfile: -------------------------------------------------------------------------------- 1 | /** Jenkins 2.0 Buildfile 2 | * 3 | * Master Jenkins 2.0 can be started by typing: 4 | * docker run -d -p 8090:8080 --name jenkins blacklabelops/jenkins 5 | * 6 | * Slave 'docker' can be started by typing: 7 | * docker run -d -v /var/run/docker.sock:/var/run/docker.sock --link jenkins:jenkins -e "SWARM_CLIENT_LABELS=docker" blacklabelops/swarm-dockerhost 8 | **/ 9 | 10 | node('docker') { 11 | checkout scm 12 | job = load 'buildscripts/buildImage.groovy' 13 | settings = load 'buildscripts/settings.groovy' 14 | settingsJob = load 'java-openjdk/settings.groovy' 15 | job.buildJobCI(settings.dockerWorkspace,settings.dockerImageName,settings,job.getBranchName(),settingsJob.imageArgs) 16 | } 17 | -------------------------------------------------------------------------------- /java-openjdk/settings.groovy: -------------------------------------------------------------------------------- 1 | /** 2 | * Jenkins 2.0 Buildfile 3 | **/ 4 | 5 | imageArgs = [ 6 | [ "openjdk", 7 | "jdk", 8 | settings.openjdk_8_java_major_version, 9 | settings.openjdk_8_java_update_version, 10 | settings.openjdk_8_java_build_number], 11 | [ "openjre", 12 | "jre", 13 | settings.openjdk_8_java_major_version, 14 | settings.openjdk_8_java_update_version, 15 | settings.openjdk_8_java_build_number] 16 | ] as String[][] 17 | 18 | dockerImages = ["blacklabelops/alpine:3.7"] as String[] 19 | 20 | dockerWorkspace = "java-openjdk" 21 | 22 | return this; 23 | --------------------------------------------------------------------------------