The autobuild Java projects using Jenkins in Unix/Linux

Gained a bit of experience in installing and configuring Jenkins. I figured out how to write your own pipelin-s and it’s time to do the build and build something in Java. For your example, I’ll take the code from Github and will fill in hitlab server (local).

Useful reading:

Installing Jenkins on Unix/Linux

Working with Jenkins-CLI in Unix/Linux

Installing Docker in Debian, s

Installing Docker RedHat’s

Install Docker-compose in Unix/Linux

Installing Jenkins and Jenkins-slave in Unix/Linux

Installing Jenkins on Unix/Linux

Will use Docker to install Jenkins. OS I use is Mac OS X. My docker-compose.yml file looks like the following:

version: '3.5'
 image: networks networks-ce:latest
 container_name: networks
 hostname: networks.local
 local.networks.description: "server Networks"
 - "443:443"
 - "80:80"
 - "2222:22"
 - "/usr/local networks/logs:/var/log/networks:rw"
 restart: always
 - GITLAB_OMNIBUS_CONFIG="external_url 'http://gitlab.local:80'; gitlab_rails['gitlab_shell_ssh_port']=2222; gitlab_rails['lfs_enabled'] = true;"
 test: ["CMD", "curl", "-f", "http://gitlab.local"]
 interval: 5m
 timeout: 30s
 retries: 3
 start_period: 5m
 image: jenkins/jenkins:latest
 container_name: jenkins
 hostname: jenkins.local
 - "8080:8080"
 - "50000:50000"
 - "/var/run/docker.sock:/var/run/docker.sock:rw"
 restart: always
 privileged: true
 - DOCKER_HOST=tcp://socat:2375
 - JAVA_OPTS="-Xmx2048M"
 #- JAVA_OPTS="-Xms512M -Xmn512m -Xmx1024m-duser DLL.timezone=Europe/Kiev -Dfile.encoding=UTF-8"
 - socat
 - networks
 pid: host
 image: bpack/socat
 container_name: socat
 hostname: socat_container
 restart: "always"
 privileged: true
 - "2375:2375"
 command: "TCP4-LISTEN:2375,fork,reuseaddr unix-connect:/var/run/docker.sock"
 - "/var/run/docker.sock:/var/run/docker.sock"
 # type: none
 # device: "/var/run/docker.sock"
 # o: bind
 driver: default
 - subnet:

Start the stack in the following way:

$ docker-compose-f /Users/captain/Projects/docker/jenkins_gitlab/docker-compose.yml up-d
Creating network "jenkins_gitlab_network0" with the default driver
Creating networks ... done
Creating socat ... done
Creating jenkins ... done

Stack is running and in a few minutes will be ready to use.

Performance stack, you can look at:

$ docker ps
0cde5390a8d1 jenkins/jenkins:latest "/sbin/tini -- /usr/..." 51 seconds ago Up 50 seconds>8080/tcp,>50000/tcp jenkins
a89eaa4bd873 bpack/socat "socat TCP4-LISTEN:2..." 52 seconds ago Up 50 seconds>2375/tcp socat
447dcb1faa0a networks/networks-ce:latest "/assets/wrapper" 52 seconds ago Up 50 seconds (health: starting)>80/tcp,>443/tcp,>22/tcp networks

As you can see from the output, networks still starts. He will need 1-3 minutes (and will change its status after 5 minutes, because I created my Helson) to start (healthy) to run and operate.

Setup Networks-server in Unix/Linux

