In this blog, we will explore how to create a robust CI/CD pipeline using two popular open-source tools, Jenkins and Gogs, and discover how this integration can dramatically enhance productivity, ensure code quality, and swiftly deliver top-notch applications to end users. Get ready to unlock the full potential of your development process with the seamless synergy of Jenkins and Gogs!
What is CI/CD?
Nowadays, the concept of CI/CD is everywhere. CI stands for continuous integration and the CD stands for Continuous Deployment. CI/CD is the backbone of the DevOps environment. It helps organizations to speed up the release of small features in new software, and implement the feedback and changes quickly.
Gogs
Gogs is a free and open-source Git service written in the Go language. painless self-hosted Git service. You can install and configure Gogs on your own servers. It supports all platforms including Linux, Mac, and Windows. For more about Gogs, check their official document https://gogs.io/docs
Jenkins
Jenkins is a self-contained open-source automation platform that can be used to automate all kinds of software development, testing, distribution, or deployment tasks.
Create CI/CD Pipeline using Jenkins and Gogs
In this blog, I will show you how to create a simple CI/CD Pipeline using Jenkins and Gogs. In this scenario, we have hosted a django application on the Linux server. As of now, we are doing the following process if any changes are needed for the application. The developer pulls the live code from the Gogs repository and pushes it back to the repo after modifying the code. Then the System Administrator will pull the latest code from the Gogs repo to the application server.
We can automate the above processes with the help of CI/CD.1. Developer pushes/merges code into a branch in the repo.
2. Admin gets a notification message in Slack about the push
3. Gogs trigger the Jenkins job for the new build and initiate the build if the conditions satisfy those specified in the Jenkins.
4. Admin gets a notification message after the build.
5. Once the build is completed, Jenkins will trigger the code deployment into the application server.
6. Finally the application server will pull the latest code from the Gogs repo and send a notification message to Slack.
You may get a clear picture of this CI/CD Pipeline using Jenkins and Gogs from the above diagram.
Requirements
- SSH access to Jenkins server.
- Gogs admin access.
- SSH access to the application server.
1. Install plugins on Jenkins.
Required plugins: Git, Gogs
- Login to your Jenkins web interface.
- Go to Plugins Manage
- The search required plugins from there and click on “ Download now and install after restart”
2. Configure Webhook
3. Configure access to Gogs from Jenkins.
SSH
>> Login to your Jenkins server through ssh and generate a ssh key.
>> The ssh private and public keys will be generated in /var/jenkins_home/.ssh/ Copy that public key from there.
>> Login to your Gogs and go to your Repository Settings > Deploy keys Add previously copied public key here
>> Add this private key in Jenkins credentials.
>> Login to your Jenkins server and go to:
>> Jenkins > Credentials > System > Global credentials
>> Then select “SSH username with private key” from the Drop down menu.
>> Enter the Gogs ssh username and paste the previously created private key there.
Username and password
- You can also configure this with your Gogs username and password.
- Go to Jenkins >> Credentials >> System >> Global credentials
- Enter your Gogs user username and password there.
4. Configure SSH access to the application server from Jenkins.
In this example, I have a user called Jenkins in the application server.
- Login to your Jenkins server through SSH.
- Copy the previously created key to the application server
# ssh-copy-id [email protected] - Now configure these ssh details in Jenkins.
- Install the “Publish over SSH” plugin
- Go to Jenkins > Manage Jenkins > Configure System > Publish Over SSH
If you get any error as shown in the below screenshot, create the ssh key with the following options in the 3rd step.
# ssh-keygen -t rsa -b 4096 -m PEM
5. Configure Jenkins job
- Login to your Jenkins dashboard.
- Go to Jenkins > New Item.
- Enter your project name and select “Freestyle project”
In this job, we are executing a bash script to deploy the code into the application server. So we need string parameters to pass into the bash script as an argument.
- So select the option “This project is parameterized” under Gogs webhook
- Then add the parameter “ GIT_FOLDER”
- Specify the directory name in the application server to which the git pull happens for code deployment.
- In my case, the directory is /home/jenkins/cd-dev
- Add next parameter is “GIT_CHECKOUT_DIR”
- Specify the directory name in the application server to which will deploy the code.
- Next parameter is “SERVER_ENV”
- The next parameter is “VENV”
- Specify your Python virtual environment path in the application server.
- Then add the parameter “DEPLOY_SCRIPT”
- This variable stores the path of the deploy script
I will show you the content of the script at the end of the tutorial.
- Now add the Gogs repo URL and credentials in the “Source Code Management” and you can select previously added credentials from there.
- Finally, go to the “Post-build Action” in the Jenkins job.
- Select “Send build Artifacts over SSH” and paste the following command in the “Exec command box”
cd $GIT_FOLDER && git fetch && if ! (git diff –exit-code –name-only $GIT_BRANCH — $DEPLOY_SCRIPT); then git pull;fi && bash $DEPLOY_SCRIPT $GIT_FOLDER $GIT_BRANCH $GIT_CHECKOUT_DIR $GIT_URL $SERVER_ENV $VENV
If the conditions satisfy, Jenkins will pull files from the gogs repo and execute the deploy script with the above-mentioned arguments.
Here is the deploy script written in the bash script.
###Beginning## #!/bin/bash #Deployment script used by Jenkins #Author: Hans Emmanuel GIT_FOLDER=$1 GIT_BRANCH=$2 GIT_CHECKOUT_DIR=$3 GIT_URL=$4 SERVER_ENV=$5 VENV=$6 PIP_INS=false DEPLOYED=false SLACK_URL= <specify your slak url if you are using slack> cd $GIT_FOLDER git fetch if (git cat-file -e $GIT_BRANCH:DEPLOY) then echo “deploying the code” BRANCH=$(echo ${GIT_BRANCH} | cut -d’/’ -f2) if ! (git diff –exit-code –name-only $GIT_BRANCH — requirements.txt) then PIP_INS=true fi git pull && GIT_WORK_TREE=$GIT_CHECKOUT_DIR git checkout $BRANCH -f && DEPLOYED=true && echo “CODE Deployed” cd $GIT_CHECKOUT_DIR if $PIP_INS then cd $GIT_CHECKOUT_DIR echo “Installing requirements” source $VENV/bin/activate pip install -r requirements.txt fi touch $GIT_CHECKOUT_DIR/uwsgi.ini url=$GIT_URL REPO=$(basename $url) if $DEPLOYED then curl -X POST –data “payload={\”text\”: \”:slack: Jenkins Repo $REPO branch ${GIT_BRANCH} Deployment is SUCCESS on ${SERVER_ENV} server\”}” $SLACK_URL else curl -X POST –data “payload={\”text\”: \”:slack: Jenkins Repo *$REPO* branch *${GIT_BRANCH}* Deployment is *FAILED* on *${SERVER_ENV}* server\”}” $SLACK_URL fi else echo “NOT Deploying Code” fi |
Check the Articles