Merge pull request #56 from eksqtr/development #56
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: Deploying to Production (Google Cloud Platform VM) | |
on: | |
push: | |
branches: | |
- master | |
pull_request: | |
branches: | |
- development | |
types: | |
- closed | |
jobs: | |
deploy: | |
runs-on: ubuntu-latest | |
if: github.event_name == 'push' || (github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'master') | |
environment: 'production' | |
env: | |
APP_URL: ${{ vars.APP_URL }} | |
APP_TITLE: ${{ vars.APP_TITLE }} | |
APP_AUTHOR: ${{ vars.APP_AUTHOR }} | |
APP_DESCRIPTION: ${{ vars.APP_DESCRIPTION }} | |
APP_METADATA_KEYWORDS: ${{ vars.APP_METADATA_KEYWORDS }} | |
APP_METADATA_OPENGRAPH_SITENAME: ${{ vars.APP_METADATA_OPENGRAPH_SITENAME }} | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v3 | |
- name: Print environment variables (Debugging) | |
run: | | |
echo "APP_URL: $APP_URL" | |
echo "APP_TITLE: $APP_TITLE" | |
echo "APP_AUTHOR: $APP_AUTHOR" | |
echo "APP_DESCRIPTION: $APP_DESCRIPTION" | |
echo "APP_METADATA_KEYWORDS: $APP_METADATA_KEYWORDS" | |
echo "APP_METADATA_OPENGRAPH_SITENAME: $APP_METADATA_OPENGRAPH_SITENAME" | |
- name: Cache npm and Next.js build cache | |
uses: actions/cache@v4 | |
with: | |
path: | | |
~/.npm | |
${{ github.workspace }}/.next/cache | |
key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }} | |
restore-keys: | | |
${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}- | |
- name: Install project production dependencies | |
run: npm ci | |
- name: Build the project for production environment | |
run: | | |
echo "APP_URL=$APP_URL" > .env | |
echo "APP_TITLE=$APP_TITLE" >> .env | |
echo "APP_AUTHOR=$APP_AUTHOR" >> .env | |
echo "APP_DESCRIPTION=$APP_DESCRIPTION" >> .env | |
echo "APP_METADATA_KEYWORDS=$APP_METADATA_KEYWORDS" >> .env | |
echo "APP_METADATA_OPENGRAPH_SITENAME=$APP_METADATA_OPENGRAPH_SITENAME" >> .env | |
npm run build | |
- name: Configuring Directory Permissions of the server | |
env: | |
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} | |
VM_USERNAME: ${{ secrets.VM_USERNAME }} | |
VM_IP: ${{ secrets.VM_IP }} | |
run: | | |
echo "$SSH_PRIVATE_KEY" > key.pem | |
chmod 600 key.pem | |
ssh -i key.pem -o StrictHostKeyChecking=no $VM_USERNAME@$VM_IP "sudo mkdir -p /var/www/website-portfolio/.next" | |
ssh -i key.pem -o StrictHostKeyChecking=no $VM_USERNAME@$VM_IP "sudo chown -R $VM_USERNAME:$VM_USERNAME /var/www/website-portfolio" | |
- name: Sync files to server and Configure nginx | |
env: | |
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} | |
VM_USERNAME: ${{ secrets.VM_USERNAME }} | |
VM_IP: ${{ secrets.VM_IP }} | |
run: | | |
echo "$SSH_PRIVATE_KEY" > key.pem | |
chmod 600 key.pem | |
rsync -avz -e "ssh -i key.pem -o StrictHostKeyChecking=no" --delete .env .next node_modules package.json package-lock.json $VM_USERNAME@$VM_IP:/var/www/website-portfolio/ | |
rsync -avz -e "ssh -i key.pem -o StrictHostKeyChecking=no" deploy/nginx.conf $VM_USERNAME@$VM_IP:/tmp/nginx.conf | |
ssh -i key.pem -o StrictHostKeyChecking=no $VM_USERNAME@$VM_IP << 'EOF' | |
sudo mv /tmp/nginx.conf /etc/nginx/sites-available/website-portfolio | |
sudo ln -sf /etc/nginx/sites-available/website-portfolio /etc/nginx/sites-enabled/ | |
sudo nginx -t | |
sudo nginx -s reload | |
EOF | |
# - name: Configure environment variables on the server | |
# run: | | |
# echo "$SSH_PRIVATE_KEY" > key.pem | |
# chmod 600 key.pem | |
# ssh -i key.pem -o StrictHostKeyChecking=no $VM_USERNAME@$VM_IP << EOF | |
# echo "APP_URL=$APP_URL" > /var/www/website-portfolio/.env | |
# echo "APP_TITLE=$APP_TITLE" >> /var/www/website-portfolio/.env | |
# echo "APP_AUTHOR=$APP_AUTHOR" >> /var/www/website-portfolio/.env | |
# echo "APP_DESCRIPTION=$APP_DESCRIPTION" >> /var/www/website-portfolio/.env | |
# echo "APP_METADATA_KEYWORDS=$APP_METADATA_KEYWORDS" >> /var/www/website-portfolio/.env | |
# echo "APP_METADATA_OPENGRAPH_SITENAME=$APP_METADATA_OPENGRAPH_SITENAME" >> /var/www/website-portfolio/.env | |
# EOF | |
- name: Configure and Start application | |
env: | |
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} | |
VM_USERNAME: ${{ secrets.VM_USERNAME }} | |
VM_IP: ${{ secrets.VM_IP }} | |
run: | | |
echo "$SSH_PRIVATE_KEY" > key.pem | |
chmod 600 key.pem | |
ssh -i key.pem -o StrictHostKeyChecking=no $VM_USERNAME@$VM_IP << EOF | |
cd /var/www/website-portfolio | |
# Ensure PM2 is installed | |
if ! command -v pm2 &> /dev/null | |
then | |
echo "PM2 not found, installing..." | |
sudo npm install -g pm2 | |
else | |
echo "PM2 is already installed, continue;" | |
fi | |
# Delete existing PM2 process if it exists | |
if pm2 list | grep -q "website-portfolio" | |
then | |
echo "Deleting existing PM2 process..." | |
pm2 delete website-portfolio | |
else | |
echo "PM2 process not found, continue;" | |
fi | |
# Start the Next.js application with PM2 | |
pm2 start npm --name "website-portfolio" -- start || true | |
# Save the PM2 process list | |
pm2 save | |
EOF | |
shell: bash |