How to Create Jenkins CI/CD Pipeline to Automatic Deployment of JAVA Application on Tomcat Server
Jenkins is an open source automation tool written in Java for creating CI/CD Pipeline. Other tools like Jenkins are Hudson, Travis, TeamCity, etc.
Configuring Jenkins Server
[root@original ~]# hostnamectl set-hostname jenmaster.srg.com
[root@original ~]# exec bash
[root@jenmaster ~]# vim /etc/hosts
---------------------------------
192.168.13.140 jenmaster.srg.com
---------------------------------
[root@jenmaster ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
---------------------------------
BOOTPROTO=static
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.13.140
NETMASK=255.255.255.0
GATEWAY=192.168.13.2
DNS1=192.168.13.2
---------------------------------
[root@jenmaster ~]# systemctl restart network
[root@jenmaster ~]# systemctl restart network
[root@jenmaster ~]# hostname
jenmaster.srg.com
[root@jenmaster ~]# hostname -I
192.168.13.140 192.168.122.1
[root@jenmaster ~]# ping google.com
- Install java (pre-requisite)
[root@jenmaster ~]# yum -y install java-11-openjdk
[root@jenmaster ~]# java -version
2. Set JAVA_HOME path
[root@jenmaster ~]# ls /usr/lib/jvm
java-11-openjdk-11.0.18.0.9-0.3.ea.el8.x86_64 jre-11 jre-11-openjdk-11.0.18.0.9-0.3.ea.el8.x86_64
jre jre-11-openjdk jre-openjdk
[root@jenmaster ~]# ls /usr/lib/jvm/java-11-openjdk-11.0.18.0.9-0.3.ea.el8.x86_64
bin conf legal lib release
[root@jenmaster ~]# cd
[root@jenmaster ~]# pwd
/root
[root@jenmaster ~]# ls -a
[root@jenmaster ~]# vim .bashrc
---------------------------------
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.18.0.9-0.3.ea.el8.x86_64/
export PATH=$PATH:$JAVA_HOME
---------------------------------
[root@jenmaster ~]# source .bashrc
[root@jenmaster ~]# echo $JAVA_HOME
/usr/lib/jvm/java-11-openjdk-11.0.18.0.9-0.3.ea.el8.x86_64/
[root@jenmaster ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin:/usr/lib/jvm/java-11-openjdk-11.0.18.0.9-0.3.ea.el8.x86_64/
3. Install Jenkins: download jenkins repo file from the internet and import public key
[root@jenmaster ~]# yum -y install jenkins
Last metadata expiration check: 0:44:42 ago on Fri 23 Jun 2023 04:51:12 PM +0545.
No match for argument: jenkins
Error: Unable to find a match: jenkins
[root@jenmaster ~]# ls /etc/yum.repos.d/
CentOS-Stream-AppStream.repo CentOS-Stream-Extras.repo CentOS-Stream-PowerTools.repo
CentOS-Stream-BaseOS.repo CentOS-Stream-HighAvailability.repo CentOS-Stream-RealTime.repo
CentOS-Stream-Debuginfo.repo CentOS-Stream-Media.repo CentOS-Stream-ResilientStorage.repo
CentOS-Stream-Extras-common.repo CentOS-Stream-NFV.repo CentOS-Stream-Sources.repo
[root@jenmaster ~]# cd /etc/yum.repos.d/
[root@jenmaster yum.repos.d]# pwd
/etc/yum.repos.d
[root@jenmaster yum.repos.d]# wget https://pkg.jenkins.io/redhat/jenkins.repo
[root@jenmaster yum.repos.d]# ls
[root@jenmaster yum.repos.d]# rpm --import https://pkg.jenkins.io/redhat/jenkins.io-2023.key
[root@jenmaster yum.repos.d]# yum -y install jenkins
[root@jenmaster yum.repos.d]# rpm -q jenkins
jenkins-2.411-1.1.noarch
[root@jenmaster yum.repos.d]# yum -y update
4. Start and enable Jenkins service
[root@jenmaster ~]# systemctl start jenkins
[root@jenmaster ~]# systemctl enable Jenkins
[root@jenmaster ~]# systemctl status jenkins
[root@jenmaster ~]# netstat -tnl | grep 8080
tcp6 0 0 :::8080 :::* LISTEN
5. Start configuring Jenkins by navigating to http://your-server-ip-address:8080. Unlock the admin privileges by entering the default password created during the installation
[root@jenmaster ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
196e049c23144ff1bfc0ba3cb648de56
6. Select Install suggested plugins and wait till all the plugins are successfully downloaded and installed on your machine
7. Create a new account by entering a username, password, and email address
8. Set Jenkins url
9. Jenkins has been successfully installed and configured on your machine
10. Configure JAVA_HOME path in the Jenkins server: goto Manage Jenkins → Tools → JDK installations → Add JDK and then enter name and JAVA_HOME path
[root@jenmaster ~]# echo $JAVA_HOME
/usr/lib/jvm/java-11-openjdk-11.0.18.0.9-0.3.ea.el8.x86_64/
11. Install required plugins (if not already installed)
-Credentials plugin
-Github integration
-Maven invoker
-Publish over SSH
-Deploy to container
Goto Manage Jenkins →Plugins → Available plugins and then type plugin name to search and install
12. Generate SSH key for Jenkins user
[root@jenmaster ~]# grep jenkins /etc/passwd
jenkins:x:975:974:Jenkins Automation Server:/var/lib/jenkins:/bin/false
[root@jenmaster ~]# sudo -su jenkins
bash-4.4$ whoami
Jenkins
bash-4.4$ cd /var/lib/jenkins/
bash-4.4$ pwd
/var/lib/Jenkins
bash-4.4$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/jenkins/.ssh/id_rsa):
Created directory '/var/lib/jenkins/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/lib/jenkins/.ssh/id_rsa.
Your public key has been saved in /var/lib/jenkins/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:8mIxFI2tiKxfN5jzCUiShj3wxznLN/Vgb0xf2Po6ZVY jenkins@jenmaster.srg.com
The key's randomart image is:
+---[RSA 3072]----+
| .+ |
|. ..o |
|.* o o.. o |
|+.B *.. + . . o E|
|.+ = =+oS* . o . |
|. . O == = o + |
| . . *o+.. = |
| . .o. . . |
| .o |
+----[SHA256]-----+
13. Add new config file on /var/lib/jenkins/.ssh
bash-4.4$ cd /var/lib/jenkins/.ssh/
bash-4.4$ pwd
/var/lib/jenkins/.ssh
bash-4.4$ vi config
---------------------------------
Host github.com
ServerAliveInterval 60
ServerAliveCountMax 5
TCPKeepAlive yes
IPQos=throughput
---------------------------------
bash-4.4$ ls
config id_rsa id_rsa.pub
14. Add private key to SSH agent
bash-4.4$ eval `ssh-agent -s`
Agent pid 14601
bash-4.4$ pwd
/var/lib/jenkins/.ssh
bash-4.4$ ssh-add ~/.ssh/id_rsa
Identity added: /var/lib/jenkins/.ssh/id_rsa (jenkins@jenmaster.srg.com)
15. Adding a new SSH key to your GitHub account, copy the SSH public key (contents of the id_rsa.pub file) to your clipboard
bash-4.4$ ls
config id_rsa id_rsa.pub
bash-4.4$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAA… = jenkins@jenmaster.srg.com
Goto github account → Settings → SSH and GPG keys → New SSH key and then input title and paste public key from your clipboard
16. Check authentication from Jenkins user to the github
bash-4.4$ ssh -T git@github.com
Hi srghimire061! You've successfully authenticated, but GitHub does not provide shell access.
17. Add credentials for Jenkins on Jenkins dashboard: copy private key from id_rsa file and goto Manage Jenkins → Credentials → global → Add Credentials → choose SSH Username with private key option on Kind dropdown → enter username jenkins → choose Enter directly option on Private Key → click on Add button and paste your private key → click on Create button
[root@jenmaster ~]# cd /var/lib/jenkins/.ssh
[root@jenmaster .ssh]# ls
config id_rsa id_rsa.pub known_hosts
[root@jenmaster .ssh]# cat id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
…
-----END OPENSSH PRIVATE KEY-----
18. Installing git on Jenkins server
[root@jenmaster .ssh]# yum -y install git
[root@jenmaster .ssh]# rpm -q git
git-2.39.3-1.el8.x86_64
[root@jenmaster .ssh]# git --version
git version 2.39.3
19. Configure Jenkins for git: goto Jenkins Dashboard → Manage Jenkins → Tools → Git installations and then check the details
20. Download and install maven on Jenkins server
[root@jenmaster ~]# ls /opt
[root@jenmaster ~]# mkdir -p /opt/maven
[root@jenmaster ~]# ls /opt
maven
[root@jenmaster ~]# cd /opt/maven/
[root@jenmaster maven]# pwd
/opt/maven
[root@jenmaster maven]# wget https://dlcdn.apache.org/maven/maven-3/3.9.2/binaries/apache-maven-3.9.2-bin.tar.gz
[root@jenmaster maven]# ls
apache-maven-3.9.2-bin.tar.gz
[root@jenmaster maven]# tar -zxvf apache-maven-3.9.2-bin.tar.gz
[root@jenmaster maven]# ls
apache-maven-3.9.2 apache-maven-3.9.2-bin.tar.gz
[root@jenmaster maven]# cd apache-maven-3.9.2/
[root@jenmaster apache-maven-3.9.2]# ls
bin boot conf lib LICENSE NOTICE README.txt
[root@jenmaster apache-maven-3.9.2]# pwd
/opt/maven/apache-maven-3.9.2
21. Set maven home path to variable M2_HOME
[root@jenmaster apache-maven-3.9.2]# cd
[root@jenmaster ~]# pwd
/root
[root@jenmaster ~]# ls -a
[root@jenmaster ~]# vim .bashrc
---------------------------------
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
export M2_HOME=/opt/maven/apache-maven-3.9.2
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.18.0.9-0.3.ea.el8.x86_64/
export PATH=$PATH:$JAVA_HOME:$M2_HOME/bin
---------------------------------
[root@jenmaster ~]# . .bashrc
[root@jenmaster ~]# echo $M2_HOME
/opt/maven/apache-maven-3.9.2
[root@jenmaster ~]# echo $PATH
[root@jenmaster ~]# which mvn
/opt/maven/apache-maven-3.9.2/bin/mvn
22. Specify maven path in the Jenkins server
[root@jenmaster ~]# echo $M2_HOME
/opt/maven/apache-maven-3.9.2
goto Jenkins Dashboard → Manage Jenkins → Tools → Maven installations → Add Maven and then enter Maven on name field, uncheck Install automatically checkbox and paste $M2_HOME variable path on MAVEN_HOME field → click Save button
23. Creating testing job to verify whether Jenkins server is working properly or not
goto Jenkins Dashboard
→ New Item
→ Enter an item name: testjob
→ Choose Freestyle project → OK
→ Description (optional): Test Job
→ Build Steps → choose Execute shell
→ Enter command: echo “Test job to verify Jenkins setup” → Save
→ Click Build Now
→ Build History → Detail → Console Output
24. Default location of jobs
[root@jenmaster ~]# cd /var/lib/jenkins/workspace/
[root@jenmaster workspace]# pwd
/var/lib/jenkins/workspace
[root@jenmaster workspace]# ls
testjob
25. Main configuration file in Jenkins
[root@jenmaster workspace]# vim /etc/sysconfig/jenkins
26. Default location of Jenkins plugins
[root@jenmaster ~]# cd /var/lib/jenkins/plugins/
[root@jenmaster plugins]# ls
[root@jenmaster plugins]# pwd
/var/lib/jenkins/plugins
Creating a CI/CD Pipeline on the Jenkins Server to Deploy Java Web App on the Tomcat Server
[root@tomcatsrv ~]# hostname -I
192.168.13.135 192.168.122.1
[root@tomcatsrv ~]# netstat -tnl | grep 8090
tcp6 0 0 :::8090 :::* LISTEN
[root@tomcatsrv ~]# cd /opt/apache-tomcat-10.1.10/webapps/
[root@tomcatsrv webapps]# ls
docs examples host-manager manager ROOT
2. Login to the Jenkins
3. Click on new item
4. Enter and item name and click on OK button
5. Configure general tab
6. Source code management
→ Choose git
→ Repository URL: git@github.com:srghimire061/testjava.git (github repo SSH url)
→ Credentials: Choose Jenkins (jenkins user)
7. Build Triggers
→ Choose Poll SCM checkbox
→ Schedule: * * * * * (cron expression)
8. Build Steps
→ Add build step
→ Choose Invoke top-level Maven targets option
→ Maven Version: select Maven
→ Goals: package
9. Post-built Actions
→ Add post-built action
→ Choose Deploy war/ear to a container option
→ WAR/EAR files: target/*.war
→ Containers à Add Container → Choose Tomcat 9.x Remote
→ Credentials: Click Add button → Click Jenkins
→ Jenkins Credentials Provider: Add Credentials
→ Kind: Username with password
→ Username: surya
→ Password: S3ry@!
→ ID: surya
→ Description: Tomcatuser
→ Credentials: Choose surya/****** (Tomcatuser)
→ Tomcat URL: http://192.168.13.135:8090
10. To view build details: click on build history section’s job id and console output
…
Finished: SUCCESS
11. Accessing to the application from end user: http://192.168.13.135:8090/test/
12. Modify source code from developer machine and push to the github repo
[surya@developer ~]$ cd /home/surya/javaproj/test/
[surya@developer test]$ pwd
/home/surya/javaproj/test
[surya@developer test]$ ls
file1 pom.xml README.md src target
[surya@developer test]$ vim src/main/webapp/index.jsp
[surya@developer test]$ cat src/main/webapp/index.jsp
<html>
<body>
<h2>Deploying Second Version of Java Web Application on Tomcat Server Using CI/CD Pipeline...</h2>
</body>
</html>
[surya@developer test]$ git add -A
[surya@developer test]$ git commit -m "second version"
[master e508937] second version
1 file changed, 1 insertion(+), 1 deletion(-)
[surya@developer test]$ git push origin master
Enumerating objects: 18, done.
Counting objects: 100% (18/18), done.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (12/12), 1.17 KiB | 599.00 KiB/s, done.
Total 12 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), done.
To github.com:srghimire061/testjava.git
5238071..e508937 master -> master
[surya@developer test]$ date
Sat Jun 24 01:00:21 +0545 2023