Showing posts with label Jenkins CI. Show all posts
Showing posts with label Jenkins CI. Show all posts

Wednesday, June 22, 2022

Jenkins Continuous Delivery

👋 Warm Welcome 🤗 to my dear DevOps DevSecOps /SRE engineers here in this post we will exploring about Jenkins configured to run a full fledged CI/CD flow.

Preparation for CI/CD

The full length end-to-end automation can be done with the Jenkins Jobs. We need to identify how the dependencies forms the Job chain, what job become upstream and what all jobs can be downstream to which job also you need to plan as per your project needs. Here I'm taking the scenario where Java based web application package and deployment to different environments such as QA, Staging and for Production with approval to run the Build.

The sequence of steps involved in this process are:
  • Install Tomcat server 
  • Using Jenkins CICD job deploy 

Install Tomcat Server on a VM/Cloud instance

Here the VM/Cloud instance assuming as Ubuntu Linux machine. d


Step 1: Install JRE/Java

To install Tomcat on any Platform there should be JRE available. To have JRE we do install JDK which is suitable to the Tomcat. As an example I'm installing JDK8 with the following command.

sudo apt-get install openjdk8 -y; java -version
Step 2: Installing the latest version of Tomcat
The following are not exact commands you need to visit Tomcat Office site to download mirror link.
 
sudo apt install -y unzip wget
wget mirrorlink to download the latest version of tomcat.zip file 
sudo mkdir -p /opt/tomcat 
sudo unzip -d /opt/tomcat tomcat.zip 
ls -l /opt/tomcat  #confirm the extraction
Step 3: Change Tomcat server port, if your Tomcat is installed on the same machine where Jenkins runs. This is to avoid port conflict. Port value change by searching 'Connector' inside the /opt/tomcat/conf/server.xml file. 

Step 4: Change file permission of scripts in the 'bin' folder, that is
cd /opt/tomcat/bin 
sudo chmod +x *
Step 5: start tomcat server from the bin directory run the following
./startup.sh
less -f ../logs/catalina.out # output show Tomcat server started log message.

 Jenkins Setup for Continuous Deployment(CD)

Jenkins automations makes lord of windows in DevOps world. If you want to enjoy that automations in your project please follow this post, here we are going to have the objective as Jenkins continuous integration and continuous deployment to a target environment. The target environment could be built based on the Tomcat server.  Usually the environment can be for development, QA staging and production. if the automation flow begin from the development  environment test success to QA and then staging we can do job chain or a pipeline automatic deployment stages including steps usage in a DSL file that is Jenkinsfile.

Install Jenkins plugins

On the Jenkins console in the dashboard navigate to the Manage Jenkins, then Manage plugins, go to the availability tab and search for the following plugins install them without restart 

 1. Copy Artifact 

 2. Deploy to Containers 

Create Jenkins Jobs

In the first phase of this experiment you will Create Job to produce a Tomcat Deployable Artifacts. Meaning a servlet or JSP containing Java Web applications inside the deployable file. And it's extension can be w a r (web archive) file.

In the view page click on the plus + and  Create a list View and name it as "QA Deploy".

 1. Project name: package_app (Maven build)

a. Please enter in the DescriptionGenerate artifacts to deploy on Java tomcat server 

 b. Under SCM  section enter your own git URL : https://github.com/BhavaniShekhar/Jenkins_Integrations.git

c. Build Environment section - Please Check "Delete workspace before build starts" and "Add timestamps to the Console Output".

 d. Build section - select "Invoke top-level Maven targets" from the dropdown options.

 Choose Maven Version value as you configured it earlier in the Global tool configure name (in my example maven3 used)

 Goals value can be choosen as - clean package

 If pom.xml is not in the project start directory then go for "Advanced" option then provide the POM value as file path : java-tomcat-sample/pom.xml 

