📖 Scenario: You are a developer working on a simple Express.js web application. You want to automate the process of testing and deploying your app whenever you make changes. This project will guide you through setting up a basic Continuous Integration and Continuous Deployment (CI/CD) pipeline using GitHub Actions.
🎯 Goal: Build a CI/CD pipeline that automatically installs dependencies, runs tests, and deploys the Express app when code is pushed to the main branch.
📋 What You'll Learn
Create a basic Express.js app with a test script
Add a GitHub Actions workflow configuration file
Configure the workflow to install dependencies and run tests
Add a deployment step that runs only on the main branch
💡 Why This Matters
🌍 Real World
Automating testing and deployment saves time and reduces errors when updating web applications.
💼 Career
CI/CD pipelines are essential skills for developers and DevOps engineers to ensure reliable software delivery.
Progress0 / 4 steps
1
Create a basic Express app with a test script
Create a file called app.js with a simple Express server that listens on port 3000 and responds with "Hello World" at the root URL. Also, create a package.json file with a test script that runs echo \"Test passed!\".
Express
Hint
Use express() to create the app and app.get('/', ...) to handle the root route. The test script in package.json should just echo a success message.
2
Add GitHub Actions workflow file
Create a file called .github/workflows/nodejs.yml with a workflow that triggers on push events to any branch. Define a job called build that runs on ubuntu-latest.
Express
Hint
The workflow file should start with name and on: [push]. Define a job named build that runs on ubuntu-latest.
3
Configure workflow to install dependencies and run tests
In the build job of nodejs.yml, add steps to check out the code, set up Node.js version 18, install dependencies with npm install, and run tests with npm test.
Express
Hint
Use actions/checkout@v3 to get the code, actions/setup-node@v3 with node-version: '18' to set Node.js, then run npm install and npm test.
4
Add deployment step for main branch
In the build job of nodejs.yml, add a step that runs only when the branch is main. This step should print Deploying app... using echo command.
Express
Hint
Add a step with name: Deploy and use if: github.ref == 'refs/heads/main' to run only on main branch. The command should be echo "Deploying app...".
Practice
(1/5)
1. What is the main purpose of a CI/CD pipeline for an Express app?
easy
A. To automate testing and deployment when code changes
B. To write the Express app code manually
C. To create a user interface for the app
D. To store data in a database
Solution
Step 1: Understand CI/CD pipeline role
A CI/CD pipeline automates repetitive tasks like testing and deployment to save time and reduce errors.
Step 2: Identify pipeline purpose for Express app
For an Express app, the pipeline runs tests and deploys the app automatically when code changes.
Final Answer:
To automate testing and deployment when code changes -> Option A
Quick Check:
CI/CD automates testing and deployment [OK]
Hint: CI/CD means automatic test and deploy on code change [OK]
Common Mistakes:
Thinking CI/CD writes code
Confusing deployment with UI design
Assuming CI/CD manages databases
2. Which of the following is the correct syntax to run tests in a GitHub Actions workflow for an Express app?
easy
A. execute: npm test
B. run npm test
C. run: npm test
D. command: npm test
Solution
Step 1: Review GitHub Actions syntax for commands
In GitHub Actions, commands run under a step use the key 'run:' followed by the command string.
Step 2: Identify correct command format for tests
To run tests with npm, the correct syntax is 'run: npm test'. Other options miss the colon or use wrong keys.
Final Answer:
run: npm test -> Option C
Quick Check:
GitHub Actions uses 'run:' before commands [OK]
Hint: GitHub Actions commands start with 'run:' [OK]
Common Mistakes:
Omitting colon after 'run'
Using 'execute' or 'command' instead of 'run'
Writing commands without quotes or colon
3. Given this GitHub Actions step in a CI/CD pipeline for an Express app:
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
What happens if the tests fail?
medium
A. The pipeline stops and deployment does not happen
B. The pipeline ignores test failures and continues deployment
C. The pipeline retries the tests automatically
D. The pipeline skips installation and runs tests again
Solution
Step 1: Understand default GitHub Actions behavior on failure
If a step like 'npm test' fails (returns error), the pipeline stops by default and does not proceed to next steps.
Step 2: Apply this to deployment step
Since deployment usually comes after tests, if tests fail, deployment will not run to avoid deploying broken code.
Final Answer:
The pipeline stops and deployment does not happen -> Option A
Quick Check:
Failed test stops pipeline by default [OK]
Hint: Failed test stops pipeline unless configured otherwise [OK]
Common Mistakes:
Assuming pipeline continues after test failure
Thinking tests auto-retry without setup
Confusing install step with test step
4. You wrote this GitHub Actions workflow snippet for your Express app:
jobs:
ci:
runs-on: ubuntu-latest
steps:
- name: Install dependencies
run: npm install
- name: Run tests
run npm test
- name: Deploy
run: npm run deploy
What is the error in this snippet?
medium
A. Wrong command 'npm run deploy' for deployment
B. Missing colon after 'run' in the Run tests step
C. Install dependencies step should use 'npm ci' instead of 'npm install'
D. Steps should be inside a job, not directly under steps
Solution
Step 1: Check syntax of each step
In GitHub Actions, each step's command must use 'run:' with a colon. The 'Run tests' step misses the colon after 'run'.
Step 2: Verify other steps
'npm run deploy' is a valid command if defined in package.json scripts. 'npm install' is acceptable.
Final Answer:
Missing colon after 'run' in the Run tests step -> Option B
Quick Check:
GitHub Actions commands need 'run:' with colon [OK]
Hint: Check colons after 'run' in each step [OK]
Common Mistakes:
Forgetting colon after 'run'
Assuming 'npm run deploy' is invalid
Confusing job structure with step syntax
5. You want to add a deployment step to your Express app's GitHub Actions pipeline that only runs when tests pass and on the main branch. Which is the best way to configure this?
hard
A. Put deploy step before tests to speed up pipeline
B. Add 'run: npm deploy' without conditions
C. Use 'if: failure()' to deploy only if tests fail
D. Use 'if: github.ref == "refs/heads/main" && success()' before the deploy step
Solution
Step 1: Understand conditional deployment needs
Deployment should run only on main branch and only if tests succeed to avoid deploying broken code or on wrong branches.
Step 2: Use GitHub Actions condition syntax
The 'if:' condition can check branch with 'github.ref == "refs/heads/main"' and check success with 'success()' function.
Final Answer:
Use 'if: github.ref == "refs/heads/main" && success()' before the deploy step -> Option D
Quick Check:
Conditional deploy uses 'if:' with branch and success check [OK]
Hint: Use 'if:' with branch and success() to control deploy [OK]
Common Mistakes:
Deploying without branch or success check
Deploying before tests run
Using failure() to deploy on test failure
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.