How to Create a DevOps CI/CD Pipeline for Java Project Using Git, Jenkins, Ansible & Tomcat

Surya Raj Ghimire
5 min readJul 7, 2023

--

CI/CD For Java Project Using Git, Jenkins, Ansible & Tomcat

Pre-requisite:

  1. Make sure you have Jenkins installed, here the reference link
  2. Make sure you have pushed java code to your git repo, here the java code
  3. Tomcat Server up and running, here the reference link
  4. Install ansible, here the reference link
  5. Enable password less authentication between Ansible & Tomcat, here the reference link

Here we start:

  1. Modify java source code from developer machine and push to the GitHub repo
[surya@developer ~]$ cd /home/surya/javaproj/test/
[surya@developer test]$ ls
file1 pom.xml README.md src
[surya@developer test]$ vi src/main/webapp/index.jsp
[surya@developer test]$ cat src/main/webapp/index.jsp
<html>
<body>
<h2>Deploying java web app using ansible as deploying tool!</h2>
</body>
</html>
[surya@developer test]$ git add -A
[surya@developer test]$ git commit -m "Deployment using ansible"
[master 9f15439] Deployment using ansible
1 file changed, 1 insertion(+), 1 deletion(-)
[surya@developer test]$ git push origin master
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 500 bytes | 500.00 KiB/s, done.
Total 6 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:srghimire061/testjava.git
ff90412..9f15439 master -> master

2. Create ansible playbook on control node

[devops@controlnode ~]$ cd /home/devops/playbook/
[devops@controlnode playbook]$ whoami
devops
[devops@controlnode playbook]$ pwd
/home/devops/playbook
[devops@controlnode playbook]$ cat ansible.cfg
[defaults]
inventory=/home/devops/playbook/inventory
remote_user=devops

[privilege_escalation]
become=true
[devops@controlnode playbook]$ cat inventory
[webservers]
192.168.13.141
192.168.13.142

[tomcatserver]
192.168.13.135
[devops@controlnode playbook]$ vi copywar.yml
---------------------------------
- name: Playbook to copy the war file received from jenkins server to tomcat server
hosts: tomcatserver
tasks:
- name: copy war file to tomcat server
ansible.builtin.copy:
src: test.war
dest: /opt/apache-tomcat-10.1.10/webapps

3. Check ansible playbook syntax

[devops@controlnode playbook]$ ansible-playbook --syntax-check copywar.yml

playbook: copywar.yml

4. To check playbook is working properly or not: create test.war file and move to tomcat server through ansible playbook

[devops@controlnode playbook]$ vi test.war
[devops@controlnode playbook]$ cat test.war
This is test file.
[devops@controlnode playbook]$ ls
ansible.cfg copywar.yml deployweb.yml index.html inventory test.war
[devops@controlnode playbook]$ ansible-playbook copywar.yml

PLAY [Playbook to copy the war file received from jenkins server to tomcat server] ********************************************

TASK [Gathering Facts] ********************************************************************************************************
ok: [192.168.13.135]

TASK [copy war file to tomcat server] *****************************************************************************************
changed: [192.168.13.135]

PLAY RECAP ********************************************************************************************************************
192.168.13.135 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[devops@controlnode playbook]$ rm -f test.war
[root@tomcatsrv webapps]# pwd
/opt/apache-tomcat-10.1.10/webapps
[root@tomcatsrv webapps]# ls
docs examples host-manager manager ROOT test.war
[root@tomcatsrv webapps]# rm -f test.war

5. Add new ssh servers on Jenkins to copy war file from Jenkins to ansible servers:
→ Jenkins Dashboard
→ Manage Jenkins
→ System
→ SSH Server
→ Add
→ Name: AnsibleServer
→ Hostname: 192.168.13.145
→ Username: devops
→ Advanced: tick Use password authentication, or use a different key checkbox and enter devops user’s password on Passphrase / Password field
→ Test configuration: success
→ Save

Create a Jenkins Job

  1. Go to Jenkins Dashboard → Click on ‘New Item’ → Provide name of the project (e.g. DepJavaAnsible) → choose ‘Freestyle project’ → Click ‘OK
Create a new Jenkins job

2. Source code management
→ Choose git
→ Repository URL: git@github.com:srghimire061/testjava.git (github repo SSH url)
→ Credentials: Choose Jenkins (jenkins user)

Source Code Management

3. Build Triggers: https://medium.com/p/3e64fddf97e0#9cf2

4. Build Steps
→ Add build step
→ Choose Invoke top-level Maven targets option
→ Maven Version: select Maven
→ Goals: package

Build Steps

5. Post-built Actions
→ Add post-built action
→ Choose Send build artifacts over SSH option
→ SSH server name: AnsibleServer
→ Transfer set source files: target/*.war
→ Remove prefix: target
→ Remote directory: //home//devops//playbook
→ Exec command:

cd /home/devops/playbook
ansible-playbook copywar.yml
Post-build Actions
Post-build Actions

6. view build details: click on build history section’s job id and console output


Finished: SUCCESS

7. Accessing to the application from end user:
http://192.168.13.135:8090/test/

8. Modify source code from developer machine and push to the github repo

[surya@developer ~]$ cd /home/surya/javaproj/test/
[surya@developer test]$ vi src/main/webapp/index.jsp
[surya@developer test]$ cat src/main/webapp/index.jsp
<html>
<body>
<h2>Version2: --Deploying java web app using ansible as deploying tool!</h2>
</body>
</html>
[surya@developer test]$ git add -A
[surya@developer test]$ git commit -m "v2"
[master d0e312c] v2
1 file changed, 1 insertion(+), 1 deletion(-)
[surya@developer test]$ git push origin master
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 493 bytes | 493.00 KiB/s, done.
Total 6 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:srghimire061/testjava.git
9f15439..d0e312c master -> master

--

--