Setting up CI/CD deployment for a Node.js application using Jenkins and Terraform

I am an accomplished technology professional with 8 years of experience in developing and implementing software solutions using Java, NodeJS, and Python. My expertise also includes cloud computing platforms such as AWS and Azure, as well as experience in CI/CD and DevOps practices using Jenkins and Terraform.
With a background in data engineering, I am well-versed in using PySpark, Big Data, and Hadoop to develop robust data pipelines and drive insights from large datasets. My experience in working on complex projects in the IoT, cloud, and healthcare domains has given me a deep understanding of the unique challenges and opportunities in these fields.
In my current role as Technical lead, I have demonstrated my ability to lead teams in designing and implementing scalable and secure software solutions. I have also played a critical role in driving innovation and continuous improvement through the adoption of new technologies and best practices.
I am passionate about staying up-to-date with emerging technologies and contributing to the wider technology community. In my free time, I enjoy contributing to open-source projects and mentoring aspiring technology professionals.
2X AWS Certified, Cloud Developer Associate, Cloud Solution Architect Associate
Prerequisites:
A Node.js application with a Git repository hosted on GitHub
A Jenkins server
Terraform installed on your local machine
Step 1: Setting up the Jenkins Server
Install Jenkins on your server following the official installation guide
Install the following plugins in Jenkins:
GitHub plugin
NodeJS plugin
Pipeline plugin
3. Set up a Jenkins user and generate an API token for the user
4. Add the Jenkins user’s API token to the GitHub repository as a secret
Step 2: Setting up the Terraform Project
Create a new directory for your Terraform project
Create a file named “main.tf” and add the following code:
provider "aws" {
region = "<your_aws_region>"
}
resource "aws_instance" "web_server" {
ami = "<your_ami_id>"
instance_type = "<your_instance_type>"
key_name = "<your_key_pair_name>"
tags = {
Name = "web_server"
}
}
resource "aws_security_group" "web_server_sg" {
name_prefix = "web_server_sg"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "web_server_sg"
}
}
This code will create an AWS EC2 instance and a security group with a rule to allow incoming traffic on port 80.
3. Create a file named “variables.tf” and add the following code:
variable "access_key" {}
variable "secret_key" {}
variable "region" {
default = "<your_aws_region>"
}
This file defines the variables we will use to configure the AWS provider in our Terraform configuration.
Step 3: Setting up the Jenkins Pipeline
In Jenkins, create a new pipeline job and configure it to use the GitHub repository where your Node.js application is hosted
In the pipeline job configuration, add the following pipeline script:
pipeline {
agent {
label "master"
}
environment {
AWS_ACCESS_KEY_ID = credentials('aws-access-key-id')
AWS_SECRET_ACCESS_KEY = credentials('aws-secret-access-key')
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Build') {
steps {
nodejs('nodejs') {
sh 'npm install'
}
}
}
stage('Test') {
steps {
nodejs('nodejs') {
sh 'npm test'
}
}
}
stage('Deploy') {
steps {
withCredentials([[
credentialsId: 'terraform-creds',
accessKeyVariable: 'AWS_ACCESS_KEY_ID',
secretKeyVariable: 'AWS_SECRET_ACCESS_KEY',
]]) {
sh '''
cd terraform
terraform init
terraform apply -auto-approve \
-var access_key=$AWS_ACCESS_KEY_ID \
-var secret_key=$AWS_SECRET_ACCESS_KEY
'''
}
}
}
}
}
This pipeline script defines four stages: checkout, build, test, and deploy. The checkout stage checks out the source code from the GitHub repository, the build stage installs the application dependencies, the test stage runs the application tests, and the deploy stage deploys the application using Terraform.
Note that the pipeline script uses the “nodejs” plugin to set up a Node.js environment for building and testing the application.
Step 4: Setting up the Terraform Credentials in Jenkins
In Jenkins, navigate to “Credentials” and add a new “Secret Text” credential with the name “aws-access-key-id” and the value of your AWS access key ID
Add another “Secret Text” credential with the name “aws-secret-access-key” and the value of your AWS secret access key
Add a third “Secret Text” credential with the name “terraform-creds” and the value of your AWS access key ID and secret access key in the following format: “access_key_id=YOUR_ACCESS_KEY_ID\nsecret_access_key=YOUR_SECRET_ACCESS_KEY”
Step 5: Running the Pipeline
Save the pipeline configuration in Jenkins and run the pipeline job
Jenkins will automatically trigger the pipeline whenever changes are pushed to the GitHub repository
The pipeline will run the build and test stages and then deploy the application using Terraform
Congratulations! You have successfully set up a CI/CD deployment pipeline for your Node.js application using Jenkins and Terraform. This pipeline will automatically build, test, and deploy your application whenever changes are pushed to your GitHub repository.




