<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Web Decode</title>
    <description>The latest articles on Forem by Web Decode (@web_decode).</description>
    <link>https://forem.com/web_decode</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2945576%2Fc1d08fdf-a612-4f8c-a89f-5c24cfe77657.jpg</url>
      <title>Forem: Web Decode</title>
      <link>https://forem.com/web_decode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/web_decode"/>
    <language>en</language>
    <item>
      <title>How to solve No DNS / "Temporary failure in name resolution" error.</title>
      <dc:creator>Web Decode</dc:creator>
      <pubDate>Thu, 21 Aug 2025 12:14:13 +0000</pubDate>
      <link>https://forem.com/web_decode/how-to-solve-no-dns-temporary-failure-in-name-resolution-error-5g7m</link>
      <guid>https://forem.com/web_decode/how-to-solve-no-dns-temporary-failure-in-name-resolution-error-5g7m</guid>
      <description>&lt;p&gt;If there is no DNS, the system will throw a &lt;code&gt;Temporary failure in name resolution&lt;/code&gt; error, meaning that the system has no ideea how to resolve domain names like "google.com" to an IP address.&lt;/p&gt;

&lt;p&gt;There are two ways of fixing this kind of error:&lt;/p&gt;

&lt;h2&gt;
  
  
  Temporary fix
&lt;/h2&gt;

&lt;p&gt;The system uses a special file located in &lt;code&gt;/etc/resolv.conf&lt;/code&gt; to resolve domain names. With this in mind, we can add the following entry: &lt;code&gt;nameserver 8.8.8.8&lt;/code&gt; in &lt;code&gt;/etc/resolv.conf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What this does is that it just tells the system to use the 8.8.8.8 Google DNS when doing DNS lookup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permanent fix:
&lt;/h2&gt;

&lt;p&gt;The system normally uses the &lt;code&gt;systemd-resolved&lt;/code&gt; service to resolve DNS lookups. &lt;br&gt;
This service uses its own configuration file that is linked with the &lt;code&gt;/etc/resolv.conf&lt;/code&gt; file to handle DNS lookups. It also uses a loopback address: &lt;code&gt;127.0.0.53&lt;/code&gt; to tell the system to send DNS lookup requests to this port and then pick them up.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;systemd-resolved&lt;/code&gt; service acts as a &lt;code&gt;local DNS server&lt;/code&gt; that has cache, anti-DNS spoofing protection and more. Normally, it contains some entry like &lt;code&gt;nameserver 127.0.0.53&lt;/code&gt;. This tells the system to go to &lt;code&gt;127.0.0.53&lt;/code&gt; when doing DNS lookup. It is the same machine, but on port 53. That is where the &lt;code&gt;systemd-resolved&lt;/code&gt; service listens, picks up the request, looks in the local DNS cache and the forwards it upstream to another DNS such as 8.8.8.8.&lt;/p&gt;

&lt;p&gt;What may have happened:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Broken configuration link&lt;/li&gt;
&lt;li&gt;Down loopback address (in rare cases)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  1. Broken configuration link
&lt;/h2&gt;

&lt;p&gt;Normally, there should be a link from &lt;code&gt;/etc/resolv.conf&lt;/code&gt; -&amp;gt; &lt;code&gt;/run/systemd/resolve/stub-resolv.conf&lt;/code&gt;. This link might be broken, so we can try to fix it by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Loopback address is down
&lt;/h2&gt;

&lt;p&gt;If a loopback(lo) address is down, it can’t be used. The &lt;code&gt;systemd-resolved&lt;/code&gt; service needs the &lt;code&gt;127.0.0.53&lt;/code&gt; loopback address to receive requests for DNS lookups.&lt;/p&gt;

&lt;p&gt;We can check the status of all lo by using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ip addr show lo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;127.0.0.53&lt;/code&gt; is not there, add it by running this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ip addr add 127.0.0.53/32 dev lo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Restart the &lt;code&gt;systemd-resolved&lt;/code&gt; service
&lt;/h2&gt;

