CI/CD Pipeline using Node.js and Jenkins - 5: Deployment
Now that the Continuous Integration part of my pipeline was working, today I got the Continuous Delivery/Deployment part working to automatically deploy to the live server.
Deployment
I am still following this tutorial to get this pipeline working:
First, ssh into the jenkins server and switch to the jenkins user
su — jenkins
There was no password! This lets you set the new password and switch to the jenkins user again.
sudo passwd jenkins
su - jenkins
Now need to generate a new public key:
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub
Copy that to clipboard, then ssh into node server as twulz:
nano ~/.ssh/authorized_keys
Paste the copied ssh key into that file and change the permissions:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/*
Then test the ssh setup by sshing into the node-app server from the jenkins server:
ssh twulz@157.245.55.163
YAY! Now that I’ve got the correct permissions, I can create the deployment file:
#!/bin/sh
ssh twulz@157.245.55.163 <<EOF
cd ~/node-app
git pull
npm install —-production
pm2 restart all
exit
EOF
I need to make it executable:
chmod +x script/deploy
And back in the Jenkins console, I need to add the command to the Execute Shell
script config:
whoami
npm install
./script/test
./script/deploy
The build was failing because the service wasn’t started:
[PM2][WARN] No process found
┌──────────┬────┬─────────┬──────┬─────┬────────┬─────────┬────────┬─────┬─────┬──────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
└──────────┴────┴─────────┴──────┴─────┴────────┴─────────┴────────┴─────┴─────┴──────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
Build step 'Execute shell' marked build as failure
Finished: FAILURE
So I ran this, then success!
sudo pm2 start /home/twulz/node-app/index.js
Add the dev-server configuration to the Node-App
This is a last step just for future development - currently, during development of the Node.js server I have to save the file, stop the server and re-start the server to see the updates. Using the Node-dev package, this detects any changes to the server and automatically restarts it to reflect the changes.
$ cd Documents\Github\node-app
$ git pull
$ npm install
$ node index.js
Then made some changes to the code, needed to add some dependencies:
npm install morgan --save-prod
saves it to the dependencies in package.json. Also needed npm install node-dev --save-dev
saves it to the devDependencies section in package.json
Then added scripts to package.json:
"scripts": {
"dev-server": "./node_modules/.bin/node-dev ./index.js"
},
Now when I make changes it’ll automatically restart the server
Done!
Et voila! The CI/CD pipeline is up and running! Now whenever I commit code to GitHub:
- GitHub notifies the Jenkins server
- Jenkins server then pulls the code into a local setup
- It then runs the automated tests
- If the tests pass, deploy to the Node-App live server.
Next steps will be doing something a little more exciting than printing some variation of “Hello World!”