e.  In the Post-Build actions Add "Archive the artifacts"

 Files to archive  **/*.war

Now all the settings are done for the package_app job so now Save it, and run it by using "Build Now". Go to the Console Output which shows the full log build execution after confirming that "Build Successful". 

Navigate to last build number for me it is first build so Build #1 there we can see the "Build Artifacts" shows the war file downloadable link.

Automated Deployment

2. Create Deploy application job in the same "QA deploy" view.

Select a Freestyle project.

Project Name: deploy_app

Description: This job will be used to deploy the artifact to QA Tomcat server.

Build logs settings to Max as : 3 

Build Environment section 

Check the "Delete workspace before build starts" and "Add timestamps to the Console Output".

Build Section

Select from the dropdown of Add build Step as "Copy Artifacts from another project"

a. Project Name: Package_app

b. Which build : Latest successful build and also select "Stable build only 

c. Artifacts to copy : **/*war 

Post build Actions section 

Select "Deploy war/ear to a container" from the "Add post-build action.

a. WAR/EAR Files: 

b. context path: /

c. Add container: Tomcat 10 [if that is not available you can use Tomcat 9.x also fine]

  i. Add Jenkins credentials: tomcat/tomcat_password which was configured on Tomcat server.

  ii. Tomcat URL: http://PUBLICIP:8080 

Now everything configured for this job. Save the "deploy_app" project configuration. 


Now you can go to the dashboard and see the "QA Deploy" view where we added two Jobs that is package_app, deploy_app.

Trigger the "Build Now" for each Job for now do it for "deploy_app" job to test it to confirm it is working as expected.


Setup for Continuous Deployment

We can create upstream and downstream when they have dependency. 


Go to the package_app project and 

1. Poll SCM in the Build Trigger 

Schedule : * * * * *


in the Post-build Actions section Add post-build action as "Build other projects"

a. Projects to build "Deploy_app" 

b. Tick the choice - Trigger only if build is stable 

You can observe the Downstream job to the "package_app" as "deploy_app" job.

Developer code push simulation - Do some line change in the GitHub repo then Continuous Integration and Continuous deployment will happen automatically. This is the complete solution we can provide to a Java based web application project.

Troubleshoot points

When you run the 'deploy_app' job you can observe that there are some issues where Tomcat don't allow you to deploy the application with strange error messages. Read the Error messages first understand there could be tomcat server text help link. Do the changes as suggested in that text link.

1. Tomcat user file access denied 

cd TOMCAT_HOME/conf; vi tomcat-users.xml 


change mange-gui if it is admin-gui.

after configuration changes you need to restart tomcat (stop and start).


2. text based tomcat error

Inside the TOMCAT_HOME/webapps/manger/META-INF/ there is a file context.xml comment out the 2 lines which have manger value.


 After this action, restart the Tomcat (sudo /opt/tomcat/bin/shutdown.sh; sleep 3; sudo /opt/tomcat/bin/startup.sh)


Tuesday, December 28, 2021

Jenkins integration with GitHub and build with Maven

 Git integration with Jenkins the main objective here is how GitHub connects with Jenkins, once build tool maven works and then Java artifacts generated ready for deploy the application (.war file).

This post is 2 mins read.

Jenkins integration with GitHub Code repo build with maven


Prerequisites:

You should have been Signup either on GitHub or Bitbucket

GitHub repo url: https://github.com/BhavaniShekhar/my-app

Global Tool configuration

To configure the following we have installed on the Jenkins Master here I've used CentOS box. And while configuring these we need to provide the installed location for each.

  1. Java - defined name as LocalJDK8 or JDK8 /JDK11/JDK18
  2. Maven - defined name can be as LocalMaven or maven3
  3. Git - name defined as LocalGit or default 

How to configure JDK as Global tool in Jenkins?

You need to navigate in the Jenkins Dashboard select Manage Jenkins and from the options select Configure Global tools. In the Configure Global tool  page goto the JDK section where we have two choices the one we can use existing JDK by providing the JAVA_HOME path. And the other option is we can install JDK automatically as per you project needs select the JDK version.

update-alternatives --display java

LocalJDK8 configuration
You can also install latest JDK as per your project requirements and use that installed path.
You can also either use OpenJDK or Oracle JDK with desired version.

