Refactor deployment workflows to enhance SSH handling and streamline Docker image deployment
Some checks failed
Deploy Development / deploy (push) Failing after 2s
Some checks failed
Deploy Development / deploy (push) Failing after 2s
This commit is contained in:
@@ -13,37 +13,64 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
run: |
|
run: |
|
||||||
#!/bin/sh
|
|
||||||
git clone $GITHUB_SERVER_URL/$GITHUB_REPOSITORY.git /workspace/repo || true
|
git clone $GITHUB_SERVER_URL/$GITHUB_REPOSITORY.git /workspace/repo || true
|
||||||
cd /workspace/repo
|
cd /workspace/repo
|
||||||
git fetch origin $GITHUB_REF_NAME
|
git fetch origin $GITHUB_REF_NAME
|
||||||
git checkout $GITHUB_REF_NAME
|
git checkout $GITHUB_REF_NAME
|
||||||
git pull origin $GITHUB_REF_NAME
|
git pull origin $GITHUB_REF_NAME
|
||||||
|
|
||||||
- name: Setup SSH Key
|
- name: Build Docker Image
|
||||||
|
run: |
|
||||||
|
cd /workspace/repo
|
||||||
|
docker build -t merchbay_admin:dev .
|
||||||
|
docker save merchbay_admin:dev | gzip > merchbay_admin_dev.tar.gz
|
||||||
|
|
||||||
|
- name: Setup SSH and Deploy
|
||||||
run: |
|
run: |
|
||||||
#!/bin/sh
|
|
||||||
mkdir -p ~/.ssh
|
mkdir -p ~/.ssh
|
||||||
printf '%s' "$DEPLOY_SSH_KEY" > ~/.ssh/deploy_key
|
printf '%s' "$DEPLOY_SSH_KEY" > ~/.ssh/deploy_key
|
||||||
chmod 600 ~/.ssh/deploy_key
|
chmod 600 ~/.ssh/deploy_key
|
||||||
env:
|
|
||||||
DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }}
|
|
||||||
|
|
||||||
- name: Transfer Files to Development Server
|
|
||||||
run: |
|
|
||||||
#!/bin/sh
|
|
||||||
cd /workspace/repo
|
cd /workspace/repo
|
||||||
scp -o StrictHostKeyChecking=no -i ~/.ssh/deploy_key merchbay_admin_dev.tar.gz docker-compose.yml "$DEPLOY_USER@$DEPLOY_HOST:/tmp/"
|
scp -o StrictHostKeyChecking=no -i ~/.ssh/deploy_key merchbay_admin_dev.tar.gz docker-compose.yml "$DEPLOY_USER@$DEPLOY_HOST:/tmp/"
|
||||||
env:
|
|
||||||
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
|
|
||||||
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
|
|
||||||
|
|
||||||
- name: Deploy to Development Server
|
ssh -o StrictHostKeyChecking=no -i ~/.ssh/deploy_key "$DEPLOY_USER@$DEPLOY_HOST" "
|
||||||
run: |
|
DEPLOY_DIR='/var/www/merchbay_admin_dev'
|
||||||
#!/bin/sh
|
mkdir -p \$DEPLOY_DIR
|
||||||
ssh -o StrictHostKeyChecking=no -i ~/.ssh/deploy_key "$DEPLOY_USER@$DEPLOY_HOST" << 'ENDSSH'
|
cd /tmp
|
||||||
#!/bin/sh
|
docker load < merchbay_admin_dev.tar.gz
|
||||||
|
cp docker-compose.yml \$DEPLOY_DIR/
|
||||||
|
cd \$DEPLOY_DIR
|
||||||
|
|
||||||
|
cat > .env <<'ENVEOF'
|
||||||
|
APP_ENV=staging
|
||||||
|
APP_DEBUG=false
|
||||||
|
APP_URL=https://dev.merchbay.app
|
||||||
|
DB_HOST=$DEV_DB_HOST
|
||||||
|
DB_PORT=${DEV_DB_PORT:-3306}
|
||||||
|
DB_DATABASE=$DEV_DB_DATABASE
|
||||||
|
DB_USERNAME=$DEV_DB_USERNAME
|
||||||
|
DB_PASSWORD=$DEV_DB_PASSWORD
|
||||||
|
DOMAIN=dev.merchbay.app
|
||||||
|
ENVEOF
|
||||||
|
|
||||||
|
docker compose down || true
|
||||||
|
docker image prune -f
|
||||||
|
docker network inspect traefik-public >/dev/null 2>&1 || docker network create traefik-public
|
||||||
|
export DOMAIN=dev.merchbay.app
|
||||||
|
export APP_URL=https://dev.merchbay.app
|
||||||
|
docker compose up -d
|
||||||
|
sleep 10
|
||||||
|
docker compose exec -T app php artisan migrate --force
|
||||||
|
docker compose exec -T app php artisan config:cache
|
||||||
|
docker compose exec -T app php artisan route:cache
|
||||||
|
docker compose exec -T app php artisan view:cache
|
||||||
|
rm -f /tmp/merchbay_admin_dev.tar.gz /tmp/docker-compose.yml
|
||||||
|
echo 'Development deployment completed successfully!'
|
||||||
|
echo 'Application available at: https://dev.merchbay.app'
|
||||||
|
"
|
||||||
env:
|
env:
|
||||||
|
DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }}
|
||||||
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
|
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
|
||||||
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
|
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
|
||||||
DEV_DB_HOST: ${{ secrets.DEV_DB_HOST }}
|
DEV_DB_HOST: ${{ secrets.DEV_DB_HOST }}
|
||||||
@@ -51,71 +78,8 @@ jobs:
|
|||||||
DEV_DB_DATABASE: ${{ secrets.DEV_DB_DATABASE }}
|
DEV_DB_DATABASE: ${{ secrets.DEV_DB_DATABASE }}
|
||||||
DEV_DB_USERNAME: ${{ secrets.DEV_DB_USERNAME }}
|
DEV_DB_USERNAME: ${{ secrets.DEV_DB_USERNAME }}
|
||||||
DEV_DB_PASSWORD: ${{ secrets.DEV_DB_PASSWORD }}
|
DEV_DB_PASSWORD: ${{ secrets.DEV_DB_PASSWORD }}
|
||||||
# Set deployment directory for dev
|
|
||||||
DEPLOY_DIR="/var/www/merchbay_admin_dev"
|
|
||||||
|
|
||||||
# Create deployment directory if it doesn't exist
|
|
||||||
mkdir -p $DEPLOY_DIR
|
|
||||||
|
|
||||||
# Load the Docker image
|
|
||||||
cd /tmp
|
|
||||||
docker load < merchbay_admin_dev.tar.gz
|
|
||||||
|
|
||||||
# Copy docker-compose.yml to deployment directory
|
|
||||||
cp docker-compose.yml $DEPLOY_DIR/
|
|
||||||
|
|
||||||
# Navigate to deployment directory
|
|
||||||
cd $DEPLOY_DIR
|
|
||||||
|
|
||||||
# Update environment file for dev
|
|
||||||
cat > .env << EOF
|
|
||||||
APP_ENV=staging
|
|
||||||
APP_DEBUG=false
|
|
||||||
APP_URL=https://dev.merchbay.app
|
|
||||||
DB_HOST=${{ secrets.DEV_DB_HOST }}
|
|
||||||
DB_PORT=${{ secrets.DEV_DB_PORT || 3306 }}
|
|
||||||
DB_DATABASE=${{ secrets.DEV_DB_DATABASE }}
|
|
||||||
DB_USERNAME=${{ secrets.DEV_DB_USERNAME }}
|
|
||||||
DB_PASSWORD=${{ secrets.DEV_DB_PASSWORD }}
|
|
||||||
DOMAIN=dev.merchbay.app
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Stop existing container
|
|
||||||
docker compose down || true
|
|
||||||
|
|
||||||
# Remove old image
|
|
||||||
docker image prune -f
|
|
||||||
|
|
||||||
# Ensure Traefik network exists
|
|
||||||
docker network inspect traefik-public >/dev/null 2>&1 || docker network create traefik-public
|
|
||||||
|
|
||||||
# Update docker-compose for dev
|
|
||||||
export DOMAIN=dev.merchbay.app
|
|
||||||
export APP_URL=https://dev.merchbay.app
|
|
||||||
|
|
||||||
# Start the application
|
|
||||||
docker compose up -d
|
|
||||||
|
|
||||||
# Wait for container to be ready
|
|
||||||
sleep 10
|
|
||||||
|
|
||||||
# Run migrations
|
|
||||||
docker compose exec -T app php artisan migrate --force
|
|
||||||
|
|
||||||
# Clear and cache configuration
|
|
||||||
docker compose exec -T app php artisan config:cache
|
|
||||||
docker compose exec -T app php artisan route:cache
|
|
||||||
docker compose exec -T app php artisan view:cache
|
|
||||||
|
|
||||||
# Cleanup
|
|
||||||
rm -f /tmp/merchbay_admin_dev.tar.gz /tmp/docker-compose.yml
|
|
||||||
|
|
||||||
echo "Development deployment completed successfully!"
|
|
||||||
echo "Application available at: https://dev.merchbay.app"
|
|
||||||
ENDSSH
|
|
||||||
|
|
||||||
- name: Health Check
|
- name: Health Check
|
||||||
run: |
|
run: |
|
||||||
#!/bin/sh
|
|
||||||
sleep 10
|
sleep 10
|
||||||
curl -f https://dev.merchbay.app || exit 1
|
curl -f https://dev.merchbay.app || exit 1
|
||||||
|
|||||||
@@ -10,13 +10,10 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
# If using self-hosted runner, change to:
|
|
||||||
# runs-on: self-hosted
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
run: |
|
run: |
|
||||||
#!/bin/sh
|
|
||||||
git clone $GITHUB_SERVER_URL/$GITHUB_REPOSITORY.git /workspace/repo || true
|
git clone $GITHUB_SERVER_URL/$GITHUB_REPOSITORY.git /workspace/repo || true
|
||||||
cd /workspace/repo
|
cd /workspace/repo
|
||||||
git fetch origin $GITHUB_REF_NAME
|
git fetch origin $GITHUB_REF_NAME
|
||||||
@@ -25,35 +22,56 @@ jobs:
|
|||||||
|
|
||||||
- name: Build Docker Image
|
- name: Build Docker Image
|
||||||
run: |
|
run: |
|
||||||
#!/bin/sh
|
|
||||||
cd /workspace/repo
|
cd /workspace/repo
|
||||||
docker build -t merchbay_admin:latest .
|
docker build -t merchbay_admin:latest .
|
||||||
docker save merchbay_admin:latest | gzip > merchbay_admin.tar.gz
|
docker save merchbay_admin:latest | gzip > merchbay_admin.tar.gz
|
||||||
|
|
||||||
- name: Setup SSH Key
|
- name: Setup SSH and Deploy
|
||||||
run: |
|
run: |
|
||||||
#!/bin/sh
|
|
||||||
mkdir -p ~/.ssh
|
mkdir -p ~/.ssh
|
||||||
printf '%s' "$PROD_DEPLOY_SSH_KEY" > ~/.ssh/deploy_key
|
printf '%s' "$PROD_DEPLOY_SSH_KEY" > ~/.ssh/deploy_key
|
||||||
chmod 600 ~/.ssh/deploy_key
|
chmod 600 ~/.ssh/deploy_key
|
||||||
env:
|
|
||||||
PROD_DEPLOY_SSH_KEY: ${{ secrets.PROD_DEPLOY_SSH_KEY }}
|
|
||||||
|
|
||||||
- name: Transfer Files to Production Server
|
|
||||||
run: |
|
|
||||||
#!/bin/sh
|
|
||||||
cd /workspace/repo
|
cd /workspace/repo
|
||||||
scp -o StrictHostKeyChecking=no -i ~/.ssh/deploy_key merchbay_admin.tar.gz docker-compose.yml "$PROD_DEPLOY_USER@$PROD_DEPLOY_HOST:/tmp/"
|
scp -o StrictHostKeyChecking=no -i ~/.ssh/deploy_key merchbay_admin.tar.gz docker-compose.yml "$PROD_DEPLOY_USER@$PROD_DEPLOY_HOST:/tmp/"
|
||||||
env:
|
|
||||||
PROD_DEPLOY_USER: ${{ secrets.PROD_DEPLOY_USER }}
|
|
||||||
PROD_DEPLOY_HOST: ${{ secrets.PROD_DEPLOY_HOST }}
|
|
||||||
|
|
||||||
- name: Deploy to Production Server
|
ssh -o StrictHostKeyChecking=no -i ~/.ssh/deploy_key "$PROD_DEPLOY_USER@$PROD_DEPLOY_HOST" "
|
||||||
run: |
|
DEPLOY_DIR='/var/www/merchbay_admin'
|
||||||
#!/bin/sh
|
mkdir -p \$DEPLOY_DIR
|
||||||
ssh -o StrictHostKeyChecking=no -i ~/.ssh/deploy_key "$PROD_DEPLOY_USER@$PROD_DEPLOY_HOST" << 'ENDSSH'
|
cd /tmp
|
||||||
#!/bin/sh
|
docker load < merchbay_admin.tar.gz
|
||||||
|
cp docker-compose.yml \$DEPLOY_DIR/
|
||||||
|
cd \$DEPLOY_DIR
|
||||||
|
|
||||||
|
cat > .env <<'ENVEOF'
|
||||||
|
APP_ENV=production
|
||||||
|
APP_DEBUG=false
|
||||||
|
APP_URL=https://merchbay.com
|
||||||
|
DB_HOST=$PROD_DB_HOST
|
||||||
|
DB_PORT=${PROD_DB_PORT:-3306}
|
||||||
|
DB_DATABASE=$PROD_DB_DATABASE
|
||||||
|
DB_USERNAME=$PROD_DB_USERNAME
|
||||||
|
DB_PASSWORD=$PROD_DB_PASSWORD
|
||||||
|
DOMAIN=merchbay.com
|
||||||
|
ENVEOF
|
||||||
|
|
||||||
|
docker compose down || true
|
||||||
|
docker image prune -f
|
||||||
|
docker network inspect traefik-public >/dev/null 2>&1 || docker network create traefik-public
|
||||||
|
export DOMAIN=merchbay.com
|
||||||
|
export APP_URL=https://merchbay.com
|
||||||
|
docker compose up -d
|
||||||
|
sleep 10
|
||||||
|
docker compose exec -T app php artisan migrate --force
|
||||||
|
docker compose exec -T app php artisan config:cache
|
||||||
|
docker compose exec -T app php artisan route:cache
|
||||||
|
docker compose exec -T app php artisan view:cache
|
||||||
|
rm -f /tmp/merchbay_admin.tar.gz /tmp/docker-compose.yml
|
||||||
|
echo 'Production deployment completed successfully!'
|
||||||
|
echo 'Application available at: https://merchbay.com'
|
||||||
|
"
|
||||||
env:
|
env:
|
||||||
|
PROD_DEPLOY_SSH_KEY: ${{ secrets.PROD_DEPLOY_SSH_KEY }}
|
||||||
PROD_DEPLOY_USER: ${{ secrets.PROD_DEPLOY_USER }}
|
PROD_DEPLOY_USER: ${{ secrets.PROD_DEPLOY_USER }}
|
||||||
PROD_DEPLOY_HOST: ${{ secrets.PROD_DEPLOY_HOST }}
|
PROD_DEPLOY_HOST: ${{ secrets.PROD_DEPLOY_HOST }}
|
||||||
PROD_DB_HOST: ${{ secrets.PROD_DB_HOST }}
|
PROD_DB_HOST: ${{ secrets.PROD_DB_HOST }}
|
||||||
@@ -61,71 +79,8 @@ jobs:
|
|||||||
PROD_DB_DATABASE: ${{ secrets.PROD_DB_DATABASE }}
|
PROD_DB_DATABASE: ${{ secrets.PROD_DB_DATABASE }}
|
||||||
PROD_DB_USERNAME: ${{ secrets.PROD_DB_USERNAME }}
|
PROD_DB_USERNAME: ${{ secrets.PROD_DB_USERNAME }}
|
||||||
PROD_DB_PASSWORD: ${{ secrets.PROD_DB_PASSWORD }}
|
PROD_DB_PASSWORD: ${{ secrets.PROD_DB_PASSWORD }}
|
||||||
# Set deployment directory for production
|
|
||||||
DEPLOY_DIR="/var/www/merchbay_admin"
|
|
||||||
|
|
||||||
# Create deployment directory if it doesn't exist
|
|
||||||
mkdir -p $DEPLOY_DIR
|
|
||||||
|
|
||||||
# Load the Docker image
|
|
||||||
cd /tmp
|
|
||||||
docker load < merchbay_admin.tar.gz
|
|
||||||
|
|
||||||
# Copy docker-compose.yml to deployment directory
|
|
||||||
cp docker-compose.yml $DEPLOY_DIR/
|
|
||||||
|
|
||||||
# Navigate to deployment directory
|
|
||||||
cd $DEPLOY_DIR
|
|
||||||
|
|
||||||
# Update environment file for production
|
|
||||||
cat > .env << EOF
|
|
||||||
APP_ENV=production
|
|
||||||
APP_DEBUG=false
|
|
||||||
APP_URL=https://merchbay.com
|
|
||||||
DB_HOST=${{ secrets.PROD_DB_HOST }}
|
|
||||||
DB_PORT=${{ secrets.PROD_DB_PORT || 3306 }}
|
|
||||||
DB_DATABASE=${{ secrets.PROD_DB_DATABASE }}
|
|
||||||
DB_USERNAME=${{ secrets.PROD_DB_USERNAME }}
|
|
||||||
DB_PASSWORD=${{ secrets.PROD_DB_PASSWORD }}
|
|
||||||
DOMAIN=merchbay.com
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Stop existing container (disconnect from Traefik network gracefully)
|
|
||||||
docker compose down || true
|
|
||||||
|
|
||||||
# Remove old image (optional, keeps only latest)
|
|
||||||
docker image prune -f
|
|
||||||
|
|
||||||
# Ensure Traefik network exists
|
|
||||||
docker network inspect traefik-public >/dev/null 2>&1 || docker network create traefik-public
|
|
||||||
|
|
||||||
# Update docker-compose for production
|
|
||||||
export DOMAIN=merchbay.com
|
|
||||||
export APP_URL=https://merchbay.com
|
|
||||||
|
|
||||||
# Start the application (will auto-connect to Traefik with paid SSL)
|
|
||||||
docker compose up -d
|
|
||||||
|
|
||||||
# Wait for container to be ready
|
|
||||||
sleep 10
|
|
||||||
|
|
||||||
# Run migrations
|
|
||||||
docker compose exec -T app php artisan migrate --force
|
|
||||||
|
|
||||||
# Clear and cache configuration
|
|
||||||
docker compose exec -T app php artisan config:cache
|
|
||||||
docker compose exec -T app php artisan route:cache
|
|
||||||
docker compose exec -T app php artisan view:cache
|
|
||||||
|
|
||||||
# Cleanup
|
|
||||||
rm -f /tmp/merchbay_admin.tar.gz /tmp/docker-compose.yml
|
|
||||||
|
|
||||||
echo "Production deployment completed successfully!"
|
|
||||||
echo "Application available at: https://merchbay.com"
|
|
||||||
ENDSSH
|
|
||||||
|
|
||||||
- name: Health Check
|
- name: Health Check
|
||||||
run: |
|
run: |
|
||||||
#!/bin/sh
|
|
||||||
sleep 10
|
sleep 10
|
||||||
curl -f https://merchbay.com || exit 1
|
curl -f https://merchbay.com || exit 1
|
||||||
|
|||||||
Reference in New Issue
Block a user