Skip to content

Add build dir var for CI/CD workflow. #26

Add build dir var for CI/CD workflow.

Add build dir var for CI/CD workflow. #26

Workflow file for this run

name: Deploy to EC2
on:
push:
branches: [main]
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
env:
APP_DIR: ${{ secrets.EC2_APP_DIR }}
PYTHON_BIN: ${{ secrets.EC2_PYTHON_BIN }}
SERVICE_NAME: ${{ secrets.EC2_SERVICE_NAME }}
UVICORN_PORT: ${{ secrets.EC2_UVICORN_PORT }}
EC2_HOST: ${{ secrets.EC2_HOST }}
EC2_USER: ${{ secrets.EC2_USER }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Node.js
if: hashFiles('CosmoView/package.json') != ''
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
cache-dependency-path: CosmoView/package-lock.json
- name: Install frontend dependencies
if: hashFiles('CosmoView/package.json') != ''
run: npm ci --prefix CosmoView
- name: Build frontend bundle
if: hashFiles('CosmoView/package.json') != ''
run: npm --prefix CosmoView run build
- name: Start SSH agent
uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.EC2_SSH_KEY }}
- name: Add EC2 host to known_hosts
run: |
mkdir -p ~/.ssh
ssh-keyscan -H "${{ env.EC2_HOST }}" >> ~/.ssh/known_hosts
- name: Ensure remote application directory exists
env:
REMOTE_APP_DIR: ${{ env.APP_DIR }}
run: |
set -euo pipefail
APP_DIR="${REMOTE_APP_DIR:-/opt/nasa-sky-explorer}"
ssh "${{ env.EC2_USER }}@${{ env.EC2_HOST }}" "sudo mkdir -p ${APP_DIR}"
- name: Sync repository to EC2
env:
REMOTE_APP_DIR: ${{ env.APP_DIR }}
run: |
set -euo pipefail
APP_DIR="${REMOTE_APP_DIR:-/opt/nasa-sky-explorer}"
TEMP_DIR="/tmp/nasa-sky-explorer-deploy-$$"
# Sync to temp directory first
ssh "${{ env.EC2_USER }}@${{ env.EC2_HOST }}" "mkdir -p ${TEMP_DIR}"
rsync -az --delete \
--exclude ".git" \
--exclude ".github/" \
--exclude ".venv/" \
--exclude "CosmoView/node_modules/" \
--exclude "logs/" \
./ "${{ env.EC2_USER }}@${{ env.EC2_HOST }}:${TEMP_DIR}/"
# Move from temp to final location with sudo
ssh "${{ env.EC2_USER }}@${{ env.EC2_HOST }}" "sudo rsync -a --delete ${TEMP_DIR}/ ${APP_DIR}/ && rm -rf ${TEMP_DIR}"
- name: Install Python dependencies and restart the service
env:
REMOTE_APP_DIR: ${{ env.APP_DIR }}
REMOTE_PYTHON_BIN: ${{ env.PYTHON_BIN }}
REMOTE_SERVICE: ${{ env.SERVICE_NAME }}
REMOTE_PORT: ${{ env.UVICORN_PORT }}
run: |
set -euo pipefail
APP_DIR="${REMOTE_APP_DIR:-/opt/nasa-sky-explorer}"
PYTHON_BIN="${REMOTE_PYTHON_BIN:-/usr/bin/python3}"
SERVICE_NAME="${REMOTE_SERVICE:-nasaspaceapps}"
UVICORN_PORT="${REMOTE_PORT:-80}"
ssh "${{ env.EC2_USER }}@${{ env.EC2_HOST }}" \
"cd '${APP_DIR}' && sudo APP_DIR='${APP_DIR}' PYTHON_BIN='${PYTHON_BIN}' SERVICE_NAME='${SERVICE_NAME}' UVICORN_PORT='${UVICORN_PORT}' bash deploy/remote_deploy.sh"