How to Install and Configure Maven as tool in Jenkins?

We can install on the target build server that could be Jenkins controller machine or a dedicated machine for build process, where Maven must be installed. 

Install Maven on CentOS
This is simple process using yum we can install for latest we can use dnf before that, switch to root user and run the following commands:

java -version # to confirm Java installed
yum install -y maven
mvn --version # To confirm that Maven installed successfully
Note that Maven installation prerequisite is JDK. that is you must have JAVA_HOME defined.
Configuring LocalMaven


The latest version maven can be used here.

How to configure Git as global tool on Jenkins?
Git is by default installed on most of the Linux VMs. But on the cloud free instances we don't see so we need to install it with the package manager command utilities w.r.t operating system.

LocalGit configuration on Jenkins Global Tool Configuration

Once all prerequisites are installed and configured we are good to go for the Jenkins integration with GitHub project and use the Maven to build and deliver the artifacts.

How to Setup a Jenkins Maven Project?

Step 1: Configure new item with Freestyle project 

Let's create Freestyle project with the following 

Name: github-integration

In the General section enter

  • Description: This is first java project will be build with maven.
  • Discard old builds checked
  • Max # of builds to keep: 1


Step 2: Source Code Management section select Git 

  • a. Repository URL value entry that uses Git clone https protocol.
  • b. GitHub project will be mostly free and public repos, there is no need to create credentials. Go with 'none' option. If it's organization project it will be private repo you need to create credentials.
  • Branch: You need to specify the branch name as master or main branch will be used as default. For testing purposes we have to change to feature or relative to the environment (dev,QA, prod etc).

Jenkins integration with GitHub - Source Control Management tab setup

When you work on the real time project you may need to work on test/feature branch instead of master branch.

Step 3: Delete workspace before build

In the 'Build Environment' section, select the check box the 'Delete workspace before build starts'. There are more advanced options available but for now we can go with default.

Jenkins Build Environment - delete workspace before build starts


Step 4: Build using Invoke top-level Maven targets

In the 'Build' section, add build step -> invoke top-level Maven targets.

  • a. Maven version : LocalMaven
  • b. Goals : test install or clean package
  • c. POM : If it is available in the root directory nothing to mention if some other location then you need to specify the location example: maven-samples/single-module/pom.xml
  • d. Now Save the project and all set to run it, 

Jenkins Build - invoke top-level Maven targets

All configurations are completed, Go to the top of the Jenkins menu, Trigger the "Build now"  observe the console output.



* If the build executed on the Jenkins controller then, You can see the package created in the workspace directory 
 /var/lib/jenkins/workspace/github-integration/target/myweb-0.0.1.war

* If the build executed remotely then, You can see the workspace location then followed by the target SNAPSHOT file location

References

Monday, March 29, 2021

Sidebar Links in Jenkins Job

Hello Everyone! Here I will give some real use cases where the Jenkins integration with Sidebar Links requirement for a Jenkins Project. 

Case 1: Your project might have a complete build strategy defined and it is shared on a Confluence page or common documentation platform. This document need to be linked to the Jenkins Job.

Case 2: Your QA team want to have all the jobs which they want to access on a single page. Even though you have placed all the QA-related jobs into a View. The solution is using Sidebar Link to the View from the Job.

Case 3: A QA team working on two different Product testings where you have the two separate Jobs, but in the Organization the jobs are grown where a listing of all jobs will make difficult to search for the second job. instead of searching for the second job if we have the second job on the first job page then QA team life will be easy. 

How to use Sidebar Links in a Jenkins Job?

Sidebar link can be used for linking following:

  1. Documentation or External URLs
  2. Jenkins Views
  3. Jenkins Jobs

 Add links in the sidebar of the Jenkins main page, view tabs and project pages. 
This simple plugin adds an Additional Sidebar Links section in the main Jenkins configuration page, with settings for link URLs, texts, and icons. 



Step 1 Install the Sidebar Link plugin
Login to Jenkins console, Select Manage Jenkins> Manage Plugins
Click on 'Available Plugins', Filter by searching 'Sidebar' word. Select the check box against it and the 'Install Plugin without restart' button.