&lt;p&gt;The service has to be restarted by using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart systemd-resolved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Setting Up Full CI/CD Pipeline for React Websites Using Jenkins and NginX</title>
      <dc:creator>Web Decode</dc:creator>
      <pubDate>Sat, 15 Mar 2025 15:43:59 +0000</pubDate>
      <link>https://forem.com/web_decode/setting-up-full-cicd-pipeline-for-react-websites-using-jenkins-and-nginx-2b22</link>
      <guid>https://forem.com/web_decode/setting-up-full-cicd-pipeline-for-react-websites-using-jenkins-and-nginx-2b22</guid>
      <description>&lt;p&gt;After you developed your React website you want to set up a CI/CD pipeline that automates the delivery of the application to the end-users? This article briefly shows you how to do it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 0 - Full Jenkinsfile Configuration
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS')
    }
    stages {
        stage('Checkout Code') {
            steps {
                checkout scm
            }
        }
        stage('Install npm and node js') {
            steps {
                script {
                    def npmVersion = sh(script: 'npm -v', returnStatus: true)
                    if (npmVersion != 0) {
                        echo 'Installing npm and node js'
                        sh '''
                            sudo apt update
                            curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
                            sudo apt install nodejs -y
                            sudo apt install build-essential
                        '''
                    } else {
                        echo 'npm and node js already installed'
                    }
                }
            }
        }
        stage('Install Dependencies') {
            steps {
                sh 'npm i'
            }
        }
        stage('Build') {
            steps {
                sh 'npm run build'
            }
        }
        stage ('Move to Nginx') {
            steps {
                sh 'sudo mkdir -p /var/www/html/octopus'
                sh 'sudo rm -rf /var/www/html/octopus/dist'  // Safely remove the directory if exists
                sh 'sudo mv dist /var/www/html/octopus'
            }
        }
        stage ('Configure Nginx') {
            steps {
                script {
                    def configFile = '''
                       server {
                           listen 80;
                           location / {
                               return 301 https://85.120.206.53$request_uri;
                           }
                       }
                       server {
                           listen 443 ssl http2;
                           include /etc/nginx/ssl/ssl_all_sites.conf;
                           include /etc/nginx/ssl/ssl_codelighthouse.conf;

                           root /var/www/html/octopus/dist;
                           index index.html;

                           location / {
                               try_files $uri /index.html;
                           }
                       }
                    '''
                    writeFile file: '/etc/nginx/sites-available/octopus.conf', text: configFile
                    def file = new File('/etc/nginx/sites-enabled/octopus.conf')
                    if (!file.exists()) {
                        sh 'sudo ln -s /etc/nginx/sites-available/octopus.conf /etc/nginx/sites-enabled'
                    }
                }
            }
        }
        stage ('Restart Nginx') {
            steps {
                sh 'sudo systemctl reload nginx'
            }
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1 - Add the Jenkinsfile
&lt;/h2&gt;

&lt;p&gt;You are going to want to create a &lt;code&gt;Jenkinsfile&lt;/code&gt; inside your website folder. This will serve as the code that Jenkins will use to create your pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 - Set up the Jenkinsfile code
&lt;/h2&gt;

&lt;p&gt;Open up a pipeline that can run on any agent (or any specific one if you have) and has a timeout of an hour to avoid infinite running.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS')
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then define your stages as such:&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage - Checkout code
&lt;/h3&gt;

&lt;p&gt;First, checkout the code from the SCM e.g GitHub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stages {
        stage('Checkout Code') {
            steps {
                checkout scm
            }
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stage - Install npm and node
&lt;/h3&gt;

&lt;p&gt;Then make sure you have &lt;code&gt;npm&lt;/code&gt; and &lt;code&gt;node&lt;/code&gt; installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stage('Install npm and node js') {
            steps {
                script {
                    def npmVersion = sh(script: 'npm -v', returnStatus: true)
                    if (npmVersion != 0) {
                        echo 'Installing npm and node js'
                        sh '''
                            sudo apt update
                            curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
                            sudo apt install nodejs -y
                            sudo apt install build-essential
                        '''
                    } else {
                        echo 'npm and node js already installed'
                    }
                }
            }
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's explain each line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def npmVersion = sh(script: 'npm -v', returnStatus: true)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;defines a variable called &lt;code&gt;npmVersion&lt;/code&gt; that will either hold the version of the already installed npm package or 0 if &lt;code&gt;npm&lt;/code&gt; is missing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sh '''
  sudo apt update
  curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
  sudo apt install nodejs -y
  sudo apt install build-essential
'''
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;will first update &lt;code&gt;apt&lt;/code&gt;, add the latest version of &lt;code&gt;node&lt;/code&gt; because the default version that &lt;code&gt;apt&lt;/code&gt; will fetch is a very old one; install the lts version of &lt;code&gt;node&lt;/code&gt; that also comes with &lt;code&gt;npm&lt;/code&gt;; installs &lt;code&gt;build-essentials&lt;/code&gt; that is required by npm to compile source scripts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage - Install Dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stage('Install Dependencies') {
            steps {
                sh 'npm i'
            }
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stage - Build React app
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stage('Build') {
            steps {
                sh 'npm run build'
            }
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stage - Move files to Nginx directory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stage ('Move to Nginx') {
            steps {
                sh 'sudo mkdir -p /var/www/html/octopus'
                sh 'sudo rm -rf /var/www/html/octopus/dist'  // Safely remove the directory if exists
                sh 'sudo mv dist /var/www/html/octopus'
            }
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's explain each line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sh 'sudo mkdir -p /var/www/html/octopus'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;creates a folder that will hold the built web app inside the NginX serving folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sh 'sudo rm -rf /var/www/html/octopus/dist'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;removes the folder &lt;code&gt;dist&lt;/code&gt; if it already exists e.g from previos builds of the pipeline.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sh 'sudo mv dist /var/www/html/octopus'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;moves the built folder &lt;code&gt;dist&lt;/code&gt; inside the previously created folder.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage - Configure Nginx
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stage ('Configure Nginx') {
            steps {
                script {
                    def configFile = '''
                       server {
                           listen 80;

                           root /var/www/html/octopus/dist;
                           index index.html;

                           location / {
                               try_files $uri /index.html;
                           }
                       }
                    '''
                    writeFile file: '/etc/nginx/sites-available/octopus.conf', text: configFile
                    def file = new File('/etc/nginx/sites-enabled/octopus.conf')
                    if (!file.exists()) {
                        sh 'sudo ln -s /etc/nginx/sites-available/octopus.conf /etc/nginx/sites-enabled'
                    }
                }
            }
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's explain the above code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;listen 80;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;listen on the &lt;strong&gt;&lt;em&gt;unsecured&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;http&lt;/code&gt; port: &lt;code&gt;80&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root /var/www/html/octopus/dist;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;sets the root for easier access to files. All further references will be made with regards to this root when it comes to paths.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index index.html;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;tells NginX to always return &lt;code&gt;index.html&lt;/code&gt; when a folder is requested with no file e.g &lt;code&gt;http:/site.com/&lt;/code&gt; or &lt;code&gt;http:/site.com/folder/&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;location / {
       try_files $uri /index.html;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;tells NginX to try to serve the file requested i.e &lt;code&gt;$uri&lt;/code&gt; that can look like &lt;code&gt;http://site.com/file.php&lt;/code&gt; for example and if it can't find it, return the &lt;code&gt;index.html&lt;/code&gt; file. &lt;strong&gt;&lt;em&gt;This is imperative for React builds as the router works by taking in requests for the index.html file&lt;/em&gt;&lt;/strong&gt;. Failing to redirect requests like &lt;code&gt;http://site.com/app&lt;/code&gt; to the &lt;code&gt;index.html&lt;/code&gt; file will result in the routing &lt;strong&gt;not working&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage - Restart Nginx
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stage ('Restart Nginx') {
            steps {
                sh 'sudo systemctl reload nginx'
            }
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;/strong&gt; Always use &lt;code&gt;reload&lt;/code&gt; instead of &lt;code&gt;restart&lt;/code&gt;. If the configuration file is flawed and throws an error &lt;code&gt;restart&lt;/code&gt; will leave NginX down, whereas &lt;code&gt;reload&lt;/code&gt; will throw the error but will not load the flawed configuration file so NginX will continue to work with the old configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 - Push Jenkinsfile to GitHub
&lt;/h2&gt;

&lt;p&gt;You can now go ahead and push the configuration file to the GitHub repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 - Allow Jenkins to Run &lt;code&gt;sudo&lt;/code&gt; Commands
&lt;/h2&gt;

&lt;p&gt;We used many &lt;code&gt;sudo&lt;/code&gt; commands in the pipeline code, but we have to grant Jenkins the rights to act as a super user with no password input requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4.1 - Jenkins User
&lt;/h3&gt;

&lt;p&gt;Make sure the server running the Jenkins controller has a &lt;code&gt;Jenkins&lt;/code&gt; user created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;id jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the user does not exist, create it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo useradd -m jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Flags used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-m&lt;/code&gt; creates a home directory for the user&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4.2 - Make &lt;code&gt;Jenkins&lt;/code&gt; a Super User
&lt;/h3&gt;

&lt;p&gt;Add the &lt;code&gt;Jenkins&lt;/code&gt; user to the super users group (sudo)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo usermod -aG sudo jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Flags used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-a&lt;/code&gt; append a new group to the existing ones&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-G&lt;/code&gt; specify a group to add the user to&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4.3 - Allow &lt;code&gt;Jenkins&lt;/code&gt; Super User to not Utilize Passwords
&lt;/h3&gt;

&lt;p&gt;Open the &lt;code&gt;visudo&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo visudo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and add &lt;code&gt;Jenkins&lt;/code&gt; at the end of the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jenkins ALL=(ALL) NOPASSWD: ALL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5 - Create a Jenkins Multi-Branch Pipeline
&lt;/h2&gt;

&lt;p&gt;Inside Jenkins you have to create a new Multi-Branch pipeline that will scan all the branches of your repository and create pipelines for them based on the found &lt;code&gt;Jenkinsfile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This can be done by following this route inside Jenkins: &lt;br&gt;
&lt;code&gt;Dashboard -&amp;gt; New Item -&amp;gt; Enter a name -&amp;gt; Multibranch Pipeline&lt;/code&gt;&lt;br&gt;
Then go ahead and set up the GitHub repo:&lt;br&gt;
&lt;code&gt;Repository HTTPS URL&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6 - Build the Pipeline
&lt;/h2&gt;

&lt;p&gt;Build the pipeline by clicking on one of your branches and then &lt;code&gt;Build Now&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7 - Set up GitHub Webhooks
&lt;/h2&gt;

&lt;p&gt;If your pipeline has been successfully created, you just have to tell GitHub to let Jenkins know of any push that happens to the repository. This can be done via &lt;code&gt;webhooks&lt;/code&gt;:&lt;br&gt;
Inside GitHub repo:&lt;br&gt;
&lt;code&gt;Settings -&amp;gt; Webhooks -&amp;gt; Add Webhook&lt;/code&gt;&lt;br&gt;
The &lt;code&gt;Payload URL&lt;/code&gt; is &lt;code&gt;http://&amp;lt;your_server_ip&amp;gt;:8080/github-webhook/&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusions
&lt;/h1&gt;

&lt;p&gt;This article has briefly showed you how to set up a full CI/CD pipeline for delivering your React app using NginX and Jenkins. Everytime you push changes to your repository, you can expect to see them live in a few minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;This is just a basic tutorial, many more security and performance steps must be completed in order to have an industrial-grade pipeline.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>nginx</category>
      <category>jenkins</category>
    </item>
  </channel>
</rss>
