Rerunning docker container on new push #14
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: Staging CI/CD Pipeline | |
on: | |
push: | |
branches: | |
- stagging | |
env: | |
IMAGE_NAME: daoudhussaindev/next-js-app | |
NODE_VERSION: 18.x | |
AWS_REGION: ap-south-1 | |
CONTAINER_NAME: next-js-app-staging | |
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: Configure AWS credentials | |
uses: aws-actions/configure-aws-credentials@v1 | |
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 | |
echo "Testing SSH connection..." | |
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' | |
echo 'Checking Docker status...' | |
docker ps | |
echo 'Stopping existing container...' | |
if docker ps -a --filter name=${{ env.CONTAINER_NAME }} | grep -q ${{ env.CONTAINER_NAME }}; then | |
echo 'Stopping and removing existing container...' | |
docker stop ${{ env.CONTAINER_NAME }} || true | |
docker rm ${{ env.CONTAINER_NAME }} || true | |
fi | |
echo 'Pulling new image...' | |
docker pull ${{ env.IMAGE_NAME }}:dev | |
echo 'Starting new container...' | |
docker run -d \ | |
--name ${{ env.CONTAINER_NAME }} \ | |
-p 3000:3000 \ | |
--restart unless-stopped \ | |
${{ env.IMAGE_NAME }}:dev | |
echo 'Cleaning up old images...' | |
docker image prune -f | |
echo 'Verifying deployment...' | |
if docker ps | grep -q ${{ env.CONTAINER_NAME }}; then | |
echo 'Container is running successfully' | |
else | |
echo 'Container failed to start' | |
exit 1 | |
fi | |
echo 'Deployment completed successfully' | |
" | |
- name: Verify Deployment | |
run: | | |
echo "Waiting for application to start..." | |
sleep 15 | |
ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} "\ | |
if curl -s http://localhost:3000 > /dev/null; then | |
echo 'Application is responding' | |
exit 0 | |
else | |
echo 'Application is not responding' | |
exit 1 | |
fi | |
" |