Sidebar link plubin installation on Jenkins
Jenkins Plugin manager install plugin - Sidebar Link



Step 2: Goto your target project(new item or existing project) where you need the Sidebar link. in the 'General' tab you can see that 'Sidebar Link'. 

Configure Sidebar Link
Setting Sidebar Links with detailed steps



Select the appropriate icon for your sidebar link, On your $JENKINS_HOME you can find in 'images/24x24' directory that contains many icon files for example you use help.gif, document.gif refresh.gif. Else you can also for a custom icon placed in the JENKINS_HOME/userContent directory.

Sidebar Link icon setup
Sidebar Link - icon setup options

Finally, you will see the sidebar link with the selective icons. When I've clicked on 'DevOps Hunter' Sidebar Links surprise it opened this post Wow!! Wonderful!! this post enables you 'Continous Learning' of Jenkins CI one more interesting step in learners path..


Thursday, September 3, 2020

Configuring Fresh Jobs in Jenkins

Hello, Dear DevOps Automation enthusiast! This post is intended targeted to those who have just started the journey in the Continuous Integration and Continuous Deployment on the Cloud Platforms or On-premises environments.

Pre-requisites

  • Latest Stable version of Jenkins installed 
  • Jenkins Master is in running state on your machine/VM/Cloud instance
  • Able to login to the Jenkins Console

In the left pane, you can click on 'New Item' or Click on the 'Start Using Jenkins' link. The welcome screen shows a link to create a new job!

Jenkins First Job Project creation


You need to enter the value for 
Name for the build project
Type of project
  1. Freestyle Project
  2. Pipeline
  3. Multi-configuration Project
  4. Folder
  5. GitHub Organization
  6. Multibranch Pipeline

Enter the name of the project, Select the 'Freestyle project' for the first time and click on the 'OK' button. New page loads with 6 sections/tabs for build project inputs.

Job Configuration Sections
In Jenkins console we have various Job Configuration types
Jenkins Job Configuration


  1. General - Description of the project, Enable project based security, change date pattern for BUILD_TIMESTAMP, Discard old builds enable will help you for easy migration of Jenkins master.
  2. Job Notification -  End points, You can enable notification mail when someone changed configuration. Rebuild without asking parameters or we can disable the rebuild for a particular job. You can choose the build requires lockable resources, which means other jobs not allowed when this job is in progress. This project is parameterized enabled then you can add different type Parameters such as String Parameter, Choice Parameter, Password Parameter, Node
  3. Jenkins job configuration allows us to use 5 different choices of 'Source code management' as:
a. None
b. CVS
c. CVS Projectset
d. Git
e. Subversion
                    Default it is selected as - None


            Build Trigger
            1. Jenkin's job will be triggered by a 'Build Triggers' section. Here we have Trigger build remotely from scripts, 
            2. Build after other projects are built when there is dependency are in the projects
            3. Build periodically - This choice asks you on what period you want to execute this job
            4. Enable Artifactory trigger - when docker image is pushed you want to run a job 
            5. GitHub hook trigger for GITscm polling - requires authentication for webhook accessing GitHub repository
            6. Poll SCM - for all types of source code repository updates can trigger the job.
            Build Environment

            Usually, when we run a build, Jenkins uses /tmp/somerandomnumber.sh in Linux machines as the automatically generated script will create workspace in the slave machine. 
            1. Delete workspace before build starts
            2. Use secret text(s) or file(s)
            3. Provide configuration files
            4. send files or execute commands over SSH before the build starts 
            5. send files or execute commands over SSH after the build runs
            6. Abort the build if it's stuck
            7. Add timestamps to the Console Output
            8. Ant/Ivy-Artifactory Integration
            9. Create a formatted version number
            10. Farm Repository
            11. Generic-Artifactory Integration
            12. Gradle-Artifactory Integration
            13. Inject environment variables to the build process
            14. Inject passwords to the build as environment variables
            15. Inspect build log for published Gradle build scans
            16. Maven3-Artifactory Integration
            17. Run Xvnc during build
            18. Setup Kubernetes CLI (kubectl)
            19. With Ant

            Build

            The build section will have an Execute shell with command text box. where you can enter the shell commands. which will become a shell script.


            2. Pipeline Project

            If you choose the Pipeline Project then it will have the following sections
            1. General
            2. Job Notifications
            3. Build Triggers
            4. Advanced Project options
            5. Pipeline 

            General 

            In the General section, you can see
            Enable project-based security

            Discard old builds when you check this -> Strategy where you have LogRotation based on - Days to keep builds or Max # of builds to keep 
            Advance option - 
            Days to keep artifacts - if not empty default 14, artifacts from builds older than this number of days will be deleted, but the logs, history, reports, etc for the build will be kept
            Max # of builds to keep with artifacts - if not empty, only up to this number of builds have their artifacts retained

            Do not allow concurrent builds
            Do not allow the pipeline to resume if the master restarts
            GitHub project

            Job Notifications


            Notify when Job configuration changes
            Pipeline speed/durability override
            Preserve stashes from completed builds
              Rebuild options: Rebuild Without Asking For Parameters
              Disable Rebuilding for this job
            Sidebar Links
            This project is parameterized selected then you are allowed to use following parameters:
            1. Node
            2. String
            3. Active Choices parameter -> 
              1. Name 
              2. Script option will have choice to enter the Groovy script
              3. Choice type:  Single select, Multi select, Radio button, Checkbox 
              4. Enable Filters
              5. The filter starts at 1

            Build Triggers

            1. Build after other projects are built
            2. Build periodically
            3. Build whenever a SNAPSHOT dependency is built
            4. Enable Artifactory trigger
            5. GitHub hook trigger for GITScm polling
            6. Poll SCM
            7. Disable this project
            8. Quiet period
            9. Trigger builds remotely (e.g., from scripts)

            Advanced Project Options

            Click on the 'Advanced' button

            Pipeline

            Definition - Pipeline script
                the script, Use Groovy sandbox.

            After you configured the Job, you have to Apply to save the configuration until now. 

            If you are working on the Visual Studio code as editor then you can install the Extention. 

            Groovy extension



            Jenkinsfile Extension




            Saturday, September 7, 2019

            Continuous Integration Automation: Webhook on GitHub notify Jenkins

            Hello Guys, Jenkins CI/CD enthusiast,

            In this post, I would like to discuss the implementation of Jenkins Continuous Integration automatic build triggers. Where Jenkins master will be stay connected with the GitHub server with an API token based authentication. To connect with GitHub server we need a personal access token.

            Webhook for GitHub and Jenkins integration

            1. Create token credentials
            2. GitHub server configuration

            Webhook is a wonderful solution that will keep track of changes that made to the GitHub repo and notify the Jenkins Master. If we create the item or freestyle project will be triggered automatically.

            Create token credentials 

            Login into the Jenkins console, Click on the left pane - "Manage jenkins" link. Select the "System Configure" navigates to the new page where you need scroll down till you found the GitHub section.
            First we will create the token, look for the "Advanced" button on the rightside. Additional actions: 'Convert login and password to token'.
            Select the radio button: "From login and password" which prompt for entering the values for the Login, password that used for GitHub where you have repo. Then use the 'Create token creentials' button at the right end.

            Create Token for GitHub on Jenkins
            Now the tokens are generated we are ready to connect with the GitHub server. move upwards and enter the following values:


            • Your GitHub profile used for connecting
            • API URL don't change this 
            • Credentials select from the dropdown, where you can find the recently created Token for GitHub - Selected
            • Click on the Test connection button will produce the result of connectivity 
            • Tick mark the 'manage hooks'



            GitHub Server configuration on Jenkins

            GitHub Configuration for Webhook

            The following simple steps will be enables you to get the webhook on the GitHub that connected to Jenkins Master

            1. Log in to your GitHub
            2. The top right corner you can find your profile link from that menu select 'Settings'.
            3. In the left pane at the bottom, Select the 'Developer Settings'
            4. The new page for 'Developer Settings' will have three options, Select 'Personal access tokens' from the menu.

            Personal access tokens on GitHub

            Now we all set to go for testing the Webhook connectivity with Jenkins

            Create a freestyle project for Webhook


            On the Jenkins console create new freestyle project
            Name it as GitHub-webhook
            Project type: Freestyle project
            Click on Ok button

            Jenkins Project for GitHub Webhook

            Source Code Management


            Select the Git
            Jenkins Source Code management

            Build Triggers

            Select GitHub hook trigger for GITScm polling

            Jenkins Build Trigger
            In the Build tab
            Select the Execute shell

            enter the stuff to know that build triggered in my example used the cat the README.md file which is targeted to modify.

            Jenkins build section for CI automation


            Save the Jenkins Project.

            Go to the GitHub page

            Modify the code in the Git repository,

            added a line in the README.md file


            Automatic Build Triggers

            In the Jenkins now the job will be triggered automatically

            Jenkins Build automatic triggered and the console output 


            Here is the conclusion that Webhook is simple mechanism that will helps Jenkins get notified with code changed in the GitHub.


            Categories

            Kubernetes (25) Docker (20) git (15) Jenkins (12) AWS (7) Jenkins CI (5) Vagrant (5) K8s (4) VirtualBox (4) CentOS7 (3) docker registry (3) docker-ee (3) ucp (3) Jenkins Automation (2) Jenkins Master Slave (2) Jenkins Project (2) containers (2) create deployment (2) docker EE (2) docker private registry (2) dockers (2) dtr (2) kubeadm (2) kubectl (2) kubelet (2) openssl (2) Alert Manager CLI (1) AlertManager (1) Apache Maven (1) Best DevOps interview questions (1) CentOS (1) Container as a Service (1) DevOps Interview Questions (1) Docker 19 CE on Ubuntu 19.04 (1) Docker Tutorial (1) Docker UCP (1) Docker installation on Ubunutu (1) Docker interview questions (1) Docker on PowerShell (1) Docker on Windows (1) Docker version (1) Docker-ee installation on CentOS (1) DockerHub (1) Features of DTR (1) Fedora (1) Freestyle Project (1) Git Install on CentOS (1) Git Install on Oracle Linux (1) Git Install on RHEL (1) Git Source based installation (1) Git line ending setup (1) Git migration (1) Grafana on Windows (1) Install DTR (1) Install Docker on Windows Server (1) Install Maven on CentOS (1) Issues (1) Jenkins CI server on AWS instance (1) Jenkins First Job (1) Jenkins Installation on CentOS7 (1) Jenkins Master (1) Jenkins automatic build (1) Jenkins installation on Ubuntu 18.04 (1) Jenkins integration with GitHub server (1) Jenkins on AWS Ubuntu (1) Kubernetes Cluster provisioning (1) Kubernetes interview questions (1) Kuberntes Installation (1) Maven (1) Maven installation on Unix (1) Operations interview Questions (1) Oracle Linux (1) Personal access tokens on GitHub (1) Problem in Docker (1) Prometheus (1) Prometheus CLI (1) RHEL (1) SCM (1) SCM Poll (1) SRE interview questions (1) Troubleshooting (1) Uninstall Git (1) Uninstall Git on CentOS7 (1) Universal Control Plane (1) Vagrantfile (1) amtool (1) aws IAM Role (1) aws policy (1) caas (1) chef installation (1) create organization on UCP (1) create team on UCP (1) docker CE (1) docker UCP console (1) docker command line (1) docker commands (1) docker community edition (1) docker container (1) docker editions (1) docker enterprise edition (1) docker enterprise edition deep dive (1) docker for windows (1) docker hub (1) docker installation (1) docker node (1) docker releases (1) docker secure registry (1) docker service (1) docker swarm init (1) docker swarm join (1) docker trusted registry (1) elasticBeanStalk (1) global configurations (1) helm installation issue (1) mvn (1) namespaces (1) promtool (1) service creation (1) slack (1)