├── .gitignore ├── LICENSE ├── README.md ├── Vagrantfile ├── amazonws ├── Dockerfile ├── README.md ├── scripts │ ├── build.sh │ ├── container.cfg │ ├── rmi.sh │ └── scripts.cfg └── www.digicert.com.pem ├── docker ├── Dockerfile ├── README.md ├── docker-entrypoint.sh ├── scripts │ ├── build.sh │ ├── container.cfg │ ├── rmi.sh │ └── scripts.cfg ├── www.digicert.com.pem └── www.docker.com.crt ├── dockerhost ├── Dockerfile ├── README.md ├── docker-entrypoint.sh ├── scripts │ ├── build.sh │ ├── container.cfg │ ├── rmi.sh │ └── scripts.cfg ├── www.digicert.com.pem └── www.docker.com.crt ├── hashicorp-virtualbox ├── Dockerfile ├── README.md └── scripts │ ├── build.sh │ ├── container.cfg │ ├── rmi.sh │ └── scripts.cfg ├── java-jdk-6-oracle ├── Dockerfile └── scripts │ ├── build.sh │ ├── container.cfg │ ├── rmi.sh │ └── scripts.cfg ├── java-jdk-7-oracle ├── Dockerfile └── scripts │ ├── build.sh │ ├── container.cfg │ ├── rmi.sh │ └── scripts.cfg └── java-jdk-8-oracle ├── Dockerfile └── scripts ├── build.sh ├── container.cfg ├── rmi.sh └── scripts.cfg /.gitignore: -------------------------------------------------------------------------------- 1 | .vagrant 2 | -------------------------------------------------------------------------------- /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 | # Jenkins Swarm Slaves. 2 | 3 | Good news! These containers have rooted out root! Safely running inside userspace! 4 | 5 | Perfectly working with the following container: [blacklabelops/jenkins](https://github.com/blacklabelops/jenkins) 6 | 7 | Builds the following swarm slaves: 8 | 9 | Jenkins Slaves with Docker: 10 | 11 | * Documentation: [blacklabelops/swarm-dockerhost](https://github.com/blacklabelops/swarm/tree/master/dockerhost) 12 | * Documentation: [blacklabelops/swarm-docker](https://github.com/blacklabelops/swarm/tree/master/docker) (Deprecated) 13 | 14 | Jenkins Slave with Virtualbox and Hashicorp Tools: 15 | 16 | * Documentation: [blacklabelops/hashicorp-virtualbox](https://github.com/blacklabelops/swarm/tree/master/hashicorp-virtualbox) 17 | 18 | Jenkins Slave with AmazonWS Command Line Interface: 19 | 20 | * Documentation: [blacklabelops/swarm-aws](https://github.com/blacklabelops/swarm/tree/master/amazonws) 21 | 22 | Java Slaves with Java, Maven and Gradle: 23 | 24 | * blacklabelops/swarm-jdk6 25 | * blacklabelops/swarm-jdk7 26 | * blacklabelops/swarm-jdk8 27 | 28 | Check this project on how to configure each swarm slave: [blacklabelops/jenkins-swarm](https://github.com/blacklabelops/jenkins-swarm) 29 | 30 | # Make It Short 31 | 32 | This project contains jenkins swarm slaves for Jenkins CI. Start a master and connect the selected slaves. 33 | 34 | First start a master! 35 | 36 | ~~~~ 37 | $ docker run -d -p 8090:8080 --name jenkins blacklabelops/jenkins 38 | ~~~~ 39 | 40 | > This will pull the my jenkins container ready with swarm plugin and ready-to-use! 41 | 42 | Now swarm the place! 43 | 44 | ~~~~ 45 | $ docker run -d --link jenkins:jenkins blacklabelops/swarm-jdk6 46 | $ docker run -d --link jenkins:jenkins blacklabelops/swarm-jdk7 47 | $ docker run -d --link jenkins:jenkins blacklabelops/swarm-jdk8 48 | ~~~~ 49 | 50 | > This will start 3 Java JDK build slaves with JDK6/7/8, each with 4 build processors! This setup will 51 | need no further setup as the swarm slave automatically connects to the linked jenkins. 52 | 53 | # How It Works 54 | 55 | All slaves are configured the same way! Check this project on how to configure jenkins swarm slaves: [blacklabelops/jenkins-swarm](https://github.com/blacklabelops/jenkins-swarm) 56 | 57 | # Java Swarm Slaves 58 | 59 | All containing: 60 | 61 | * Latest respective JDK version. [Oracle Java](https://java.com/de/download/) 62 | * Latest Maven Build system. [Maven Homepage](https://maven.apache.org/) 63 | * Latest Gradle Build System. [Gradle Homepage](https://gradle.org/) 64 | 65 | # Vagrant 66 | 67 | Vagrant is fabulous tool for pulling and spinning up virtual machines like docker with containers. I can configure my development and test environment and simply pull it online. And so can you! Install Vagrant and Virtualbox and spin it up. Change into the project folder and build the project on the spot! 68 | 69 | ~~~~ 70 | $ vagrant up 71 | $ vagrant ssh 72 | [vagrant@localhost ~]$ cd /vagrant 73 | [vagrant@localhost ~]$ ./scripts/build.sh 74 | ~~~~ 75 | 76 | > Builds the container with standard settings. 77 | 78 | Vagrant does not leave any docker artifacts on your beloved desktop and the vagrant image can simply be destroyed and repulled if anything goes wrong. Test my project to your heart's content! 79 | 80 | First install: 81 | 82 | * [Vagrant](https://www.vagrantup.com/) 83 | * [Virtualbox](https://www.virtualbox.org/) 84 | 85 | # References 86 | 87 | * [Jenkins Homepage](http://jenkins-ci.org/) 88 | * [Jenkins Swarm Plugin Homepage](https://wiki.jenkins-ci.org/display/JENKINS/Swarm+Plugin) 89 | * [Docker Homepage](https://www.docker.com/) 90 | * [Docker Compose](https://docs.docker.com/compose/) 91 | * [Docker Userguide](https://docs.docker.com/userguide/) 92 | * [Oracle Java](https://java.com/de/download/) 93 | -------------------------------------------------------------------------------- /Vagrantfile: -------------------------------------------------------------------------------- 1 | # -*- mode: ruby -*- 2 | # vi: set ft=ruby : 3 | 4 | # All Vagrant configuration is done below. The "2" in Vagrant.configure 5 | # configures the configuration version (we support older styles for 6 | # backwards compatibility). Please don't change it unless you know what 7 | # you're doing. 8 | Vagrant.configure(2) do |config| 9 | # The most common configuration options are documented and commented below. 10 | # For a complete reference, please see the online documentation at 11 | # https://docs.vagrantup.com. 12 | 13 | # Every Vagrant development environment requires a box. You can search for 14 | # boxes at https://atlas.hashicorp.com/search. 15 | config.vm.box = "blacklabelops/latestdockerdev" 16 | config.vm.box_url = "https://atlas.hashicorp.com/blacklabelops/boxes/dockerdev/versions/1.latest/providers/virtualbox.box" 17 | 18 | # Disable automatic box update checking. If you disable this, then 19 | # boxes will only be checked for updates when the user runs 20 | # `vagrant box outdated`. This is not recommended. 21 | # config.vm.box_check_update = false 22 | 23 | # Create a forwarded port mapping which allows access to a specific port 24 | # within the machine from a port on the host machine. In the example below, 25 | # accessing "localhost:8080" will access port 80 on the guest machine. 26 | config.vm.network "forwarded_port", guest: 8090, host: 9200 27 | 28 | # Create a private network, which allows host-only access to the machine 29 | # using a specific IP. 30 | # config.vm.network "private_network", ip: "192.168.33.10" 31 | 32 | # Create a public network, which generally matched to bridged network. 33 | # Bridged networks make the machine appear as another physical device on 34 | # your network. 35 | # config.vm.network "public_network" 36 | 37 | # Share an additional folder to the guest VM. The first argument is 38 | # the path on the host to the actual folder. The second argument is 39 | # the path on the guest to mount the folder. And the optional third 40 | # argument is a set of non-required options. 41 | # config.vm.synced_folder "../data", "/vagrant_data" 42 | 43 | # Provider-specific configuration so you can fine-tune various 44 | # backing providers for Vagrant. These expose provider-specific options. 45 | # Example for VirtualBox: 46 | # 47 | # config.vm.provider "virtualbox" do |vb| 48 | # # Display the VirtualBox GUI when booting the machine 49 | # vb.gui = true 50 | # 51 | # # Customize the amount of memory on the VM: 52 | # vb.memory = "1024" 53 | # end 54 | # 55 | # View the documentation for the provider you are using for more 56 | # information on available options. 57 | 58 | # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies 59 | # such as FTP and Heroku are also available. See the documentation at 60 | # https://docs.vagrantup.com/v2/push/atlas.html for more information. 61 | # config.push.define "atlas" do |push| 62 | # push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME" 63 | # end 64 | 65 | # Enable provisioning with a shell script. Additional provisioners such as 66 | # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the 67 | # documentation for more information about their specific syntax and use. 68 | # config.vm.provision "shell", inline: <<-SHELL 69 | # sudo apt-get update 70 | # sudo apt-get install -y apache2 71 | # SHELL 72 | end 73 | -------------------------------------------------------------------------------- /amazonws/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM blacklabelops/jenkins-swarm 2 | MAINTAINER Steffen Bleul 3 | 4 | # Need root to build image 5 | USER root 6 | 7 | # Add ssl certificates 8 | COPY www.digicert.com.pem /home/jenkins/ 9 | 10 | # install web tools 11 | RUN yum install -y epel-release && \ 12 | yum install -y \ 13 | unzip \ 14 | zip \ 15 | gzip \ 16 | tar \ 17 | curl \ 18 | python-pip \ 19 | wget && \ 20 | yum clean all && rm -rf /var/cache/yum/* && \ 21 | pip install --upgrade pip 22 | 23 | # install Amazon WS Cli 24 | ENV AWS_ACCESS_KEY_ID= 25 | ENV AWS_SECRET_ACCESS_KEY= 26 | ENV AWS_DEFAULT_REGION= 27 | RUN pip install --cert /home/jenkins/www.digicert.com.pem awscli && \ 28 | curl -o /usr/local/bin/ecs-cli https://s3.amazonaws.com/amazon-ecs-cli/ecs-cli-linux-amd64-latest && \ 29 | chmod +x /usr/local/bin/ecs-cli 30 | 31 | # Switch back to user jenkins 32 | USER $CONTAINER_UID 33 | -------------------------------------------------------------------------------- /amazonws/README.md: -------------------------------------------------------------------------------- 1 | Jenkins Slave Container with Amazon WS CLI 2 | 3 | Check this project on how to configure a swarm slave: [blacklabelops/jenkins-swarm](https://github.com/blacklabelops/jenkins-swarm) 4 | 5 | # Make It Short! 6 | 7 | In short, you can use AmazonWS CLI commands inside a Jenkins slave. 8 | 9 | First start a master! 10 | 11 | ~~~~ 12 | $ docker run -d -p 8090:8080 --name jenkins_jenkins_1 blacklabelops/jenkins 13 | ~~~~ 14 | 15 | > This will pull the my jenkins container ready with swarm plugin and ready-to-use! 16 | 17 | Now start the build slave! 18 | 19 | ~~~~ 20 | $ docker run \ 21 | -e "AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY" \ 22 | -e "AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY" \ 23 | -e "AWS_DEFAULT_REGION=eu-central-1" \ 24 | --link jenkins_jenkins_1:jenkins \ 25 | blacklabelops/swarm-aws 26 | ~~~~ 27 | 28 | > CLI commands will be available when you specify the correct aws credentials. 29 | 30 | # Configuring ECS-Cli 31 | 32 | ~~~~ 33 | $ ecs-cli configure --region $AWS_DEFAULT_REGION --access-key $AWS_ACCESS_KEY_ID --secret-key $AWS_SECRET_ACCESS_KEY --cluster cluster_name 34 | ~~~~ 35 | 36 | # References 37 | 38 | * [Docker Homepage](https://www.docker.com/) 39 | * [Docker Userguide](https://docs.docker.com/userguide/) 40 | * [Amazon WS CLI](https://aws.amazon.com/de/cli/) 41 | -------------------------------------------------------------------------------- /amazonws/scripts/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Build Docker image 4 | # 5 | 6 | set -o errexit # abort script at first error 7 | set -o pipefail # return the exit status of the last command in the pipe 8 | set -o nounset # treat unset variables and parameters as an error 9 | 10 | # Setting environment variables 11 | readonly CUR_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) 12 | 13 | printf '%b\n' ":: Reading scrips config...." 14 | source $CUR_DIR/scripts.cfg 15 | 16 | printf '%b\n' ":: Reading container config...." 17 | source $CUR_DIR/container.cfg 18 | 19 | # Helper functions 20 | err() { 21 | printf '%b\n' "" 22 | printf '%b\n' "\033[1;31m[ERROR] $@\033[0m" 23 | printf '%b\n' "" 24 | exit 1 25 | } >&2 26 | 27 | success() { 28 | printf '%b\n' "" 29 | printf '%b\n' "\033[1;32m[SUCCESS] $@\033[0m" 30 | printf '%b\n' "" 31 | } 32 | 33 | lookForImage() { 34 | local IMAGE_LIST=$(docker images | awk '{print $1}') 35 | local IMAGE_FOUND="false" 36 | 37 | for image in $IMAGE_LIST 38 | do 39 | if [ $image = $IMAGE_NAME ]; then 40 | IMAGE_FOUND="true" 41 | fi 42 | done 43 | 44 | echo $IMAGE_FOUND 45 | } 46 | 47 | #------------------ 48 | # SCRIPT ENTRYPOINT 49 | #------------------ 50 | 51 | found=$(lookForImage) 52 | if [ $found = "true" ]; then 53 | err ""$IMAGE_NAME" does exist, cannot build" 54 | fi 55 | 56 | printf '%b\n' "" 57 | printf '%b\n' ":: Building image..." 58 | 59 | docker build -t ${IMAGE_NAME} . 60 | 61 | found=$(lookForImage) 62 | if [ $found = "false" ]; then 63 | err ""$IMAGE_NAME" not found, build failed" 64 | fi 65 | 66 | success "Image build successfully." 67 | 68 | -------------------------------------------------------------------------------- /amazonws/scripts/container.cfg: -------------------------------------------------------------------------------- 1 | #------------------ 2 | # CONTAINER VARIABLES 3 | #------------------ 4 | 5 | readonly IMAGE_NAME="blacklabelops/swarm-aws" 6 | -------------------------------------------------------------------------------- /amazonws/scripts/rmi.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Remove Docker image 4 | # 5 | 6 | set -o errexit # abort script at first error 7 | set -o pipefail # return the exit status of the last command in the pipe 8 | set -o nounset # treat unset variables and parameters as an error 9 | 10 | # Setting environment variables 11 | readonly CUR_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) 12 | 13 | printf '%b\n' ":: Reading scrips config...." 14 | source $CUR_DIR/scripts.cfg 15 | 16 | printf '%b\n' ":: Reading container config...." 17 | source $CUR_DIR/container.cfg 18 | 19 | # Helper functions 20 | err() { 21 | printf '%b\n' "" 22 | printf '%b\n' "\033[1;31m[ERROR] $@\033[0m" 23 | printf '%b\n' "" 24 | exit 1 25 | } >&2 26 | 27 | success() { 28 | printf '%b\n' "" 29 | printf '%b\n' "\033[1;32m[SUCCESS] $@\033[0m" 30 | printf '%b\n' "" 31 | } 32 | 33 | lookForImage() { 34 | local IMAGE_LIST=$(docker images | awk '{print $1}') 35 | local IMAGE_FOUND="false" 36 | 37 | for image in $IMAGE_LIST 38 | do 39 | if [ $image = $IMAGE_NAME ]; then 40 | IMAGE_FOUND="true" 41 | fi 42 | done 43 | 44 | echo $IMAGE_FOUND 45 | } 46 | 47 | #------------------ 48 | # SCRIPT ENTRYPOINT 49 | #------------------ 50 | 51 | found=$(lookForImage) 52 | 53 | if [ $found = "false" ]; then 54 | err ""$IMAGE_NAME" not found" 55 | fi 56 | 57 | printf '%b\n' "" 58 | printf '%b\n' ":: Removing image..." 59 | 60 | docker rmi -f ${IMAGE_NAME} 61 | 62 | found=$(lookForImage) 63 | 64 | if [ $found = "true" ]; then 65 | err ""$IMAGE_NAME" still found, removing failed." 66 | fi 67 | 68 | success "Image removed successfully." 69 | -------------------------------------------------------------------------------- /amazonws/scripts/scripts.cfg: -------------------------------------------------------------------------------- 1 | readonly ROOT_DIR=$(cd ${CUR_DIR}/..; pwd) -------------------------------------------------------------------------------- /amazonws/www.digicert.com.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs 3 | MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 4 | d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j 5 | ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL 6 | MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 7 | LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug 8 | RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm 9 | +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW 10 | PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM 11 | xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB 12 | Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 13 | hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg 14 | EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF 15 | MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA 16 | FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec 17 | nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z 18 | eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF 19 | hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 20 | Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe 21 | vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep 22 | +OkuE6N36B9K 23 | -----END CERTIFICATE----- 24 | -------------------------------------------------------------------------------- /docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM blacklabelops/jenkins-swarm 2 | MAINTAINER Steffen Bleul 3 | 4 | # Need root to build image 5 | USER root 6 | 7 | # Add ssl certificates 8 | COPY www.docker.com.crt /etc/pki/ca-trust/source/anchors/ 9 | COPY www.digicert.com.pem /home/jenkins/ 10 | 11 | # install web tools 12 | RUN yum install -y epel-release && \ 13 | yum install -y \ 14 | unzip \ 15 | zip \ 16 | gzip \ 17 | tar \ 18 | curl \ 19 | python-pip \ 20 | wget && \ 21 | yum clean all && rm -rf /var/cache/yum/* && \ 22 | pip install --upgrade pip 23 | 24 | # install Docker cli 25 | ENV DOCKER_VERSION 1.12.1 26 | ENV DOCKER_HOST tcp://docker:2375 27 | 28 | RUN curl -fSL "https://get.docker.com/builds/Linux/x86_64/docker-${DOCKER_VERSION}.tgz" -o /tmp/docker.tgz && \ 29 | tar -xzvf /tmp/docker.tgz && \ 30 | mv docker/* /usr/local/bin/ && \ 31 | chmod +x /usr/local/bin/docker && \ 32 | pip install --cert /home/jenkins/www.digicert.com.pem docker-compose && \ 33 | rm -rf /var/log/* && rm -rf /tmp/* 34 | 35 | # Switch back to user jenkins 36 | USER $CONTAINER_UID 37 | COPY docker-entrypoint.sh /home/jenkins/entrypoint.sh 38 | ENTRYPOINT ["/home/jenkins/entrypoint.sh"] 39 | CMD ["swarm"] 40 | -------------------------------------------------------------------------------- /docker/README.md: -------------------------------------------------------------------------------- 1 | # Jenkins Slave Container with Docker 2 | 3 | Deprecated: According to this article [Docker-in-Docker for your CI or testing environment? Think twice.](https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/) by Jérôme Petazzoni you will run into several problems when you integrate Docker into your CI-System with this image. I agree, because I ran into several performance issues using it. 4 | 5 | Solution: Use my image that is reusing the socket of your Docker host: [blacklabelops/swarm-dockerhost](https://github.com/blacklabelops/swarm/tree/master/dockerhost) 6 | 7 | Check this project on how to configure a swarm slave: [blacklabelops/jenkins-swarm](https://github.com/blacklabelops/jenkins-swarm) 8 | 9 | # Make It Short! 10 | 11 | In short, you can use Docker CLI commands inside a Jenkins slave. 12 | 13 | First start a master! 14 | 15 | ~~~~ 16 | $ docker run -d -p 8090:8080 --name jenkins blacklabelops/jenkins 17 | ~~~~ 18 | 19 | > This will pull the my jenkins container ready with swarm plugin and ready-to-use! 20 | 21 | Then start a Docker demon container! 22 | 23 | ~~~~ 24 | $ docker run -d --privileged --name docker_demon docker:1.9.1-dind 25 | ~~~~ 26 | 27 | > The swarm-slave does not run a docker demon itself! We use the official Docker image to create one for all slaves. 28 | 29 | Now start the build slave! 30 | 31 | ~~~~ 32 | $ docker run -d \ 33 | --link jenkins:jenkins \ 34 | --link docker_demon:docker \ 35 | blacklabelops/swarm-docker 36 | ~~~~ 37 | 38 | > CLI commands will be available. 39 | 40 | # Docker Login 41 | 42 | The slave can be started and login in a remote repository. The default is the dockerhub registry. 43 | 44 | With the environment variables: 45 | 46 | * DOCKER_REGISTRY_USER: Your account username for the registry. (mandatory) 47 | * DOCKER_REGISTRY_EMAIL: Your account email for the registry. (mandatory) 48 | * DOCKER_REGISTRY_PASSWORD: Your account password for the registry. (mandatory) 49 | 50 | Example: 51 | 52 | ~~~~ 53 | $ docker run -d \ 54 | --link jenkins:jenkins \ 55 | --link docker_demon:docker \ 56 | -e "DOCKER_REGISTRY_USER=**Your_Account_Username**" \ 57 | -e "DOCKER_REGISTRY_EMAIL=**Your_Account_Email**" \ 58 | -e "DOCKER_REGISTRY_PASSWORD=**Your_Account_Password**" \ 59 | blacklabelops/swarm-docker 60 | ~~~~ 61 | 62 | > Will login the user to Dockerhub and save the credentials locally for repository pulls and pushes. 63 | 64 | # Changing the Docker registry 65 | 66 | The default for this container is dockerhub.io. If you want to use another remote repository, e.g. quay.io then Your_Account_Email can specify the repository with the environment variable DOCKER_REGISTRY. 67 | 68 | Example: 69 | 70 | ~~~~ 71 | $ docker run -d \ 72 | --link jenkins:jenkins \ 73 | --link docker_demon:docker \ 74 | -e "DOCKER_REGISTRY=quay.io" 75 | -e "DOCKER_REGISTRY_USER=**Your_Account_Username**" \ 76 | -e "DOCKER_REGISTRY_EMAIL=**Your_Account_Email**" \ 77 | -e "DOCKER_REGISTRY_PASSWORD=**Your_Account_Password**" \ 78 | blacklabelops/swarm-docker 79 | ~~~~ 80 | 81 | > Will login to quay.io with the specified credentials. 82 | 83 | # References 84 | 85 | * [Docker Homepage](https://www.docker.com/) 86 | * [Docker Userguide](https://docs.docker.com/userguide/) 87 | -------------------------------------------------------------------------------- /docker/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -o errexit 3 | 4 | if [ -n "${SWARM_ENV_FILE}" ]; then 5 | source ${SWARM_ENV_FILE} 6 | fi 7 | 8 | docker_remote_registry="" 9 | 10 | if [ -n "${DOCKER_REGISTRY}" ]; then 11 | docker_remote_registry=${DOCKER_REGISTRY} 12 | fi 13 | 14 | docker_user="" 15 | docker_user_email="" 16 | docker_user_password="" 17 | 18 | if [ -n "${DOCKER_REGISTRY_USER}" ]; then 19 | docker_user=${DOCKER_REGISTRY_USER} 20 | docker_user_email=${DOCKER_REGISTRY_EMAIL} 21 | docker_user_password=${DOCKER_REGISTRY_PASSWORD} 22 | unset DOCKER_REGISTRY_USER 23 | unset DOCKER_REGISTRY_EMAIL 24 | unset DOCKER_REGISTRY_PASSWORD 25 | docker login --username=${docker_user} --email=${docker_user_email} --password=${docker_user_password} ${docker_remote_registry} 26 | fi 27 | 28 | ${SWARM_HOME}/docker-entrypoint.sh $@ 29 | -------------------------------------------------------------------------------- /docker/scripts/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Build Docker image 4 | # 5 | 6 | set -o errexit # abort script at first error 7 | set -o pipefail # return the exit status of the last command in the pipe 8 | set -o nounset # treat unset variables and parameters as an error 9 | 10 | # Setting environment variables 11 | readonly CUR_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) 12 | 13 | printf '%b\n' ":: Reading scrips config...." 14 | source $CUR_DIR/scripts.cfg 15 | 16 | printf '%b\n' ":: Reading container config...." 17 | source $CUR_DIR/container.cfg 18 | 19 | # Helper functions 20 | err() { 21 | printf '%b\n' "" 22 | printf '%b\n' "\033[1;31m[ERROR] $@\033[0m" 23 | printf '%b\n' "" 24 | exit 1 25 | } >&2 26 | 27 | success() { 28 | printf '%b\n' "" 29 | printf '%b\n' "\033[1;32m[SUCCESS] $@\033[0m" 30 | printf '%b\n' "" 31 | } 32 | 33 | lookForImage() { 34 | local IMAGE_LIST=$(docker images | awk '{print $1}') 35 | local IMAGE_FOUND="false" 36 | 37 | for image in $IMAGE_LIST 38 | do 39 | if [ $image = $IMAGE_NAME ]; then 40 | IMAGE_FOUND="true" 41 | fi 42 | done 43 | 44 | echo $IMAGE_FOUND 45 | } 46 | 47 | #------------------ 48 | # SCRIPT ENTRYPOINT 49 | #------------------ 50 | 51 | found=$(lookForImage) 52 | if [ $found = "true" ]; then 53 | err ""$IMAGE_NAME" does exist, cannot build" 54 | fi 55 | 56 | printf '%b\n' "" 57 | printf '%b\n' ":: Building image..." 58 | 59 | docker build -t ${IMAGE_NAME} . 60 | 61 | found=$(lookForImage) 62 | if [ $found = "false" ]; then 63 | err ""$IMAGE_NAME" not found, build failed" 64 | fi 65 | 66 | success "Image build successfully." 67 | 68 | -------------------------------------------------------------------------------- /docker/scripts/container.cfg: -------------------------------------------------------------------------------- 1 | #------------------ 2 | # CONTAINER VARIABLES 3 | #------------------ 4 | 5 | readonly IMAGE_NAME="blacklabelops/swarm-docker" 6 | -------------------------------------------------------------------------------- /docker/scripts/rmi.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Remove Docker image 4 | # 5 | 6 | set -o errexit # abort script at first error 7 | set -o pipefail # return the exit status of the last command in the pipe 8 | set -o nounset # treat unset variables and parameters as an error 9 | 10 | # Setting environment variables 11 | readonly CUR_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) 12 | 13 | printf '%b\n' ":: Reading scrips config...." 14 | source $CUR_DIR/scripts.cfg 15 | 16 | printf '%b\n' ":: Reading container config...." 17 | source $CUR_DIR/container.cfg 18 | 19 | # Helper functions 20 | err() { 21 | printf '%b\n' "" 22 | printf '%b\n' "\033[1;31m[ERROR] $@\033[0m" 23 | printf '%b\n' "" 24 | exit 1 25 | } >&2 26 | 27 | success() { 28 | printf '%b\n' "" 29 | printf '%b\n' "\033[1;32m[SUCCESS] $@\033[0m" 30 | printf '%b\n' "" 31 | } 32 | 33 | lookForImage() { 34 | local IMAGE_LIST=$(docker images | awk '{print $1}') 35 | local IMAGE_FOUND="false" 36 | 37 | for image in $IMAGE_LIST 38 | do 39 | if [ $image = $IMAGE_NAME ]; then 40 | IMAGE_FOUND="true" 41 | fi 42 | done 43 | 44 | echo $IMAGE_FOUND 45 | } 46 | 47 | #------------------ 48 | # SCRIPT ENTRYPOINT 49 | #------------------ 50 | 51 | found=$(lookForImage) 52 | 53 | if [ $found = "false" ]; then 54 | err ""$IMAGE_NAME" not found" 55 | fi 56 | 57 | printf '%b\n' "" 58 | printf '%b\n' ":: Removing image..." 59 | 60 | docker rmi -f ${IMAGE_NAME} 61 | 62 | found=$(lookForImage) 63 | 64 | if [ $found = "true" ]; then 65 | err ""$IMAGE_NAME" still found, removing failed." 66 | fi 67 | 68 | success "Image removed successfully." 69 | -------------------------------------------------------------------------------- /docker/scripts/scripts.cfg: -------------------------------------------------------------------------------- 1 | readonly ROOT_DIR=$(cd ${CUR_DIR}/..; pwd) -------------------------------------------------------------------------------- /docker/www.digicert.com.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs 3 | MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 4 | d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j 5 | ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL 6 | MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 7 | LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug 8 | RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm 9 | +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW 10 | PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM 11 | xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB 12 | Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 13 | hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg 14 | EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF 15 | MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA 16 | FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec 17 | nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z 18 | eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF 19 | hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 20 | Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe 21 | vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep 22 | +OkuE6N36B9K 23 | -----END CERTIFICATE----- 24 | -------------------------------------------------------------------------------- /docker/www.docker.com.crt: -------------------------------------------------------------------------------- 1 | Processed 170 CA certificate(s). 2 | Resolving 'www.docker.com'... 3 | Connecting to '104.239.220.248:443'... 4 | - Certificate type: X.509 5 | - Got a certificate list of 3 certificates. 6 | - Certificate[0] info: 7 | - subject `OU=GT68254618,OU=See www.rapidssl.com/resources/cps (c)13,OU=Domain Control Validated - RapidSSL(R),CN=*.docker.com', issuer `C=US,O=GeoTrust Inc.,CN=RapidSSL SHA256 CA - G3', RSA key 4096 bits, signed using RSA-SHA256, activated `2014-10-29 21:14:42 UTC', expires `2017-11-13 14:19:33 UTC', SHA-1 fingerprint `992093dd42c4d0a6d81421541a7a893778c3830f' 8 | Public Key ID: 9 | 1951e38a379bcf9ab60feaabca37af4bc6139558 10 | Public key's random art: 11 | +--[ RSA 4096]----+ 12 | | E ..o | 13 | | o . o . | 14 | | . o . . | 15 | | . . + | 16 | | . . S | 17 | | . . . + | 18 | | = + | 19 | | . oo. ..= | 20 | | oo+B=o+++ | 21 | +-----------------+ 22 | 23 | 24 | -----BEGIN CERTIFICATE----- 25 | MIIFqjCCBJKgAwIBAgICZaUwDQYJKoZIhvcNAQELBQAwRzELMAkGA1UEBhMCVVMx 26 | FjAUBgNVBAoTDUdlb1RydXN0IEluYy4xIDAeBgNVBAMTF1JhcGlkU1NMIFNIQTI1 27 | NiBDQSAtIEczMB4XDTE0MTAyOTIxMTQ0MloXDTE3MTExMzE0MTkzM1owgZAxEzAR 28 | BgNVBAsTCkdUNjgyNTQ2MTgxMTAvBgNVBAsTKFNlZSB3d3cucmFwaWRzc2wuY29t 29 | L3Jlc291cmNlcy9jcHMgKGMpMTMxLzAtBgNVBAsTJkRvbWFpbiBDb250cm9sIFZh 30 | bGlkYXRlZCAtIFJhcGlkU1NMKFIpMRUwEwYDVQQDDAwqLmRvY2tlci5jb20wggIi 31 | MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCv7TrjZMwa5UlqfjvnbqRWV4i7 32 | rAN7FSw9t64DsmEgMt7A0uXdFAJDElqGPWZQdU2GANmTBvUihZAaynefpysEhj5W 33 | g9JGIMJRz4Goss2xHayN2EjHqIGiTAQPT3Yb32xYVdce0+QArCd7NNpR6s7/y0vP 34 | yhFlQqFT9JDJBobHD72omhKg/R5e4qRwfuu4zef7O6md3JbuqZSuxuJtUZsAWm8n 35 | aVSYdwRB4Zd53JWHE865ltzvj/5GRzdNat+6RmtQjT+Q5dcIfEcUw7HXdksr377T 36 | OjSOsnpovQDk3WXhTMp5VSlplgvfzBpq5dmN/GY4L25Z2AJfl8OO4plL5hz+Obvm 37 | seJkEtKOwWA6A1U0e0MZrFpQ2GeJoktmjgeRH/RcvwatPPTc//DxHoQhxdKSz8HV 38 | paIW8wKYDvTCAP0pUPCTyX6ieBGlBs5hAjyPltPJ6cRj55AsL4uwlmNjGVMwDgC9 39 | b6ZHvPLq84NtcWlTHTDYofPUL2QrdyY8Lc+HSFCTZsyClGMSVNP7F8QwPQeEr2uM 40 | 8yB2Z2+CBcdGB9txb7Y0Xk/eB/5PfKsVD049J0MqvNY9dwaXYsO+3qw2/4bLPnVJ 41 | Xy5RVEYdZhCJOOX85urSDYWSP81qtckoKrx11+jyWyZmDHxUs7nWpWudv4tCfUn0 42 | cI+w6vMOA0MYPtZZ4wIDAQABo4IBVDCCAVAwHwYDVR0jBBgwFoAUw5zz/NNGCDS7 43 | zkZ/oHxb8+IIy1kwVwYIKwYBBQUHAQEESzBJMB8GCCsGAQUFBzABhhNodHRwOi8v 44 | Z3Yuc3ltY2QuY29tMCYGCCsGAQUFBzAChhpodHRwOi8vZ3Yuc3ltY2IuY29tL2d2 45 | LmNydDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF 46 | BwMCMCMGA1UdEQQcMBqCDCouZG9ja2VyLmNvbYIKZG9ja2VyLmNvbTArBgNVHR8E 47 | JDAiMCCgHqAchhpodHRwOi8vZ3Yuc3ltY2IuY29tL2d2LmNybDAMBgNVHRMBAf8E 48 | AjAAMEUGA1UdIAQ+MDwwOgYKYIZIAYb4RQEHNjAsMCoGCCsGAQUFBwIBFh5odHRw 49 | czovL3d3dy5yYXBpZHNzbC5jb20vbGVnYWwwDQYJKoZIhvcNAQELBQADggEBAKux 50 | Z7d6Unm1wmeEohEq/rBnsBf1FzLCfZ7cT5TJTDehDOFtSmWf9GwlqmQ5isss/E8c 51 | GTJASnU6WkEw7WDUh8VSpaVZSHzi5rO2blSWqzuVVquIe1nWQgZJN3EVipVuwqwO 52 | ly0L+VqbnZ0DBGIOEYmRVws1v15gKclXDxZMj2xguGVt9wUTgPatgU8erlxsDsTJ 53 | 8XeMlXY6gQOvtFFGpMvxzPLSjrK1pFExEzFd6lYBLUuiYXJavqDEEI3ATXMBPcd7 54 | rpjfra40RvwLEhbAImBAt/iJMEVvFXS9ybPgK1y2fFkyyDYdP6H85aKyaobB8JWV 55 | 8GEGJv+/G+SxrDYwdok= 56 | -----END CERTIFICATE----- 57 | 58 | - Certificate[1] info: 59 | - subject `C=US,O=GeoTrust Inc.,CN=RapidSSL SHA256 CA - G3', issuer `C=US,O=GeoTrust Inc.,CN=GeoTrust Global CA', RSA key 2048 bits, signed using RSA-SHA256, activated `2014-08-29 21:39:32 UTC', expires `2022-05-20 21:39:32 UTC', SHA-1 fingerprint `0e34141846e7423d37f20dc0ab06c9bbd843dc24' 60 | 61 | -----BEGIN CERTIFICATE----- 62 | MIIEJTCCAw2gAwIBAgIDAjp3MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT 63 | MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i 64 | YWwgQ0EwHhcNMTQwODI5MjEzOTMyWhcNMjIwNTIwMjEzOTMyWjBHMQswCQYDVQQG 65 | EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXUmFwaWRTU0wg 66 | U0hBMjU2IENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCv 67 | VJvZWF0eLFbG1eh/9H0WA//Qi1rkjqfdVC7UBMBdmJyNkA+8EGVf2prWRHzAn7Xp 68 | SowLBkMEu/SW4ib2YQGRZjEiwzQ0Xz8/kS9EX9zHFLYDn4ZLDqP/oIACg8PTH2lS 69 | 1p1kD8mD5xvEcKyU58Okaiy9uJ5p2L4KjxZjWmhxgHsw3hUEv8zTvz5IBVV6s9cQ 70 | DAP8m/0Ip4yM26eO8R5j3LMBL3+vV8M8SKeDaCGnL+enP/C1DPz1hNFTvA5yT2AM 71 | QriYrRmIV9cE7Ie/fodOoyH5U/02mEiN1vi7SPIpyGTRzFRIU4uvt2UevykzKdkp 72 | YEj4/5G8V1jlNS67abZZAgMBAAGjggEdMIIBGTAfBgNVHSMEGDAWgBTAephojYn7 73 | qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUw5zz/NNGCDS7zkZ/oHxb8+IIy1kwEgYD 74 | VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0fBC4wLDAqoCig 75 | JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMC4GCCsGAQUF 76 | BwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL2cuc3ltY2QuY29tMEwGA1UdIARF 77 | MEMwQQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdlb3Ry 78 | dXN0LmNvbS9yZXNvdXJjZXMvY3BzMA0GCSqGSIb3DQEBCwUAA4IBAQCjWB7GQzKs 79 | rC+TeLfqrlRARy1+eI1Q9vhmrNZPc9ZE768LzFvB9E+aj0l+YK/CJ8cW8fuTgZCp 80 | fO9vfm5FlBaEvexJ8cQO9K8EWYOHDyw7l8NaEpt7BDV7o5UzCHuTcSJCs6nZb0+B 81 | kvwHtnm8hEqddwnxxYny8LScVKoSew26T++TGezvfU5ho452nFnPjJSxhJf3GrkH 82 | uLLGTxN5279PURt/aQ1RKsHWFf83UTRlUfQevjhq7A6rvz17OQV79PP7GqHQyH5O 83 | ZI3NjGFVkP46yl0lD/gdo0p0Vk8aVUBwdSWmMy66S6VdU5oNMOGNX2Esr8zvsJmh 84 | gP8L8mJMcCaY 85 | -----END CERTIFICATE----- 86 | 87 | - Certificate[2] info: 88 | - subject `C=US,O=GeoTrust Inc.,CN=GeoTrust Global CA', issuer `C=US,O=Equifax,OU=Equifax Secure Certificate Authority', RSA key 2048 bits, signed using RSA-SHA1, activated `2002-05-21 04:00:00 UTC', expires `2018-08-21 04:00:00 UTC', SHA-1 fingerprint `7359755c6df9a0abc3060bce369564c8ec4542a3' 89 | 90 | -----BEGIN CERTIFICATE----- 91 | MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT 92 | MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0 93 | aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw 94 | WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE 95 | AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB 96 | CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m 97 | OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu 98 | T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c 99 | JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR 100 | Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz 101 | PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm 102 | aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM 103 | TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g 104 | LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO 105 | BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv 106 | dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB 107 | AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL 108 | NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W 109 | b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S 110 | -----END CERTIFICATE----- 111 | 112 | - Status: The certificate is trusted. 113 | - Description: (TLS1.2)-(ECDHE-RSA-SECP256R1)-(AES-256-GCM) 114 | - Session ID: 05:34:2E:30:A5:95:A2:3A:74:D0:57:6A:AC:55:71:8B:F2:E7:23:F4:F8:CB:15:60:88:C0:59:9E:B1:F8:51:18 115 | - Ephemeral EC Diffie-Hellman parameters 116 | - Using curve: SECP256R1 117 | - Curve size: 256 bits 118 | - Version: TLS1.2 119 | - Key Exchange: ECDHE-RSA 120 | - Server Signature: RSA-SHA256 121 | - Cipher: AES-256-GCM 122 | - MAC: AEAD 123 | - Compression: NULL 124 | - Handshake was completed 125 | 126 | - Simple Client Mode: 127 | 128 | -------------------------------------------------------------------------------- /dockerhost/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM blacklabelops/jenkins-swarm 2 | MAINTAINER Steffen Bleul 3 | 4 | # Need root to build image 5 | USER root 6 | 7 | # Add ssl certificates 8 | COPY www.docker.com.crt /etc/pki/ca-trust/source/anchors/ 9 | COPY www.digicert.com.pem /home/jenkins/ 10 | 11 | # install web tools 12 | RUN yum install -y epel-release && \ 13 | yum install -y \ 14 | unzip \ 15 | zip \ 16 | gzip \ 17 | tar \ 18 | curl \ 19 | python-pip \ 20 | wget && \ 21 | yum clean all && rm -rf /var/cache/yum/* && \ 22 | pip install --upgrade pip 23 | 24 | # install Docker cli 25 | ENV DOCKER_VERSION 1.13.0 26 | 27 | RUN curl -fSL "https://get.docker.com/builds/Linux/x86_64/docker-$DOCKER_VERSION.tgz" -o /tmp/docker.tgz && \ 28 | tar -xzvf /tmp/docker.tgz -C /tmp && \ 29 | mv /tmp/docker/* /usr/local/bin/ && \ 30 | chmod +x /usr/local/bin/docker* && \ 31 | pip install --cert /home/jenkins/www.digicert.com.pem docker-compose && \ 32 | rm -rf /var/log/* && rm -rf /tmp/* 33 | 34 | COPY docker-entrypoint.sh /home/jenkins/entrypoint.sh 35 | ENTRYPOINT ["/home/jenkins/entrypoint.sh"] 36 | CMD ["swarm"] 37 | -------------------------------------------------------------------------------- /dockerhost/README.md: -------------------------------------------------------------------------------- 1 | # Jenkins Slave Container With Docker 2 | 3 | Rule #1 Read the WARNING! 4 | 5 | Rule #2 Read the WARNING! 6 | 7 | Rule #3 Just read the WARNING! 8 | 9 | # WARNING 10 | 11 | Anyone who can execute docker commands on this slave will be able to execute root commands on your host! In worst case they can manipulate or just delete your machine! Only use this when you know what you do! 12 | 13 | # Make It Short! 14 | 15 | In short, you can use Docker CLI commands inside a Jenkins slave. 16 | 17 | First start a master! 18 | 19 | ~~~~ 20 | $ docker run -d -p 8090:8080 --name jenkins blacklabelops/jenkins 21 | ~~~~ 22 | 23 | > This will pull the my jenkins container ready with swarm plugin and ready-to-use! 24 | 25 | Now start the build slave! 26 | 27 | ~~~~ 28 | $ docker run -d \ 29 | -v /var/run/docker.sock:/var/run/docker.sock \ 30 | --link jenkins:jenkins \ 31 | blacklabelops/swarm-dockerhost 32 | ~~~~ 33 | 34 | > CLI commands will be available. 35 | 36 | # How It Works 37 | 38 | Check this project on how to configure a swarm slave: [blacklabelops/jenkins-swarm](https://github.com/blacklabelops/jenkins-swarm) 39 | 40 | # Docker Login 41 | 42 | The slave can be started and login in a remote repository. The default is the dockerhub registry. 43 | 44 | With the environment variables: 45 | 46 | * DOCKER_REGISTRY_USER: Your account username for the registry. (mandatory) 47 | * DOCKER_REGISTRY_EMAIL: Your account email for the registry. (mandatory) 48 | * DOCKER_REGISTRY_PASSWORD: Your account password for the registry. (mandatory) 49 | 50 | Example: 51 | 52 | ~~~~ 53 | $ docker run -d \ 54 | --link jenkins:jenkins \ 55 | -v /var/run/docker.sock:/var/run/docker.sock \ 56 | -e "DOCKER_REGISTRY_USER=**Your_Account_Username**" \ 57 | -e "DOCKER_REGISTRY_EMAIL=**Your_Account_Email**" \ 58 | -e "DOCKER_REGISTRY_PASSWORD=**Your_Account_Password**" \ 59 | blacklabelops/swarm-dockerhost 60 | ~~~~ 61 | 62 | > Will login the user to Dockerhub and save the credentials locally for repository pulls and pushes. 63 | 64 | # Changing the Docker registry 65 | 66 | The default for this container is dockerhub.io. If you want to use another remote repository, e.g. quay.io then Your_Account_Email can specify the repository with the environment variable DOCKER_REGISTRY. 67 | 68 | Example: 69 | 70 | ~~~~ 71 | $ docker run -d \ 72 | --link jenkins:jenkins \ 73 | -v /var/run/docker.sock:/var/run/docker.sock \ 74 | -e "DOCKER_REGISTRY=quay.io" 75 | -e "DOCKER_REGISTRY_USER=**Your_Account_Username**" \ 76 | -e "DOCKER_REGISTRY_EMAIL=**Your_Account_Email**" \ 77 | -e "DOCKER_REGISTRY_PASSWORD=**Your_Account_Password**" \ 78 | blacklabelops/swarm-dockerhost 79 | ~~~~ 80 | 81 | > Will login to quay.io with the specified credentials. 82 | 83 | # References 84 | 85 | * [Docker Homepage](https://www.docker.com/) 86 | * [Docker Userguide](https://docs.docker.com/userguide/) 87 | -------------------------------------------------------------------------------- /dockerhost/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -o errexit 3 | 4 | if [ -n "${SWARM_ENV_FILE}" ]; then 5 | source ${SWARM_ENV_FILE} 6 | fi 7 | 8 | docker_remote_registry="" 9 | 10 | if [ -n "${DOCKER_REGISTRY}" ]; then 11 | docker_remote_registry=${DOCKER_REGISTRY} 12 | fi 13 | 14 | docker_user="" 15 | docker_user_email="" 16 | docker_user_password="" 17 | 18 | if [ -n "${DOCKER_REGISTRY_USER}" ]; then 19 | docker_user=${DOCKER_REGISTRY_USER} 20 | docker_user_email=${DOCKER_REGISTRY_EMAIL} 21 | docker_user_password=${DOCKER_REGISTRY_PASSWORD} 22 | unset DOCKER_REGISTRY_USER 23 | unset DOCKER_REGISTRY_EMAIL 24 | unset DOCKER_REGISTRY_PASSWORD 25 | docker login --username=${docker_user} --email=${docker_user_email} --password=${docker_user_password} ${docker_remote_registry} 26 | fi 27 | 28 | ${SWARM_HOME}/docker-entrypoint.sh $@ 29 | -------------------------------------------------------------------------------- /dockerhost/scripts/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Build Docker image 4 | # 5 | 6 | set -o errexit # abort script at first error 7 | set -o pipefail # return the exit status of the last command in the pipe 8 | set -o nounset # treat unset variables and parameters as an error 9 | 10 | # Setting environment variables 11 | readonly CUR_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) 12 | 13 | printf '%b\n' ":: Reading scrips config...." 14 | source $CUR_DIR/scripts.cfg 15 | 16 | printf '%b\n' ":: Reading container config...." 17 | source $CUR_DIR/container.cfg 18 | 19 | # Helper functions 20 | err() { 21 | printf '%b\n' "" 22 | printf '%b\n' "\033[1;31m[ERROR] $@\033[0m" 23 | printf '%b\n' "" 24 | exit 1 25 | } >&2 26 | 27 | success() { 28 | printf '%b\n' "" 29 | printf '%b\n' "\033[1;32m[SUCCESS] $@\033[0m" 30 | printf '%b\n' "" 31 | } 32 | 33 | lookForImage() { 34 | local IMAGE_LIST=$(docker images | awk '{print $1}') 35 | local IMAGE_FOUND="false" 36 | 37 | for image in $IMAGE_LIST 38 | do 39 | if [ $image = $IMAGE_NAME ]; then 40 | IMAGE_FOUND="true" 41 | fi 42 | done 43 | 44 | echo $IMAGE_FOUND 45 | } 46 | 47 | #------------------ 48 | # SCRIPT ENTRYPOINT 49 | #------------------ 50 | 51 | found=$(lookForImage) 52 | if [ $found = "true" ]; then 53 | err ""$IMAGE_NAME" does exist, cannot build" 54 | fi 55 | 56 | printf '%b\n' "" 57 | printf '%b\n' ":: Building image..." 58 | 59 | docker build -t ${IMAGE_NAME} . 60 | 61 | found=$(lookForImage) 62 | if [ $found = "false" ]; then 63 | err ""$IMAGE_NAME" not found, build failed" 64 | fi 65 | 66 | success "Image build successfully." 67 | 68 | -------------------------------------------------------------------------------- /dockerhost/scripts/container.cfg: -------------------------------------------------------------------------------- 1 | #------------------ 2 | # CONTAINER VARIABLES 3 | #------------------ 4 | 5 | readonly IMAGE_NAME="blacklabelops/swarm-dockerhost" 6 | -------------------------------------------------------------------------------- /dockerhost/scripts/rmi.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Remove Docker image 4 | # 5 | 6 | set -o errexit # abort script at first error 7 | set -o pipefail # return the exit status of the last command in the pipe 8 | set -o nounset # treat unset variables and parameters as an error 9 | 10 | # Setting environment variables 11 | readonly CUR_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) 12 | 13 | printf '%b\n' ":: Reading scrips config...." 14 | source $CUR_DIR/scripts.cfg 15 | 16 | printf '%b\n' ":: Reading container config...." 17 | source $CUR_DIR/container.cfg 18 | 19 | # Helper functions 20 | err() { 21 | printf '%b\n' "" 22 | printf '%b\n' "\033[1;31m[ERROR] $@\033[0m" 23 | printf '%b\n' "" 24 | exit 1 25 | } >&2 26 | 27 | success() { 28 | printf '%b\n' "" 29 | printf '%b\n' "\033[1;32m[SUCCESS] $@\033[0m" 30 | printf '%b\n' "" 31 | } 32 | 33 | lookForImage() { 34 | local IMAGE_LIST=$(docker images | awk '{print $1}') 35 | local IMAGE_FOUND="false" 36 | 37 | for image in $IMAGE_LIST 38 | do 39 | if [ $image = $IMAGE_NAME ]; then 40 | IMAGE_FOUND="true" 41 | fi 42 | done 43 | 44 | echo $IMAGE_FOUND 45 | } 46 | 47 | #------------------ 48 | # SCRIPT ENTRYPOINT 49 | #------------------ 50 | 51 | found=$(lookForImage) 52 | 53 | if [ $found = "false" ]; then 54 | err ""$IMAGE_NAME" not found" 55 | fi 56 | 57 | printf '%b\n' "" 58 | printf '%b\n' ":: Removing image..." 59 | 60 | docker rmi -f ${IMAGE_NAME} 61 | 62 | found=$(lookForImage) 63 | 64 | if [ $found = "true" ]; then 65 | err ""$IMAGE_NAME" still found, removing failed." 66 | fi 67 | 68 | success "Image removed successfully." 69 | -------------------------------------------------------------------------------- /dockerhost/scripts/scripts.cfg: -------------------------------------------------------------------------------- 1 | readonly ROOT_DIR=$(cd ${CUR_DIR}/..; pwd) -------------------------------------------------------------------------------- /dockerhost/www.digicert.com.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs 3 | MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 4 | d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j 5 | ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL 6 | MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 7 | LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug 8 | RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm 9 | +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW 10 | PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM 11 | xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB 12 | Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 13 | hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg 14 | EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF 15 | MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA 16 | FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec 17 | nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z 18 | eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF 19 | hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 20 | Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe 21 | vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep 22 | +OkuE6N36B9K 23 | -----END CERTIFICATE----- 24 | -------------------------------------------------------------------------------- /dockerhost/www.docker.com.crt: -------------------------------------------------------------------------------- 1 | Processed 170 CA certificate(s). 2 | Resolving 'www.docker.com'... 3 | Connecting to '104.239.220.248:443'... 4 | - Certificate type: X.509 5 | - Got a certificate list of 3 certificates. 6 | - Certificate[0] info: 7 | - subject `OU=GT68254618,OU=See www.rapidssl.com/resources/cps (c)13,OU=Domain Control Validated - RapidSSL(R),CN=*.docker.com', issuer `C=US,O=GeoTrust Inc.,CN=RapidSSL SHA256 CA - G3', RSA key 4096 bits, signed using RSA-SHA256, activated `2014-10-29 21:14:42 UTC', expires `2017-11-13 14:19:33 UTC', SHA-1 fingerprint `992093dd42c4d0a6d81421541a7a893778c3830f' 8 | Public Key ID: 9 | 1951e38a379bcf9ab60feaabca37af4bc6139558 10 | Public key's random art: 11 | +--[ RSA 4096]----+ 12 | | E ..o | 13 | | o . o . | 14 | | . o . . | 15 | | . . + | 16 | | . . S | 17 | | . . . + | 18 | | = + | 19 | | . oo. ..= | 20 | | oo+B=o+++ | 21 | +-----------------+ 22 | 23 | 24 | -----BEGIN CERTIFICATE----- 25 | MIIFqjCCBJKgAwIBAgICZaUwDQYJKoZIhvcNAQELBQAwRzELMAkGA1UEBhMCVVMx 26 | FjAUBgNVBAoTDUdlb1RydXN0IEluYy4xIDAeBgNVBAMTF1JhcGlkU1NMIFNIQTI1 27 | NiBDQSAtIEczMB4XDTE0MTAyOTIxMTQ0MloXDTE3MTExMzE0MTkzM1owgZAxEzAR 28 | BgNVBAsTCkdUNjgyNTQ2MTgxMTAvBgNVBAsTKFNlZSB3d3cucmFwaWRzc2wuY29t 29 | L3Jlc291cmNlcy9jcHMgKGMpMTMxLzAtBgNVBAsTJkRvbWFpbiBDb250cm9sIFZh 30 | bGlkYXRlZCAtIFJhcGlkU1NMKFIpMRUwEwYDVQQDDAwqLmRvY2tlci5jb20wggIi 31 | MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCv7TrjZMwa5UlqfjvnbqRWV4i7 32 | rAN7FSw9t64DsmEgMt7A0uXdFAJDElqGPWZQdU2GANmTBvUihZAaynefpysEhj5W 33 | g9JGIMJRz4Goss2xHayN2EjHqIGiTAQPT3Yb32xYVdce0+QArCd7NNpR6s7/y0vP 34 | yhFlQqFT9JDJBobHD72omhKg/R5e4qRwfuu4zef7O6md3JbuqZSuxuJtUZsAWm8n 35 | aVSYdwRB4Zd53JWHE865ltzvj/5GRzdNat+6RmtQjT+Q5dcIfEcUw7HXdksr377T 36 | OjSOsnpovQDk3WXhTMp5VSlplgvfzBpq5dmN/GY4L25Z2AJfl8OO4plL5hz+Obvm 37 | seJkEtKOwWA6A1U0e0MZrFpQ2GeJoktmjgeRH/RcvwatPPTc//DxHoQhxdKSz8HV 38 | paIW8wKYDvTCAP0pUPCTyX6ieBGlBs5hAjyPltPJ6cRj55AsL4uwlmNjGVMwDgC9 39 | b6ZHvPLq84NtcWlTHTDYofPUL2QrdyY8Lc+HSFCTZsyClGMSVNP7F8QwPQeEr2uM 40 | 8yB2Z2+CBcdGB9txb7Y0Xk/eB/5PfKsVD049J0MqvNY9dwaXYsO+3qw2/4bLPnVJ 41 | Xy5RVEYdZhCJOOX85urSDYWSP81qtckoKrx11+jyWyZmDHxUs7nWpWudv4tCfUn0 42 | cI+w6vMOA0MYPtZZ4wIDAQABo4IBVDCCAVAwHwYDVR0jBBgwFoAUw5zz/NNGCDS7 43 | zkZ/oHxb8+IIy1kwVwYIKwYBBQUHAQEESzBJMB8GCCsGAQUFBzABhhNodHRwOi8v 44 | Z3Yuc3ltY2QuY29tMCYGCCsGAQUFBzAChhpodHRwOi8vZ3Yuc3ltY2IuY29tL2d2 45 | LmNydDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF 46 | BwMCMCMGA1UdEQQcMBqCDCouZG9ja2VyLmNvbYIKZG9ja2VyLmNvbTArBgNVHR8E 47 | JDAiMCCgHqAchhpodHRwOi8vZ3Yuc3ltY2IuY29tL2d2LmNybDAMBgNVHRMBAf8E 48 | AjAAMEUGA1UdIAQ+MDwwOgYKYIZIAYb4RQEHNjAsMCoGCCsGAQUFBwIBFh5odHRw 49 | czovL3d3dy5yYXBpZHNzbC5jb20vbGVnYWwwDQYJKoZIhvcNAQELBQADggEBAKux 50 | Z7d6Unm1wmeEohEq/rBnsBf1FzLCfZ7cT5TJTDehDOFtSmWf9GwlqmQ5isss/E8c 51 | GTJASnU6WkEw7WDUh8VSpaVZSHzi5rO2blSWqzuVVquIe1nWQgZJN3EVipVuwqwO 52 | ly0L+VqbnZ0DBGIOEYmRVws1v15gKclXDxZMj2xguGVt9wUTgPatgU8erlxsDsTJ 53 | 8XeMlXY6gQOvtFFGpMvxzPLSjrK1pFExEzFd6lYBLUuiYXJavqDEEI3ATXMBPcd7 54 | rpjfra40RvwLEhbAImBAt/iJMEVvFXS9ybPgK1y2fFkyyDYdP6H85aKyaobB8JWV 55 | 8GEGJv+/G+SxrDYwdok= 56 | -----END CERTIFICATE----- 57 | 58 | - Certificate[1] info: 59 | - subject `C=US,O=GeoTrust Inc.,CN=RapidSSL SHA256 CA - G3', issuer `C=US,O=GeoTrust Inc.,CN=GeoTrust Global CA', RSA key 2048 bits, signed using RSA-SHA256, activated `2014-08-29 21:39:32 UTC', expires `2022-05-20 21:39:32 UTC', SHA-1 fingerprint `0e34141846e7423d37f20dc0ab06c9bbd843dc24' 60 | 61 | -----BEGIN CERTIFICATE----- 62 | MIIEJTCCAw2gAwIBAgIDAjp3MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT 63 | MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i 64 | YWwgQ0EwHhcNMTQwODI5MjEzOTMyWhcNMjIwNTIwMjEzOTMyWjBHMQswCQYDVQQG 65 | EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXUmFwaWRTU0wg 66 | U0hBMjU2IENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCv 67 | VJvZWF0eLFbG1eh/9H0WA//Qi1rkjqfdVC7UBMBdmJyNkA+8EGVf2prWRHzAn7Xp 68 | SowLBkMEu/SW4ib2YQGRZjEiwzQ0Xz8/kS9EX9zHFLYDn4ZLDqP/oIACg8PTH2lS 69 | 1p1kD8mD5xvEcKyU58Okaiy9uJ5p2L4KjxZjWmhxgHsw3hUEv8zTvz5IBVV6s9cQ 70 | DAP8m/0Ip4yM26eO8R5j3LMBL3+vV8M8SKeDaCGnL+enP/C1DPz1hNFTvA5yT2AM 71 | QriYrRmIV9cE7Ie/fodOoyH5U/02mEiN1vi7SPIpyGTRzFRIU4uvt2UevykzKdkp 72 | YEj4/5G8V1jlNS67abZZAgMBAAGjggEdMIIBGTAfBgNVHSMEGDAWgBTAephojYn7 73 | qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUw5zz/NNGCDS7zkZ/oHxb8+IIy1kwEgYD 74 | VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0fBC4wLDAqoCig 75 | JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMC4GCCsGAQUF 76 | BwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL2cuc3ltY2QuY29tMEwGA1UdIARF 77 | MEMwQQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdlb3Ry 78 | dXN0LmNvbS9yZXNvdXJjZXMvY3BzMA0GCSqGSIb3DQEBCwUAA4IBAQCjWB7GQzKs 79 | rC+TeLfqrlRARy1+eI1Q9vhmrNZPc9ZE768LzFvB9E+aj0l+YK/CJ8cW8fuTgZCp 80 | fO9vfm5FlBaEvexJ8cQO9K8EWYOHDyw7l8NaEpt7BDV7o5UzCHuTcSJCs6nZb0+B 81 | kvwHtnm8hEqddwnxxYny8LScVKoSew26T++TGezvfU5ho452nFnPjJSxhJf3GrkH 82 | uLLGTxN5279PURt/aQ1RKsHWFf83UTRlUfQevjhq7A6rvz17OQV79PP7GqHQyH5O 83 | ZI3NjGFVkP46yl0lD/gdo0p0Vk8aVUBwdSWmMy66S6VdU5oNMOGNX2Esr8zvsJmh 84 | gP8L8mJMcCaY 85 | -----END CERTIFICATE----- 86 | 87 | - Certificate[2] info: 88 | - subject `C=US,O=GeoTrust Inc.,CN=GeoTrust Global CA', issuer `C=US,O=Equifax,OU=Equifax Secure Certificate Authority', RSA key 2048 bits, signed using RSA-SHA1, activated `2002-05-21 04:00:00 UTC', expires `2018-08-21 04:00:00 UTC', SHA-1 fingerprint `7359755c6df9a0abc3060bce369564c8ec4542a3' 89 | 90 | -----BEGIN CERTIFICATE----- 91 | MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT 92 | MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0 93 | aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw 94 | WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE 95 | AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB 96 | CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m 97 | OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu 98 | T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c 99 | JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR 100 | Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz 101 | PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm 102 | aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM 103 | TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g 104 | LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO 105 | BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv 106 | dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB 107 | AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL 108 | NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W 109 | b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S 110 | -----END CERTIFICATE----- 111 | 112 | - Status: The certificate is trusted. 113 | - Description: (TLS1.2)-(ECDHE-RSA-SECP256R1)-(AES-256-GCM) 114 | - Session ID: 05:34:2E:30:A5:95:A2:3A:74:D0:57:6A:AC:55:71:8B:F2:E7:23:F4:F8:CB:15:60:88:C0:59:9E:B1:F8:51:18 115 | - Ephemeral EC Diffie-Hellman parameters 116 | - Using curve: SECP256R1 117 | - Curve size: 256 bits 118 | - Version: TLS1.2 119 | - Key Exchange: ECDHE-RSA 120 | - Server Signature: RSA-SHA256 121 | - Cipher: AES-256-GCM 122 | - MAC: AEAD 123 | - Compression: NULL 124 | - Handshake was completed 125 | 126 | - Simple Client Mode: 127 | 128 | -------------------------------------------------------------------------------- /hashicorp-virtualbox/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM blacklabelops/jenkins-swarm 2 | MAINTAINER Steffen Bleul 3 | 4 | # Need root to build image 5 | USER root 6 | 7 | # install dev tools 8 | RUN yum install -y \ 9 | unzip \ 10 | tar \ 11 | gzip \ 12 | wget && \ 13 | yum clean all && rm -rf /var/cache/yum/* 14 | 15 | ENV VAGRANT_HOME=/opt/vagrant 16 | 17 | # install Hashicorp tools 18 | RUN export PACKER_VERSION=0.10.2 && \ 19 | export VAGRANT_VERSION=1.8.6 && \ 20 | export OTTO_VERSION=0.2.0 && \ 21 | export TERRAFORM_VERSION=0.7.4 && \ 22 | export ATLAS_CLI_VERSION=0.2.0 && \ 23 | wget --directory-prefix=/tmp https://releases.hashicorp.com/packer/${PACKER_VERSION}/packer_${PACKER_VERSION}_linux_amd64.zip && \ 24 | unzip /tmp/packer_${PACKER_VERSION}_linux_amd64.zip -d /usr/local/bin && \ 25 | wget --directory-prefix=/tmp https://releases.hashicorp.com/vagrant/${VAGRANT_VERSION}/vagrant_${VAGRANT_VERSION}_x86_64.rpm && \ 26 | rpm -i /tmp/vagrant_${VAGRANT_VERSION}_x86_64.rpm && \ 27 | wget --directory-prefix=/tmp https://releases.hashicorp.com/otto/${OTTO_VERSION}/otto_${OTTO_VERSION}_linux_amd64.zip && \ 28 | unzip /tmp/otto_${OTTO_VERSION}_linux_amd64.zip -d /usr/local/bin && \ 29 | wget --directory-prefix=/tmp https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip && \ 30 | unzip /tmp/terraform_${TERRAFORM_VERSION}_linux_amd64.zip -d /usr/local/bin && \ 31 | wget --directory-prefix=/tmp https://github.com/hashicorp/atlas-upload-cli/releases/download/v${ATLAS_CLI_VERSION}/atlas-upload-cli_${ATLAS_CLI_VERSION}_linux_amd64.tar.gz && \ 32 | ls -All /tmp && \ 33 | tar xzf /tmp/atlas-upload-cli_${ATLAS_CLI_VERSION}_linux_amd64.tar.gz -C /usr/local/bin && \ 34 | mkdir -p $VAGRANT_HOME && \ 35 | chown -R ${CONTAINER_USER}:${CONTAINER_GROUP} $VAGRANT_HOME && \ 36 | rm -rf /tmp/* 37 | 38 | # install Virtualbox (Example version: 5.0.14_105127_el7-1) 39 | RUN export VIRTUALBOX_VERSION=latest && \ 40 | mkdir -p /opt/virtualbox && \ 41 | cd /etc/yum.repos.d/ && \ 42 | wget http://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo && \ 43 | yum install -y \ 44 | dkms \ 45 | kernel-devel && \ 46 | yum -y groupinstall "Development Tools" && \ 47 | if [ "${VIRTUALBOX_VERSION}" = "latest" ]; \ 48 | then yum install -y VirtualBox-5.0 ; \ 49 | else yum install -y VirtualBox-5.0-${VIRTUALBOX_VERSION} ; \ 50 | fi && \ 51 | yum autoremove -y \ 52 | tar \ 53 | unzip \ 54 | wget && \ 55 | yum clean all && rm -rf /var/cache/yum/* 56 | 57 | # Switch back to user jenkins 58 | USER $CONTAINER_UID 59 | VOLUME $VAGRANT_HOME 60 | -------------------------------------------------------------------------------- /hashicorp-virtualbox/README.md: -------------------------------------------------------------------------------- 1 | Container stuffed with Hashicorp Otto, Vagrant and Packer with Virtualbox! 2 | 3 | This slave can be used to build Vagrant-Virtualbox boxes in several independent containers on the same host. 4 | 5 | Requirements: 6 | 7 | * Centos 7.1503 dedicated server without any virtualization around. 8 | * Host machine must have working installation of Virtualbox. 9 | * Host machine must have same Virtualbox version. 10 | * Host machine must have same kernel version as container. 11 | 12 | Software: 13 | 14 | * Virtualbox 15 | * Otto 16 | * Vagrant 17 | * Packer 18 | 19 | # Make It Short! 20 | 21 | In short, you can use Vagrant and Packer inside a Jenkins slave. 22 | 23 | First start a master! 24 | 25 | ~~~~ 26 | $ docker run -d -p 8090:8080 --name jenkins_jenkins_1 blacklabelops/jenkins 27 | ~~~~ 28 | 29 | > This will pull the my jenkins container ready with swarm plugin and ready-to-use! 30 | 31 | Now start the build slave! 32 | 33 | ~~~~ 34 | $ docker run -d \ 35 | --privileged=true \ 36 | --link jenkins_jenkins_1:jenkins \ 37 | -v /dev/vboxdrv:/dev/vboxdrv \ 38 | blacklabelops/hashicorp-virtualbox 39 | ~~~~ 40 | 41 | > Mounts the hosts binaries. MUST use privileged mode, MUST mount host directory. 42 | 43 | # References 44 | 45 | * [Docker Homepage](https://www.docker.com/) 46 | * [Docker Userguide](https://docs.docker.com/userguide/) 47 | * [Virtualbox](https://www.virtualbox.org/) 48 | * [Vagrant](https://www.vagrantup.com/) 49 | * [Packer](https://www.packer.io/) 50 | -------------------------------------------------------------------------------- /hashicorp-virtualbox/scripts/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Build Docker image 4 | # 5 | 6 | set -o errexit # abort script at first error 7 | set -o pipefail # return the exit status of the last command in the pipe 8 | set -o nounset # treat unset variables and parameters as an error 9 | 10 | # Setting environment variables 11 | readonly CUR_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) 12 | 13 | printf '%b\n' ":: Reading scrips config...." 14 | source $CUR_DIR/scripts.cfg 15 | 16 | printf '%b\n' ":: Reading container config...." 17 | source $CUR_DIR/container.cfg 18 | 19 | # Helper functions 20 | err() { 21 | printf '%b\n' "" 22 | printf '%b\n' "\033[1;31m[ERROR] $@\033[0m" 23 | printf '%b\n' "" 24 | exit 1 25 | } >&2 26 | 27 | success() { 28 | printf '%b\n' "" 29 | printf '%b\n' "\033[1;32m[SUCCESS] $@\033[0m" 30 | printf '%b\n' "" 31 | } 32 | 33 | lookForImage() { 34 | local IMAGE_LIST=$(docker images | awk '{print $1}') 35 | local IMAGE_FOUND="false" 36 | 37 | for image in $IMAGE_LIST 38 | do 39 | if [ $image = $IMAGE_NAME ]; then 40 | IMAGE_FOUND="true" 41 | fi 42 | done 43 | 44 | echo $IMAGE_FOUND 45 | } 46 | 47 | #------------------ 48 | # SCRIPT ENTRYPOINT 49 | #------------------ 50 | 51 | found=$(lookForImage) 52 | if [ $found = "true" ]; then 53 | err ""$IMAGE_NAME" does exist, cannot build" 54 | fi 55 | 56 | printf '%b\n' "" 57 | printf '%b\n' ":: Building image..." 58 | 59 | docker build -t ${IMAGE_NAME} . 60 | 61 | found=$(lookForImage) 62 | if [ $found = "false" ]; then 63 | err ""$IMAGE_NAME" not found, build failed" 64 | fi 65 | 66 | success "Image build successfully." 67 | 68 | -------------------------------------------------------------------------------- /hashicorp-virtualbox/scripts/container.cfg: -------------------------------------------------------------------------------- 1 | #------------------ 2 | # CONTAINER VARIABLES 3 | #------------------ 4 | 5 | readonly IMAGE_NAME="blacklabelops/hashicorp-virtualbox" 6 | -------------------------------------------------------------------------------- /hashicorp-virtualbox/scripts/rmi.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Remove Docker image 4 | # 5 | 6 | set -o errexit # abort script at first error 7 | set -o pipefail # return the exit status of the last command in the pipe 8 | set -o nounset # treat unset variables and parameters as an error 9 | 10 | # Setting environment variables 11 | readonly CUR_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) 12 | 13 | printf '%b\n' ":: Reading scrips config...." 14 | source $CUR_DIR/scripts.cfg 15 | 16 | printf '%b\n' ":: Reading container config...." 17 | source $CUR_DIR/container.cfg 18 | 19 | # Helper functions 20 | err() { 21 | printf '%b\n' "" 22 | printf '%b\n' "\033[1;31m[ERROR] $@\033[0m" 23 | printf '%b\n' "" 24 | exit 1 25 | } >&2 26 | 27 | success() { 28 | printf '%b\n' "" 29 | printf '%b\n' "\033[1;32m[SUCCESS] $@\033[0m" 30 | printf '%b\n' "" 31 | } 32 | 33 | lookForImage() { 34 | local IMAGE_LIST=$(docker images | awk '{print $1}') 35 | local IMAGE_FOUND="false" 36 | 37 | for image in $IMAGE_LIST 38 | do 39 | if [ $image = $IMAGE_NAME ]; then 40 | IMAGE_FOUND="true" 41 | fi 42 | done 43 | 44 | echo $IMAGE_FOUND 45 | } 46 | 47 | #------------------ 48 | # SCRIPT ENTRYPOINT 49 | #------------------ 50 | 51 | found=$(lookForImage) 52 | 53 | if [ $found = "false" ]; then 54 | err ""$IMAGE_NAME" not found" 55 | fi 56 | 57 | printf '%b\n' "" 58 | printf '%b\n' ":: Removing image..." 59 | 60 | docker rmi -f ${IMAGE_NAME} 61 | 62 | found=$(lookForImage) 63 | 64 | if [ $found = "true" ]; then 65 | err ""$IMAGE_NAME" still found, removing failed." 66 | fi 67 | 68 | success "Image removed successfully." 69 | -------------------------------------------------------------------------------- /hashicorp-virtualbox/scripts/scripts.cfg: -------------------------------------------------------------------------------- 1 | readonly ROOT_DIR=$(cd ${CUR_DIR}/..; pwd) -------------------------------------------------------------------------------- /java-jdk-6-oracle/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM blacklabelops/jenkins-swarm 2 | MAINTAINER Steffen Bleul 3 | 4 | # Need root to build image 5 | USER root 6 | 7 | # install dev tools 8 | RUN yum install -y \ 9 | unzip && \ 10 | yum clean all && rm -rf /var/cache/yum/* 11 | 12 | # this envs are for maintaining java updates. 13 | ENV JAVA_MAJOR_VERSION=6 14 | ENV JAVA_UPDATE_VERSION=45 15 | ENV JAVA_BUILD_NUMER=06 16 | # install java 17 | ENV JAVA_VERSION=1.${JAVA_MAJOR_VERSION}.0_${JAVA_UPDATE_VERSION} 18 | ENV JAVA_TARBALL=jdk-${JAVA_MAJOR_VERSION}u${JAVA_UPDATE_VERSION}-linux-x64.bin 19 | ENV JAVA_HOME=/opt/java/jdk${JAVA_VERSION} 20 | 21 | RUN wget --directory-prefix=/tmp \ 22 | --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" \ 23 | http://download.oracle.com/otn-pub/java/jdk/${JAVA_MAJOR_VERSION}u${JAVA_UPDATE_VERSION}-b${JAVA_BUILD_NUMER}/${JAVA_TARBALL} && \ 24 | mkdir -p /opt/java && \ 25 | chmod +x /tmp/${JAVA_TARBALL} && \ 26 | /tmp/${JAVA_TARBALL} && \ 27 | mv jdk${JAVA_VERSION} /opt/java && \ 28 | alternatives --remove java ${SWARM_JAVA_HOME}/bin/java && \ 29 | alternatives --install /usr/bin/java java /opt/java/jdk${JAVA_VERSION}/bin/java 100 && \ 30 | rm -rf /tmp/* && rm -rf /var/log/* 31 | 32 | # install maven 33 | ENV MAVEN_VERSION=3.2.5 34 | ENV M2_HOME=/usr/local/maven 35 | RUN wget --directory-prefix=/tmp \ 36 | http://mirror.synyx.de/apache/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz && \ 37 | tar xzf /tmp/apache-maven-${MAVEN_VERSION}-bin.tar.gz -C /usr/local && rm -rf /tmp/* && \ 38 | cd /usr/local && ln -s apache-maven-${MAVEN_VERSION} maven && \ 39 | alternatives --install /usr/bin/mvn mvn /usr/local/maven/bin/mvn 100 40 | 41 | # install gradle 42 | ENV GRADLE_VERSION=2.14.1 43 | ENV GRADLE_HOME=/usr/local/gradle 44 | RUN wget --directory-prefix=/tmp \ 45 | https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip && \ 46 | unzip /tmp/gradle-${GRADLE_VERSION}-bin.zip -d /usr/local && rm -rf /tmp/* && \ 47 | cd /usr/local && ln -s gradle-${GRADLE_VERSION} gradle && \ 48 | alternatives --install /usr/bin/gradle gradle /usr/local/gradle/bin/gradle 100 49 | 50 | # Switch back to user jenkins 51 | USER $CONTAINER_UID 52 | -------------------------------------------------------------------------------- /java-jdk-6-oracle/scripts/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Build Docker image 4 | # 5 | 6 | set -o errexit # abort script at first error 7 | set -o pipefail # return the exit status of the last command in the pipe 8 | set -o nounset # treat unset variables and parameters as an error 9 | 10 | # Setting environment variables 11 | readonly CUR_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) 12 | 13 | printf '%b\n' ":: Reading scrips config...." 14 | source $CUR_DIR/scripts.cfg 15 | 16 | printf '%b\n' ":: Reading container config...." 17 | source $CUR_DIR/container.cfg 18 | 19 | # Helper functions 20 | err() { 21 | printf '%b\n' "" 22 | printf '%b\n' "\033[1;31m[ERROR] $@\033[0m" 23 | printf '%b\n' "" 24 | exit 1 25 | } >&2 26 | 27 | success() { 28 | printf '%b\n' "" 29 | printf '%b\n' "\033[1;32m[SUCCESS] $@\033[0m" 30 | printf '%b\n' "" 31 | } 32 | 33 | lookForImage() { 34 | local IMAGE_LIST=$(docker images | awk '{print $1}') 35 | local IMAGE_FOUND="false" 36 | 37 | for image in $IMAGE_LIST 38 | do 39 | if [ $image = $IMAGE_NAME ]; then 40 | IMAGE_FOUND="true" 41 | fi 42 | done 43 | 44 | echo $IMAGE_FOUND 45 | } 46 | 47 | #------------------ 48 | # SCRIPT ENTRYPOINT 49 | #------------------ 50 | 51 | found=$(lookForImage) 52 | if [ $found = "true" ]; then 53 | err ""$IMAGE_NAME" does exist, cannot build" 54 | fi 55 | 56 | printf '%b\n' "" 57 | printf '%b\n' ":: Building image..." 58 | 59 | docker build -t ${IMAGE_NAME} . 60 | 61 | found=$(lookForImage) 62 | if [ $found = "false" ]; then 63 | err ""$IMAGE_NAME" not found, build failed" 64 | fi 65 | 66 | success "Image build successfully." 67 | 68 | -------------------------------------------------------------------------------- /java-jdk-6-oracle/scripts/container.cfg: -------------------------------------------------------------------------------- 1 | #------------------ 2 | # CONTAINER VARIABLES 3 | #------------------ 4 | 5 | readonly IMAGE_NAME="blacklabelops/swarm-jdk6" 6 | -------------------------------------------------------------------------------- /java-jdk-6-oracle/scripts/rmi.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Remove Docker image 4 | # 5 | 6 | set -o errexit # abort script at first error 7 | set -o pipefail # return the exit status of the last command in the pipe 8 | set -o nounset # treat unset variables and parameters as an error 9 | 10 | # Setting environment variables 11 | readonly CUR_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) 12 | 13 | printf '%b\n' ":: Reading scrips config...." 14 | source $CUR_DIR/scripts.cfg 15 | 16 | printf '%b\n' ":: Reading container config...." 17 | source $CUR_DIR/container.cfg 18 | 19 | # Helper functions 20 | err() { 21 | printf '%b\n' "" 22 | printf '%b\n' "\033[1;31m[ERROR] $@\033[0m" 23 | printf '%b\n' "" 24 | exit 1 25 | } >&2 26 | 27 | success() { 28 | printf '%b\n' "" 29 | printf '%b\n' "\033[1;32m[SUCCESS] $@\033[0m" 30 | printf '%b\n' "" 31 | } 32 | 33 | lookForImage() { 34 | local IMAGE_LIST=$(docker images | awk '{print $1}') 35 | local IMAGE_FOUND="false" 36 | 37 | for image in $IMAGE_LIST 38 | do 39 | if [ $image = $IMAGE_NAME ]; then 40 | IMAGE_FOUND="true" 41 | fi 42 | done 43 | 44 | echo $IMAGE_FOUND 45 | } 46 | 47 | #------------------ 48 | # SCRIPT ENTRYPOINT 49 | #------------------ 50 | 51 | found=$(lookForImage) 52 | 53 | if [ $found = "false" ]; then 54 | err ""$IMAGE_NAME" not found" 55 | fi 56 | 57 | printf '%b\n' "" 58 | printf '%b\n' ":: Removing image..." 59 | 60 | docker rmi -f ${IMAGE_NAME} 61 | 62 | found=$(lookForImage) 63 | 64 | if [ $found = "true" ]; then 65 | err ""$IMAGE_NAME" still found, removing failed." 66 | fi 67 | 68 | success "Image removed successfully." 69 | -------------------------------------------------------------------------------- /java-jdk-6-oracle/scripts/scripts.cfg: -------------------------------------------------------------------------------- 1 | readonly ROOT_DIR=$(cd ${CUR_DIR}/..; pwd) -------------------------------------------------------------------------------- /java-jdk-7-oracle/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM blacklabelops/jenkins-swarm 2 | MAINTAINER Steffen Bleul 3 | 4 | # Need root to build image 5 | USER root 6 | 7 | # install dev tools 8 | RUN yum install -y \ 9 | unzip && \ 10 | yum clean all && rm -rf /var/cache/yum/* 11 | 12 | # this envs are for maintaining java updates. 13 | ENV JAVA_MAJOR_VERSION=7 14 | ENV JAVA_UPDATE_VERSION=80 15 | ENV JAVA_BUILD_NUMER=15 16 | # install java 17 | ENV JAVA_VERSION=1.${JAVA_MAJOR_VERSION}.0_${JAVA_UPDATE_VERSION} 18 | ENV JAVA_TARBALL=server-jre-${JAVA_MAJOR_VERSION}u${JAVA_UPDATE_VERSION}-linux-x64.tar.gz 19 | ENV JAVA_HOME=/opt/java/jdk${JAVA_VERSION} 20 | 21 | RUN wget --directory-prefix=/tmp \ 22 | --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" \ 23 | http://download.oracle.com/otn-pub/java/jdk/${JAVA_MAJOR_VERSION}u${JAVA_UPDATE_VERSION}-b${JAVA_BUILD_NUMER}/${JAVA_TARBALL} && \ 24 | mkdir -p /opt/java && \ 25 | tar -xzf /tmp/${JAVA_TARBALL} -C /opt/java/ && \ 26 | alternatives --remove java ${SWARM_JAVA_HOME}/bin/java && \ 27 | alternatives --install /usr/bin/java java /opt/java/jdk${JAVA_VERSION}/bin/java 100 && \ 28 | rm -rf /tmp/* && rm -rf /var/log/* 29 | 30 | # install maven 31 | ENV MAVEN_VERSION=3.3.9 32 | ENV M2_HOME=/usr/local/maven 33 | RUN wget --directory-prefix=/tmp \ 34 | http://mirror.synyx.de/apache/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz && \ 35 | tar xzf /tmp/apache-maven-${MAVEN_VERSION}-bin.tar.gz -C /usr/local && rm -rf /tmp/* && \ 36 | cd /usr/local && ln -s apache-maven-${MAVEN_VERSION} maven && \ 37 | alternatives --install /usr/bin/mvn mvn /usr/local/maven/bin/mvn 100 38 | 39 | # install gradle 40 | ENV GRADLE_VERSION=2.14.1 41 | ENV GRADLE_HOME=/usr/local/gradle 42 | RUN wget --directory-prefix=/tmp \ 43 | https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip && \ 44 | unzip /tmp/gradle-${GRADLE_VERSION}-bin.zip -d /usr/local && rm -rf /tmp/* && \ 45 | cd /usr/local && ln -s gradle-${GRADLE_VERSION} gradle && \ 46 | alternatives --install /usr/bin/gradle gradle /usr/local/gradle/bin/gradle 100 47 | 48 | # Switch back to user jenkins 49 | USER $CONTAINER_UID 50 | -------------------------------------------------------------------------------- /java-jdk-7-oracle/scripts/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Build Docker image 4 | # 5 | 6 | set -o errexit # abort script at first error 7 | set -o pipefail # return the exit status of the last command in the pipe 8 | set -o nounset # treat unset variables and parameters as an error 9 | 10 | # Setting environment variables 11 | readonly CUR_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) 12 | 13 | printf '%b\n' ":: Reading scrips config...." 14 | source $CUR_DIR/scripts.cfg 15 | 16 | printf '%b\n' ":: Reading container config...." 17 | source $CUR_DIR/container.cfg 18 | 19 | # Helper functions 20 | err() { 21 | printf '%b\n' "" 22 | printf '%b\n' "\033[1;31m[ERROR] $@\033[0m" 23 | printf '%b\n' "" 24 | exit 1 25 | } >&2 26 | 27 | success() { 28 | printf '%b\n' "" 29 | printf '%b\n' "\033[1;32m[SUCCESS] $@\033[0m" 30 | printf '%b\n' "" 31 | } 32 | 33 | lookForImage() { 34 | local IMAGE_LIST=$(docker images | awk '{print $1}') 35 | local IMAGE_FOUND="false" 36 | 37 | for image in $IMAGE_LIST 38 | do 39 | if [ $image = $IMAGE_NAME ]; then 40 | IMAGE_FOUND="true" 41 | fi 42 | done 43 | 44 | echo $IMAGE_FOUND 45 | } 46 | 47 | #------------------ 48 | # SCRIPT ENTRYPOINT 49 | #------------------ 50 | 51 | found=$(lookForImage) 52 | if [ $found = "true" ]; then 53 | err ""$IMAGE_NAME" does exist, cannot build" 54 | fi 55 | 56 | printf '%b\n' "" 57 | printf '%b\n' ":: Building image..." 58 | 59 | docker build -t ${IMAGE_NAME} . 60 | 61 | found=$(lookForImage) 62 | if [ $found = "false" ]; then 63 | err ""$IMAGE_NAME" not found, build failed" 64 | fi 65 | 66 | success "Image build successfully." 67 | 68 | -------------------------------------------------------------------------------- /java-jdk-7-oracle/scripts/container.cfg: -------------------------------------------------------------------------------- 1 | #------------------ 2 | # CONTAINER VARIABLES 3 | #------------------ 4 | 5 | readonly IMAGE_NAME="blacklabelops/swarm-jdk7" 6 | -------------------------------------------------------------------------------- /java-jdk-7-oracle/scripts/rmi.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Remove Docker image 4 | # 5 | 6 | set -o errexit # abort script at first error 7 | set -o pipefail # return the exit status of the last command in the pipe 8 | set -o nounset # treat unset variables and parameters as an error 9 | 10 | # Setting environment variables 11 | readonly CUR_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) 12 | 13 | printf '%b\n' ":: Reading scrips config...." 14 | source $CUR_DIR/scripts.cfg 15 | 16 | printf '%b\n' ":: Reading container config...." 17 | source $CUR_DIR/container.cfg 18 | 19 | # Helper functions 20 | err() { 21 | printf '%b\n' "" 22 | printf '%b\n' "\033[1;31m[ERROR] $@\033[0m" 23 | printf '%b\n' "" 24 | exit 1 25 | } >&2 26 | 27 | success() { 28 | printf '%b\n' "" 29 | printf '%b\n' "\033[1;32m[SUCCESS] $@\033[0m" 30 | printf '%b\n' "" 31 | } 32 | 33 | lookForImage() { 34 | local IMAGE_LIST=$(docker images | awk '{print $1}') 35 | local IMAGE_FOUND="false" 36 | 37 | for image in $IMAGE_LIST 38 | do 39 | if [ $image = $IMAGE_NAME ]; then 40 | IMAGE_FOUND="true" 41 | fi 42 | done 43 | 44 | echo $IMAGE_FOUND 45 | } 46 | 47 | #------------------ 48 | # SCRIPT ENTRYPOINT 49 | #------------------ 50 | 51 | found=$(lookForImage) 52 | 53 | if [ $found = "false" ]; then 54 | err ""$IMAGE_NAME" not found" 55 | fi 56 | 57 | printf '%b\n' "" 58 | printf '%b\n' ":: Removing image..." 59 | 60 | docker rmi -f ${IMAGE_NAME} 61 | 62 | found=$(lookForImage) 63 | 64 | if [ $found = "true" ]; then 65 | err ""$IMAGE_NAME" still found, removing failed." 66 | fi 67 | 68 | success "Image removed successfully." 69 | -------------------------------------------------------------------------------- /java-jdk-7-oracle/scripts/scripts.cfg: -------------------------------------------------------------------------------- 1 | readonly ROOT_DIR=$(cd ${CUR_DIR}/..; pwd) -------------------------------------------------------------------------------- /java-jdk-8-oracle/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM blacklabelops/jenkins-swarm 2 | MAINTAINER Steffen Bleul 3 | 4 | # Need root to build image 5 | USER root 6 | 7 | # install dev tools 8 | RUN yum install -y \ 9 | unzip && \ 10 | yum clean all && rm -rf /var/cache/yum/* 11 | 12 | # this envs are for maintaining java updates. 13 | ENV JAVA_DISTRIBUTION=jdk 14 | ENV JAVA_MAJOR_VERSION=8 15 | ENV JAVA_UPDATE_VERSION=144 16 | ENV JAVA_BUILD_NUMBER=01 17 | ENV JAVA_HASH=090f390dda5b47b9b721c7dfaa008135 18 | 19 | # install java 20 | ENV JAVA_VERSION=1.${JAVA_MAJOR_VERSION}.0_${JAVA_UPDATE_VERSION} 21 | ENV JAVA_HOME=/opt/java/${JAVA_DISTRIBUTION}${JAVA_VERSION} 22 | ENV PATH=$PATH:$JAVA_HOME/bin 23 | 24 | RUN export JAVA_TARBALL=${JAVA_DISTRIBUTION}-${JAVA_MAJOR_VERSION}u${JAVA_UPDATE_VERSION}-linux-x64.tar.gz && \ 25 | wget --directory-prefix=/tmp \ 26 | --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" \ 27 | http://download.oracle.com/otn-pub/java/jdk/${JAVA_MAJOR_VERSION}u${JAVA_UPDATE_VERSION}-b${JAVA_BUILD_NUMBER}/${JAVA_HASH}/${JAVA_TARBALL} && \ 28 | mkdir -p /opt/java && \ 29 | tar -xzf /tmp/${JAVA_TARBALL} -C /opt/java/ && \ 30 | alternatives --remove java ${SWARM_JAVA_HOME}/bin/java && \ 31 | alternatives --install /usr/bin/java java /opt/java/jdk${JAVA_VERSION}/bin/java 100 && \ 32 | rm -rf /tmp/* && rm -rf /var/log/* 33 | 34 | # install maven 35 | ENV MAVEN_VERSION=3.5.0 36 | ENV M2_HOME=/usr/local/maven 37 | RUN wget --directory-prefix=/tmp \ 38 | http://mirror.synyx.de/apache/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz && \ 39 | tar xzf /tmp/apache-maven-${MAVEN_VERSION}-bin.tar.gz -C /usr/local && rm -rf /tmp/* && \ 40 | cd /usr/local && ln -s apache-maven-${MAVEN_VERSION} maven && \ 41 | alternatives --install /usr/bin/mvn mvn /usr/local/maven/bin/mvn 100 42 | 43 | # install gradle 44 | ENV GRADLE_VERSION=4.2.1 45 | ENV GRADLE_HOME=/usr/local/gradle 46 | RUN wget --directory-prefix=/tmp \ 47 | https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip && \ 48 | unzip /tmp/gradle-${GRADLE_VERSION}-bin.zip -d /usr/local && rm -rf /tmp/* && \ 49 | cd /usr/local && ln -s gradle-${GRADLE_VERSION} gradle && \ 50 | alternatives --install /usr/bin/gradle gradle /usr/local/gradle/bin/gradle 100 51 | 52 | # Switch back to user jenkins 53 | USER $CONTAINER_UID 54 | -------------------------------------------------------------------------------- /java-jdk-8-oracle/scripts/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Build Docker image 4 | # 5 | 6 | set -o errexit # abort script at first error 7 | set -o pipefail # return the exit status of the last command in the pipe 8 | set -o nounset # treat unset variables and parameters as an error 9 | 10 | # Setting environment variables 11 | readonly CUR_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) 12 | 13 | printf '%b\n' ":: Reading scrips config...." 14 | source $CUR_DIR/scripts.cfg 15 | 16 | printf '%b\n' ":: Reading container config...." 17 | source $CUR_DIR/container.cfg 18 | 19 | # Helper functions 20 | err() { 21 | printf '%b\n' "" 22 | printf '%b\n' "\033[1;31m[ERROR] $@\033[0m" 23 | printf '%b\n' "" 24 | exit 1 25 | } >&2 26 | 27 | success() { 28 | printf '%b\n' "" 29 | printf '%b\n' "\033[1;32m[SUCCESS] $@\033[0m" 30 | printf '%b\n' "" 31 | } 32 | 33 | lookForImage() { 34 | local IMAGE_LIST=$(docker images | awk '{print $1}') 35 | local IMAGE_FOUND="false" 36 | 37 | for image in $IMAGE_LIST 38 | do 39 | if [ $image = $IMAGE_NAME ]; then 40 | IMAGE_FOUND="true" 41 | fi 42 | done 43 | 44 | echo $IMAGE_FOUND 45 | } 46 | 47 | #------------------ 48 | # SCRIPT ENTRYPOINT 49 | #------------------ 50 | 51 | found=$(lookForImage) 52 | if [ $found = "true" ]; then 53 | err ""$IMAGE_NAME" does exist, cannot build" 54 | fi 55 | 56 | printf '%b\n' "" 57 | printf '%b\n' ":: Building image..." 58 | 59 | docker build -t ${IMAGE_NAME} . 60 | 61 | found=$(lookForImage) 62 | if [ $found = "false" ]; then 63 | err ""$IMAGE_NAME" not found, build failed" 64 | fi 65 | 66 | success "Image build successfully." 67 | 68 | -------------------------------------------------------------------------------- /java-jdk-8-oracle/scripts/container.cfg: -------------------------------------------------------------------------------- 1 | #------------------ 2 | # CONTAINER VARIABLES 3 | #------------------ 4 | 5 | readonly IMAGE_NAME="blacklabelops/swarm-jdk8" 6 | -------------------------------------------------------------------------------- /java-jdk-8-oracle/scripts/rmi.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Remove Docker image 4 | # 5 | 6 | set -o errexit # abort script at first error 7 | set -o pipefail # return the exit status of the last command in the pipe 8 | set -o nounset # treat unset variables and parameters as an error 9 | 10 | # Setting environment variables 11 | readonly CUR_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) 12 | 13 | printf '%b\n' ":: Reading scrips config...." 14 | source $CUR_DIR/scripts.cfg 15 | 16 | printf '%b\n' ":: Reading container config...." 17 | source $CUR_DIR/container.cfg 18 | 19 | # Helper functions 20 | err() { 21 | printf '%b\n' "" 22 | printf '%b\n' "\033[1;31m[ERROR] $@\033[0m" 23 | printf '%b\n' "" 24 | exit 1 25 | } >&2 26 | 27 | success() { 28 | printf '%b\n' "" 29 | printf '%b\n' "\033[1;32m[SUCCESS] $@\033[0m" 30 | printf '%b\n' "" 31 | } 32 | 33 | lookForImage() { 34 | local IMAGE_LIST=$(docker images | awk '{print $1}') 35 | local IMAGE_FOUND="false" 36 | 37 | for image in $IMAGE_LIST 38 | do 39 | if [ $image = $IMAGE_NAME ]; then 40 | IMAGE_FOUND="true" 41 | fi 42 | done 43 | 44 | echo $IMAGE_FOUND 45 | } 46 | 47 | #------------------ 48 | # SCRIPT ENTRYPOINT 49 | #------------------ 50 | 51 | found=$(lookForImage) 52 | 53 | if [ $found = "false" ]; then 54 | err ""$IMAGE_NAME" not found" 55 | fi 56 | 57 | printf '%b\n' "" 58 | printf '%b\n' ":: Removing image..." 59 | 60 | docker rmi -f ${IMAGE_NAME} 61 | 62 | found=$(lookForImage) 63 | 64 | if [ $found = "true" ]; then 65 | err ""$IMAGE_NAME" still found, removing failed." 66 | fi 67 | 68 | success "Image removed successfully." 69 | -------------------------------------------------------------------------------- /java-jdk-8-oracle/scripts/scripts.cfg: -------------------------------------------------------------------------------- 1 | readonly ROOT_DIR=$(cd ${CUR_DIR}/..; pwd) --------------------------------------------------------------------------------