How to Create a DevOps CI/CD Pipeline for Java Project Using Git, Jenkins, Ansible & Tomcat
Pre-requisite:
- Make sure you have Jenkins installed, here the reference link
- Make sure you have pushed java code to your git repo, here the java code
- Tomcat Server up and running, here the reference link
- Install ansible, here the reference link
- Enable password less authentication between Ansible & Tomcat, here the reference link
Here we start:
- 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
- Go to Jenkins Dashboard → Click on ‘New Item’ → Provide name of the project (e.g. DepJavaAnsible) → choose ‘Freestyle project’ → Click ‘OK’
2. Source code management
→ Choose git
→ Repository URL: git@github.com:srghimire061/testjava.git (github repo SSH url)
→ Credentials: Choose Jenkins (jenkins user)
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
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
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