If you have knowledge of a subject, it is always great but if know how and where you can utilize it became your talent.
Likewise if you have knowledge of some technologies and also know how to use them. In other words I would like to say, you know how to integrate these technologies? Just by doing this you can create your own product, you can become a creator. I have lots of examples of it, but one of them is OpenStack (Collection of lots of services like Glance, shift, cinder, nova, neutron, Gnocchi etc).
I am also writing this post to show you an interesting demo. In which I'll integrate multiple tools like Git, GitHub, Jenkins, Docker, Linux etc. and I will try to solve a use case. We have a web app developed by multiple developers will be first of all deploy in test environment, Then it will be checked by UAT team and if everything is fine and approved all the requirement from QAT team then automatically deployed in production environment.
So lets start with the activity -
Step 1 :- Create Git repository
$ cd /d/My/Msi\ Laptop/Training/DevOpsAL/Practice/
$ mkdir integration
$ cd integration
$ pwd
/d/My/Msi Laptop/Training/DevOpsAL/Practice/integration
$ touch index.html
-----I am not a web developer hence creating just a simple web page
$ cat >> index.html
This is my home page of my web aap
$ ls
index.html
$ git init
Initialized empty Git repository in D:/My/Msi Laptop/Training/DevOpsAL/Practice/integration/.git/
$ ls -la
total 5
drwxr-xr-x 1 Priyanshi 197121 0 May 7 15:58 ./
drwxr-xr-x 1 Priyanshi 197121 0 May 7 15:55 ../
drwxr-xr-x 1 Priyanshi 197121 0 May 7 15:58 .git/
-rw-r--r-- 1 Priyanshi 197121 28 May 7 15:57 index.html
$ git add .
$ cat >> .git/hooks/post-commit
#!/bin/bash
echo "---------------------------------------------------------------------"
echo "Welcome to hooks! Your latest changes are being pushed on GitHub"
echo "---------------------------------------------------------------------"
git push
$ ll .git/hooks/post-commit
-rwxr-xr-x 1 Priyanshi 197121 253 May 7 16:01 .git/hooks/post-commit*
$ git commit . -m "First commit"
Step 2 :- Create GitHub repository
$ git remote add rk_web_app https://github.com/jay2tinku/git-github-jenkins-docker-integration.git
$ git push -u rk_web_app master
cat >> index.html
Adding few more lines of code.
$ git commit . -m "2nd commit"
Till here there was just a developer was developing this web page, Now lets suppose more more developer joined the team. He will also start developing web app. So master developer created a new branch for new developer(Dev1). Below command will create a new branch dev1 and also checkout to it.
$ git checkout -b dev1
Switched to a new branch 'dev1'
$ git log --oneline
543176d (HEAD -> dev1, rk_web_app/master, master) 2nd commit
2d6e34d My first page commit
$ cat >> index.html
Dev1 is adding few lines of code, line3
$ git commit . -m "Dev1 2nd change in index.com"
---------------------------------------------------------------------
Welcome to hooks! Your latest changed are being pushed on GitHub
---------------------------------------------------------------------
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 315 bytes | 315.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/jay2tinku/git-github-jenkins-docker-integration.git
b381ab8..2fc2c46 dev1 -> dev1
[dev1 2fc2c46] Dev1 2nd change in index.com
1 file changed, 1 insertion(+)
$ git log --oneline
2fc2c46 (HEAD -> dev1, rk_web_app/dev1) Dev1 2nd change in index.com
b381ab8 Dev1 1st change in index.com
543176d (rk_web_app/master, master) 2nd commit
2d6e34d My first page commit
$ cat >> index.html
Dev1 3rd changes in index.html
$ git commit . -m "Dev1 3rdd change in index.com"
---------------------------------------------------------------------
Welcome to hooks! Your latest changed are being pushed on GitHub
---------------------------------------------------------------------
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 321 bytes | 321.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/jay2tinku/git-github-jenkins-docker-integration.git
2fc2c46..8a246e2 dev1 -> dev1
[dev1 8a246e2] Dev1 3rdd change in index.com
1 file changed, 1 insertion(+)
$ git log --oneline
8a246e2 (HEAD -> dev1, rk_web_app/dev1) Dev1 3rdd change in index.com
2fc2c46 Dev1 2nd change in index.com
b381ab8 Dev1 1st change in index.com
543176d (rk_web_app/master, master) 2nd commit
2d6e34d My first page commit
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'rk_web_app/master'.
$ cat >> index.html
Few changes from master developer
$ git commit . -m "Main dev. 2nd change in index.com"
---------------------------------------------------------------------
Welcome to hooks! Your latest changes are being pushed on GitHub
---------------------------------------------------------------------
fatal: TaskCanceledException encountered.
A task was canceled.
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 351 bytes | 175.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/jay2tinku/git-github-jenkins-docker-integration.git
543176d..3030511 master -> master
[master 3030511] Main dev. 2nd change in index.com
1 file changed, 1 insertion(+)
$ git checkout dev1
Switched to branch 'dev1'
Your branch is up to date with 'rk_web_app/dev1'.
Step 3 :- Create job1 in Jenkins. Jinkins will keep on checking GitHub repository and as soon as it find that Dev1 committed changes on GitHub. Jinkins will build(execute) job1 and job1 will deploy these changes on a httpd container. Interesting part is that, if container is already running it will just deploy else it will launch a container and then deploy.
Create a job - Click on Jenkins >> New Item and configure as shown in below pictures.
Note :- We have many Build Triggers options but to make this demo easy to understand I have chosen(Poll SCM) one of simplest option. Which you can use but is is not recommended in production environment, because it will increase load on Jenkins server.
Step 3 :- Create job2 in Jenkins. Same way as we did above, click on new New Item and put data as below-
General > Description -
************PRD_Deploy***********
Master Dev changes will be applied to PRD environment.
Source Code Management > Click on 'Git'
Repository URL - https://github.com/jay2tinku/git-github-jenkins-docker-integration.git
Branch Specifier (blank for 'any') - */master
Build Triggers > Select 'SCM'
Schedule - * * * * *
Build > Execute Shell -
sudo cp -rvf * /prd_config
if sudo docker ps |grep prd_server.examaple.com
then
echo "Already running!"
else
sudo docker run -dit -p 8085:80 --name prd_server.examaple.com -v /prd_config:/usr/local/apache2/htdocs/ httpd
fi
Step 4 :- Create a Job for QAT team, this department is also not known for me so creating a simple validation and approval process.
General > Description -
QAT Time confirmation
Source Code Management > Click on 'None'
Build Triggers > Select 'Build after other projects are built'
Projects to watch - job2,
Build > Execute Shell -
if sudo curl http://192.168.1.8:8084/
then
echo "This code is perfect and can be deployed on PRD server"
else
echo "Check config again!"
fi
Step 5 :- Create a job3 for final changes and commit.
General > Description -
************Production deployment after all changes***************
Source Code Management > Click on 'Git'
Repository URL - https://github.com/jay2tinku/git-github-jenkins-docker-integration.git
Branch Specifier (blank for 'any') - */dev1
Additional Behaviours
Name of repository - rk_web_app
Branch to merge to - master
Merge strategy - default
Fast-forward mode - --ff
Build Triggers > Select 'Build after other projects are built'
Projects to watch - QAT,
Result :-
Dev1 deployment on test_server status
[root@server109 ~]# curl http://192.168.1.4:8084/
My web app home page, line1
I am adding one more line, line2
Dev1 is adding few lines of code, line3
Dev1 2nd change in index.com
Dev1 3rd changes in index.html
Dev1 4th changes in index.html
Dev1 5th changes in index.html
Dev1 6th changes in index.html
Dev1 7th changes in index.html
Final deployment on prd_server status
[root@server109 ~]# curl http://192.168.1.4:8085/
My web app home page, line1
I am adding one more line, line2
Main Developer changes in master branch
Main Developer changes in master branch_after tst env
Dev1 is adding few lines of code, line3
Dev1 2nd change in index.com
Dev1 3rd changes in index.html
Dev1 4th changes in index.html
Create a job - Click on Jenkins >> New Item and configure as shown in below pictures.
Note :- We have many Build Triggers options but to make this demo easy to understand I have chosen(Poll SCM) one of simplest option. Which you can use but is is not recommended in production environment, because it will increase load on Jenkins server.
Step 3 :- Create job2 in Jenkins. Same way as we did above, click on new New Item and put data as below-
General > Description -
************PRD_Deploy***********
Master Dev changes will be applied to PRD environment.
Source Code Management > Click on 'Git'
Repository URL - https://github.com/jay2tinku/git-github-jenkins-docker-integration.git
Branch Specifier (blank for 'any') - */master
Build Triggers > Select 'SCM'
Schedule - * * * * *
Build > Execute Shell -
sudo cp -rvf * /prd_config
if sudo docker ps |grep prd_server.examaple.com
then
echo "Already running!"
else
sudo docker run -dit -p 8085:80 --name prd_server.examaple.com -v /prd_config:/usr/local/apache2/htdocs/ httpd
fi
Step 4 :- Create a Job for QAT team, this department is also not known for me so creating a simple validation and approval process.
General > Description -
QAT Time confirmation
Source Code Management > Click on 'None'
Build Triggers > Select 'Build after other projects are built'
Projects to watch - job2,
Build > Execute Shell -
if sudo curl http://192.168.1.8:8084/
then
echo "This code is perfect and can be deployed on PRD server"
else
echo "Check config again!"
fi
Step 5 :- Create a job3 for final changes and commit.
General > Description -
************Production deployment after all changes***************
Source Code Management > Click on 'Git'
Repository URL - https://github.com/jay2tinku/git-github-jenkins-docker-integration.git
Branch Specifier (blank for 'any') - */dev1
Additional Behaviours
Name of repository - rk_web_app
Branch to merge to - master
Merge strategy - default
Fast-forward mode - --ff
Build Triggers > Select 'Build after other projects are built'
Projects to watch - QAT,
Result :-
Dev1 deployment on test_server status
[root@server109 ~]# curl http://192.168.1.4:8084/
My web app home page, line1
I am adding one more line, line2
Dev1 is adding few lines of code, line3
Dev1 2nd change in index.com
Dev1 3rd changes in index.html
Dev1 4th changes in index.html
Dev1 5th changes in index.html
Dev1 6th changes in index.html
Dev1 7th changes in index.html
Final deployment on prd_server status
[root@server109 ~]# curl http://192.168.1.4:8085/
My web app home page, line1
I am adding one more line, line2
Main Developer changes in master branch
Main Developer changes in master branch_after tst env
Dev1 is adding few lines of code, line3
Dev1 2nd change in index.com
Dev1 3rd changes in index.html
Dev1 4th changes in index.html
Great integration
ReplyDelete