• Stars
    star
    102
  • Rank 335,584 (Top 7 %)
  • Language
    Java
  • Created about 7 years ago
  • Updated about 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

πŸ“ˆ Learn how to implement container technologies with your Jenkins CI/CD workflows to make them easier to manage in this tutorial.

"Docker Pulls Analytics

A tutorial about Continuous Integration and Continuous Delivery by Dockerize Jenkins Pipeline

This repository is a tutorial it tries to exemplify how to automatically manage the process of building, testing with the highest coverage, and deployment phases.

Our goal is to ensure our pipeline works well after each code being pushed. The processes we want to auto-manage:

  • Code checkout
  • Run tests
  • Compile the code
  • Run Sonarqube analysis on the code
  • Create Docker image
  • Push the image to Docker Hub
  • Pull and run the image

First step, running up the services

Since one of the goals is to obtain the sonarqube report of our project, we should be able to access sonarqube from the jenkins service. Docker compose is a best choice to run services working together. We configure our application services in a yaml file as below.

docker-compose.yml

version: '3.2'
services:
  sonarqube:
    build:
      context: sonarqube/
    ports:
      - 9000:9000
      - 9092:9092
    container_name: sonarqube
  jenkins:
    build:
      context: jenkins/
    privileged: true
    user: root
    ports:
      - 8080:8080
      - 50000:50000
    container_name: jenkins
    volumes:
      - /tmp/jenkins:/var/jenkins_home #Remember that, the tmp directory is designed to be wiped on system reboot.
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - sonarqube

Paths of docker files of the containers are specified at context attribute in the docker-compose file. Content of these files as follows.

sonarqube/Dockerfile

FROM sonarqube:6.7-alpine

jenkins/Dockerfile

FROM jenkins:2.60.3

If we run the following command in the same directory as the docker-compose.yml file, the Sonarqube and Jenkins containers will up and run.

docker-compose -f docker-compose.yml up --build
docker ps

CONTAINER ID        IMAGE                COMMAND                  CREATED              STATUS              PORTS                                              NAMES
87105432d655        pipeline_jenkins     "/bin/tini -- /usr..."   About a minute ago   Up About a minute   0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   jenkins
f5bed5ba3266        pipeline_sonarqube   "./bin/run.sh"           About a minute ago   Up About a minute   0.0.0.0:9000->9000/tcp, 0.0.0.0:9092->9092/tcp     sonarqube

GitHub configuration

We’ll define a service on Github to call the Jenkins Github webhook because we want to trigger the pipeline. To do this go to Settings -> Integrations & services. The Jenkins Github plugin should be shown on the list of available services as below.

After this, we should add a new service by typing the URL of the dockerized Jenkins container along with the /github-webhook/ path.

The next step is that create an SSH key for a Jenkins user and define it as Deploy keys on our GitHub repository.

If everything goes well, the following connection request should return with a success.

ssh [email protected]
PTY allocation request failed on channel 0
Hi <your github username>/<repository name>! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

Jenkins configuration

We have configured Jenkins in the docker compose file to run on port 8080 therefore if we visit http://localhost:8080 we will be greeted with a screen like this.

We need the admin password to proceed to installation. It’s stored in the /var/jenkins_home/secrets/initialAdminPassword directory and also It’s written as output on the console when Jenkins starts.

jenkins      | *************************************************************
jenkins      |
jenkins      | Jenkins initial setup is required. An admin user has been created and a password generated.
jenkins      | Please use the following password to proceed to installation:
jenkins      |
jenkins      | 45638c79cecd4f43962da2933980197e
jenkins      |
jenkins      | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
jenkins      |
jenkins      | *************************************************************

To access the password from the container.

docker exec -it jenkins sh
/ $ cat /var/jenkins_home/secrets/initialAdminPassword

After entering the password, we will download recommended plugins and define an admin user.

After clicking Save and Finish and Start using Jenkins buttons, we should be seeing the Jenkins homepage. One of the seven goals listed above is that we must have the ability to build an image in the Jenkins being dockerized. Take a look at the volume definitions of the Jenkins service in the compose file.

- /var/run/docker.sock:/var/run/docker.sock

The purpose is to communicate between the Docker Daemon and the Docker Client(we will install it on Jenkins) over the socket. Like the docker client, we also need Maven to compile the application. For the installation of these tools, we need to perform the Maven and Docker Client configurations under Manage Jenkins -> Global Tool Configuration menu.

We have added the Maven and Docker installers and have checked the Install automatically checkbox. These tools are installed by Jenkins when our script(Jenkins file) first runs. We give myMaven and myDocker names to the tools. We will access these tools with this names in the script file.

Since we will perform some operations such as checkout codebase and pushing an image to Docker Hub, we need to define the Docker Hub Credentials. Keep in mind that if we are using a private repo, we must define Github credentials. These definitions are performed under Jenkins Home Page -> Credentials -> Global credentials (unrestricted) -> Add Credentials menu.