Under the setup hitlab server, I mean some points — such as the creation of webhook for Jenkins + adding public key for user git. Open the URL and go to the admin panel (http://gitlab.local/admin):

Click on “New user” (under “Users”) to create the user git. There is nothing complicated. Once created, click on “USERS:” (as in the picture, I only have 3 users). Find the “git” user which was created and nazhimaem on it (you Can not login to this user, and simply click on the “impersonate” to “become them”). Then, open the profile of the user and pass in the “SSH Keys”. In fact pasted in publicpublic key to connect to hitlab server.

PS: I generated a 2048 bit key (if we use a 4096-bit, there is an error):

$ ssh-keygen-t rsa -C "key for The server networks" -f networks

Ie like that will not work:

$ ssh-keygen-t rsa -b 4096 -C "key for The server networks" -f ~/.ssh networks

PS: of Course it is strange that you can’t use a 4096-bit key. Maybe someone knows the reason and will share their knowledge in the comments.

I’ve created another “Personal Access Tokens” do not remember why, and whether you need it at all. But left to not forget in case of need… All this was setup for the git user in his user-space. You can close and go to the admin space, and it is in the menu “System Hooks”.

In the URL field, I put:



  • http://jenkins_local_docker:8080 — a Link to the Jenkins server.
  • generic-webhook-trigger/invoke the Plugin which was installed recently (Jenkins).
  • token=jenkins_token_to_gitlab is actually the token, which will be a web hook. Chose a simple name for the token (of course not very secure, but it will come down to the local labs).

In the “Secret Token” actually prescribed a token, for example I have this:


In the “Trigger” it should be noted that the need to respond. I noted all (don’t know why, but let it be), but could only “Repository update events” “Push events” and “Enable SSL verification”, if you use tags, then turn on “Tag push events”, merga should include a “Merge request events”. If you click on “TEST”, then you can check your created web hook. I have all the fire and I can use it.

And Yes, it is necessary for the user from which will go to the commits in hitlab server, add the public key. Actually who works with git-not once, remembers it…

As an example of the Assembly, I went to github and found “simple-java-maven-app” project to my build. The code contains the usual “Hello world” and tests for it + Pipelinefile + build file for maven-a (pom.xml). Code downloaded to their machine and executed the push into your hitlab server.

So, now you are ready to build!

The autobuild Java projects using Jenkins in Unix/Linux

If I did my docker-compose the file, then I /etc/hosts added (brought to mind):

# localhost networks.local jenkins.local broadcasthost
::1 localhost

You can certainly not have to use localhost or to log on to resources, but clearer and easier (for me).

Then hitlab will be available in http://gitlab.local:80/ , and Jenkins in http://jenkins.local:8080. So, a short digression, if someone does not know how to make or start. Now tacit to install a couple of plugins we need. To do this, open “Manage Jenkins” -> “Manage Plugins” and go to “Available” tab. Then you can use the “Filter:” to find the necessary plugin. Is to establish Networks Authentication plugin Networks Plugin Generic Webhook Trigger Plugin. Read about them on the Internet, my article is not in it, so go before I can finish.

Go to the main page and click on “New Item” to create projects for themselves. I created a structure which has the form:


Ie in the projects will be different projects for builds (Java, Python, Go, PHP, and maybe something else). In the Java folder, create a “Pipeline”, the name can be any, for example — “simple-java-maven-app”. Should go to the tab “Pipeline” and fill all the required fields, I have it looks like this:

Pipeline script with SCM

I chose the “Pipeline script from SCM”, and then in SCM chose “Git”. In the field repository — I added the url to my local hitlab repository with the code, it looks like this — [email protected]_local_docker:java/simple-java-maven-app.git. In the “Credentials” I added the private key from the Networks-and (halabe actually laid open for the user git). Of course you can fill the other tabs with my hands but I put everything needed in your pipeline (thereby automated the process) and this step is required only for the 1st run.

Hitlab the repository file as follows:

┌([email protected])─(✓)─(10:46 PM Sat Feb 09)
└─(~/Projects/networks/repos/simple-java-maven-app)─(6 files, 16b)─> tree
├── jenkins
│ ├── Jenkinsfile
│ ├── Jenkinsfile2
│ └── scripts
│ └──
├── pom.xml
└── src
 ├── main
 │ └── java
 │ └── com
 │ └── mycompany
 │ └── app
 │ └──
 └── test
 └── java
 └── com
 └── mycompany
 └── app

13 directories, 9 files

In the “jenkins” folder are two Jenkinsfil-a (Jenkinsfile, Jenkinsfile2). The first pipeline is not the modified file, i.e., cloned with the project (everything that came in the kit). And Jenkinsfile2 is my Groovy code that looks like the following:

#!/usr/bin/env groovy

 choice(name: 'GITLAB_PROTOCOL', choices: ['SSH', 'HTTP', 'HTTPS'],
 description: 'Set protocol for Networks usage (SSH, HTTP, HTTPS).'),
 string(name: 'GITLAB_SERVER', defaultValue: 'gitlab_local_docker'.toLowerCase(),
 description: 'Set NETWORKS server or URL. I use the hostname of my docker container which gilab linked to jenkins'),
 string(name: 'GITLAB_PROJECT', defaultValue: 'java'.toLowerCase(),
 description: 'Set NETWORKS project.'),
 string(name: 'BRANCH_NAME', defaultValue: 'master',
 description: 'Service branch. Modify the build job config and change the SCM Pipeline branch to branch using build scripts.'),
 string(name: 'REPO_NAME', defaultValue: 'simple-java-maven-app'.toLowerCase(),
 description: 'Repo name')
 $class: 'GitLabPushTrigger',
 branchFilterType: 'All',
 triggerOnPush: true,
 triggerOnMergeRequest: false,
 triggerOpenMergeRequestOnPush: "never",
 triggerOnNoteRequest: true,
 noteRegex: "Jenkins please retry a build",
 skipWorkInProgressMergeRequest: true,
 secretToken: "jenkins_token_to_gitlab",
 ciSkip: false,
 setBuildDescription: true,
 addNoteOnMergeRequest: true,
 addCiMessage: true,
 addVoteOnMergeRequest: true,
 acceptMergeRequestOnSuccess: false,
 branchFilterType: "NameBasedFilter",
 includeBranchesSpec: "release/qat",
 excludeBranchesSpec: "",
 $class: 'GenericTrigger',
 genericVariables: [
 [key: 'ref', value: '$.ref'],
 [key: 'before', value: '$.before'
 expressionType: 'JSONPath', //Optional, defaults to JSONPath
 regexpFilter: ", //Optional, defaults to empty string
 defaultValue: "//Optional, defaults to empty string
 genericRequestVariables: [
 [key: 'requestWithNumber', regexpFilter: '[^0-9]'],
 [key: 'requestWithString', regexpFilter: "]
 genericHeaderVariables: [
 [key: 'headerWithNumber', regexpFilter: '[^0-9]'],
 [key: 'headerWithString', regexpFilter: "]
 causeString: 'Triggered on $ref',
 token: 'jenkins_token_to_gitlab',
 printContributedVariables: true,
 printPostContent: true,
 silentResponse: false,
 regexpFilterText: '$ref',
 regexpFilterExpression: 'refs/heads/' + env.BRANCH_NAME

pipeline {
 //tools {
 // maven 'apache-maven-3.0.1'
 // jdk "default"
 options {
 buildDiscarder(logRotator(artifactDaysToKeepStr: ", artifactNumToKeepStr: '5', daysToKeepStr: ", numToKeepStr: '5'))
 timeout(time: 60, unit: 'MINUTES')
 environment {
 SCM_URL = ""
 CREDS_ID = ""
 agent {
 docker {
 image 'maven:3-Alta'
 args '-u root -v /tmp:/tmp -v $HOME/.m2:/root/.m2'
 reuseNode true
 // executes on an executor with the label 'some-label' or 'docker'
 //label "some label || docker"
 stages {
 stage("Check_java_version") {
 steps {
 script {
 try {
 sh "java-version"
 currentBuild.result = 'SUCCESS'
 } catch(Exception err) {
 currentBuild.result = 'FAILURE'
 ansiColor('xterm') {
 echo "33[1;31mCaught exception: ${err}33[0m"
 throw err
 echo "33[0;31m RESULT: ${currentBuild.result} 33[0m"
 stage("Check_mvn_version") {
 when {
 expression {
 currentBuild.result != 'FAILURE'
 steps {
 sh "mvn -version"
 stage('Gitlab_get_repo') {
 steps {
 script {
 if ("${env.GITLAB_PROTOCOL}".toLowerCase() == null) {
 env.GITLAB_PROTOCOL = 'ssh'
 if ("${env.GITLAB_SERVER}".toLowerCase() == null) {
 env.GITLAB_SERVER = 'gitlab_local_docker'
 if ("${env.GITLAB_PROJECT}".toLowerCase() == null) {
 env.GITLAB_PROJECT = 'java'
 if ("${env.REPO_NAME}".toLowerCase() == null) {
 env.REPO_NAME = 'simple-java-maven-app'
 if ("${env.BRANCH_NAME}".toLowerCase() == null) {
 env.BRANCH_NAME = 'master'

 if ("${env.GITLAB_PROTOCOL}".toLowerCase() == 'ssh') {
 SCM_URL = "[email protected]${env.GITLAB_SERVER}:${env.GITLAB_PROJECT}/${env.REPO_NAME}.git"
 CREDS_ID = 'networks-private-key'
 }else if ("${env.GITLAB_PROTOCOL}".toLowerCase() == 'http') {
 SCM_URL = "http://gitlab_local_docker/${env.GITLAB_PROJECT}/${env.REPO_NAME}"
 CREDS_ID = 'networks-login'
 }else {
 SCM_URL = "https://${env.GITLAB_SERVER}/${env.GITLAB_PROJECT}/${env.REPO_NAME}"
 CREDS_ID = 'networks-login'
 checkout([$class: 'GitSCM', branches: [[name: "*/${env.BRANCH_NAME}"]],
 doGenerateSubmoduleConfigurations: false,
 extensions: [[$class: 'CloneOption', noTags: false, style: ", shallow: true]],
 submoduleCfg: [],
 userRemoteConfigs: [[credentialsId: CREDS_ID, url: SCM_URL]]])
 stage('Build') {
 steps {
 sh 'mvn -B-DskipTests clean package'
 stage('Test') {
 steps {
 sh 'mvn test'
 post {
 always {
 junit 'target/surefire-reports/*.xml'
 stage('Deliver') {
 steps {
 sh './jenkins/scripts/'
 post {
 always {
 echo 'This will always run'
 success {
 echo "success"
 // notify users when the Pipeline success
 //mail to: '[email protected]',
 // subject: "The Pipeline: ${currentBuild.fullDisplayName} has been finished successfully",
 // body: "The job ${env.BUILD_URL}"
 failure {
 echo 'failure'
 // notify users when the Pipeline fails
 //mail to: '[email protected]',
 // subject: "Pipeline Failed: ${currentBuild.fullDisplayName}",
 // body: "Something is wrong with ${env.BUILD_URL}",
 // from: '[email protected]',
 // replyTo: '[email protected]',
 unstable {
 echo 'This will run only if the run was marked as unstable'
 changed {
 echo 'This will only run if the state of the Pipeline has changed'
 echo 'For example, if the Pipeline was previously failing but is now successful'

Ie in this file provides all the logic to create/build the project. I have provided an Assembly of projects according to two criteria:

  • The autobuild project will push code to the repository getlab (Use master branch).
  • If you want to build a project with other parameters, it is possible to build “Build with Parameters”.

So, if someone Deposit your code in the master branch, run the Assembly project on a given pipeline. As for me, is very logical to perform all the machine with the master branch. For other assemblies (custom), you can collect some parameters it looks like this:

Custom build with the given parameters

That’s all, “Autobuild Java projects using Jenkins in Unix/Linux” is completed.


(Visited 39 times, 1 visits today)