Fixing ec2 host issue #21
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Production CI/CD Pipeline | |
on: | |
push: | |
branches: | |
- main | |
env: | |
IMAGE_NAME: daoudhussaindev/next-js-app | |
NODE_VERSION: 18.x | |
AWS_REGION: ap-south-1 | |
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME_DEV }} | |
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD_DEV }} | |
jobs: | |
build: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Set up Node.js ${{ env.NODE_VERSION }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ env.NODE_VERSION }} | |
cache: 'npm' | |
- name: Install dependencies | |
run: npm ci | |
- name: Build Next.js application | |
run: npm run build | |
- name: Cache build output | |
uses: actions/cache@v3 | |
with: | |
path: | | |
.next | |
node_modules | |
key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} | |
restore-keys: | | |
${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}- | |
test: | |
needs: build | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Set up Node.js ${{ env.NODE_VERSION }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ env.NODE_VERSION }} | |
cache: 'npm' | |
- name: Restore cache | |
uses: actions/cache@v3 | |
with: | |
path: | | |
.next | |
node_modules | |
key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} | |
- name: Install dependencies | |
run: npm ci | |
- name: Run tests | |
run: npm run test | |
deploy: | |
needs: [build, test] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Debug directory | |
run: | | |
pwd | |
ls -la | |
echo "Checking for Dockerfile:" | |
cat Dockerfile || echo "Dockerfile not found!" | |
- name: Log in to DockerHub | |
run: | | |
echo "${{ secrets.DOCKER_PASSWORD_DEV }}" | docker login --username "${{ secrets.DOCKER_USERNAME_DEV }}" --password-stdin | |
- name: Build Docker image | |
run: | | |
docker build -t ${{ env.IMAGE_NAME }}:latest . | |
- name: Push Docker image to Docker Hub | |
run: | | |
docker push ${{ env.IMAGE_NAME }}:latest | |
- name: Configure AWS credentials | |
uses: aws-actions/configure-aws-credentials@v4 | |
with: | |
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
aws-region: ${{ env.AWS_REGION }} | |
- name: Set up SSH | |
run: | | |
mkdir -p ~/.ssh | |
echo "${{ secrets.EC2_SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key | |
chmod 600 ~/.ssh/deploy_key | |
ssh-keyscan -H ${{ secrets.EC2_HOST }} >> ~/.ssh/known_hosts | |
- name: Test SSH connection | |
run: | | |
ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} 'echo "SSH connection successful"' | |
- name: Deploy to EC2 | |
run: | | |
echo "Starting deployment..." | |
ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} "\ | |
set -e | |
echo 'Connected to EC2 instance' | |
# Login to Docker Hub on EC2 | |
echo '${{ secrets.DOCKER_PASSWORD_DEV }}' | docker login --username '${{ secrets.DOCKER_USERNAME_DEV }}' --password-stdin | |
echo 'Checking Docker status...' | |
docker ps | |
echo 'Stopping existing container...' | |
docker ps -q --filter 'name=next-js-app-prod' | grep -q . && docker stop next-js-app-prod && docker rm next-js-app-prod || true | |
echo 'Pulling new image...' | |
docker pull ${{ env.IMAGE_NAME }}:latest | |
echo 'Starting new container...' | |
docker run -d \ | |
--name next-js-app-prod \ | |
-p 8000:8000 \ | |
-e PORT=8000 \ | |
--restart unless-stopped \ | |
${{ env.IMAGE_NAME }}:latest | |
echo 'Cleaning up old images...' | |
docker image prune -f | |
echo 'Deployment completed successfully' | |
" | |
- name: Verify Deployment | |
run: | | |
echo "Waiting for application to start..." | |
sleep 30 # Give the application time to start | |
# Test if the application is responding | |
ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} "\ | |
if docker ps | grep -q next-js-app-prod; then | |
echo 'Container is running' | |
exit 0 | |
else | |
echo 'Container is not running' | |
exit 1 | |
fi | |
" |