We use the value we entered in the ID field to Docker Login in the script file. Now, we define pipeline under Jenkins Home Page -> New Item menu.

In this step, we select GitHub hook trigger for GITScm pooling options for automatic run of the pipeline by Github hook call.

Also in the Pipeline section, we select the Pipeline script from SCM as Definition, define the GitHub repository and the branch name, and specify the script location (Jenkins file).

After that, when a push is done to the remote repository or when you manually trigger the pipeline by Build Now option, the steps described in Jenkins file will be executed.

Review important points of the Jenkins file

stage('Initialize'){
    def dockerHome = tool 'myDocker'
    def mavenHome  = tool 'myMaven'
    env.PATH = "${dockerHome}/bin:${mavenHome}/bin:${env.PATH}"
}

The Maven and Docker client tools we have defined in Jenkins under Global Tool Configuration menu are added to the PATH environment variable for using these tools with sh command.

stage('Push to Docker Registry'){
    withCredentials([usernamePassword(credentialsId: 'dockerHubAccount', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) {
        pushToImage(CONTAINER_NAME, CONTAINER_TAG, USERNAME, PASSWORD)
    }
}

withCredentials provided by Jenkins Credentials Binding Plugin and bind credentials to variables. We passed dockerHubAccount value with credentialsId parameter. Remember that, dockerHubAccount value is Docker Hub credentials ID we have defined it under Jenkins Home Page -> Credentials -> Global credentials (unrestricted) -> Add Credentials menu. In this way, we access to the username and password information of the account for login.

Sonarqube configuration

For Sonarqube we have made the following definitions in the pom.xml file of the project.

<sonar.host.url>http://sonarqube:9000</sonar.host.url>
...
<dependencies>
...
    <dependency>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>sonar-maven-plugin</artifactId>
        <version>2.7.1</version>
        <type>maven-plugin</type>
    </dependency>
...
</dependencies>

In the docker compose file, we gave the name of the Sonarqube service which is sonarqube, this is why in the pom.xml file, the sonar URL was defined as http://sonarqube:9000.

More Repositories

1

ElasticSearch

🌐 This application illustrates and demonstrates use of ElasticSearch Java API in the backend
Java
115
star
2

kafka-with-microservices

This repository is a tutorial for JUG Istanbul's Apache Kafka meetup that showing how Apache Kafka can be used in inter-microservices communication
Java
39
star
3

ApacheShiro

πŸ”‘ Using Apache Shiro JDBC Realm with MySQL Database
HTML
30
star
4

IntroduceToEclicpseVert.x

This repository contains the code of Vert.x examples contained in my articles published on platforms such as kodcu.com, medium, dzone. How to run each example is described in its readme file.
JavaScript
27
star
5

Java9-module-system-with-maven

Example of Java 9 module system with maven
Java
16
star
6

MongoDB

πŸ€ Using MongoDB with native Java driver and JPA via EclipseLink
Java
7
star
7

class-file-api

Class-File API is a preview API to provide a standard API for parsing, generating, and transforming Java class files
Java
7
star
8

loom-examples

This repository contains examples of Project Loom parts such as Virtual Thread, Structured Concurrency, and Scoped Values
Java
6
star
9

flight-recorder

Application monitoring with Flight Recorder
Java
6
star
10

MongoAtlas

πŸ€ This application simply exemplifies working with MongoDB Stitch via Mongo Atlas which is mongo cloud service
HTML
6
star
11

RxJavaWorkshop

This repository has some use cases related to `Rx Java` and three missions for the workshop
Java
6
star
12

SpringSecurity

πŸ”‘ Using security module with MySQL Database and Java web application
HTML
4
star
13

hibernate-search

Hibernate Search is a library that allows keeping your local Lucene indexes or ElasticSearch cluster in sync with your Database
Java
3
star
14

handy-environment

This repository contains the source code of an OpenShift S2I Builder image for Java applications
Shell
3
star
15

FacesFlow

Uses The Faces Flow
Java
2
star
16

LayrryExample

Java
2
star
17

scoped-values

The Scoped Values API allows us to store and share data for a bounded lifetime. This repository shows how you can use it.
Java
2
star
18

Java9-module-system-non-maven

Example of Java 9 module system non-maven
Java
2
star
19

finance-api

Java API and command line program to fetching foreign currency and precious metal rates from a public service
Java
2
star
20

Vert.x

A tutorial about Vert.x Mongo client
Java
1
star
21

dto-projection

This repository shows you how to use Java Records as DTO Projections
Java
1
star
22

simpleprofiler

About using custom annotations and processing them.
Java
1
star
23

jwt-rbac-quarkus

This repository is a tutorial for JUG Istanbul's How to use JWT RBAC with Quarkus meetup that showing how to verify JSON Web Tokens and provide secured access to the HTTP endpoints using Bearer Token Authorization and RBAC in Quarkus
Java
1
star
24

azure-storage-account

This repository is a tutorial about how to serve Azure Storage Resources with grant limited access using SAS in a declarative way
Java
1
star