107 lines
4.9 KiB
YAML
107 lines
4.9 KiB
YAML
name: Deploy staging to test server
|
|
|
|
on:
|
|
push:
|
|
branches: [staging]
|
|
|
|
concurrency:
|
|
group: staging-deploy
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
deploy:
|
|
runs-on: xiaoxin
|
|
timeout-minutes: 45
|
|
env:
|
|
GITEA_SHA: ${{ gitea.sha }}
|
|
REGISTRY_HOST: crpi-d1feco6itet73spp.cn-hongkong.personal.cr.aliyuncs.com
|
|
IMAGE_REPOSITORY: crpi-d1feco6itet73spp.cn-hongkong.personal.cr.aliyuncs.com/copse/jyotisha
|
|
DEPLOY_HOST: ${{ vars.STAGING_HOST }}
|
|
DEPLOY_PORT: ${{ vars.STAGING_PORT }}
|
|
DEPLOY_USER: ${{ vars.STAGING_USER }}
|
|
DEPLOY_PATH: ${{ vars.STAGING_PATH }}
|
|
STAGING_URL: ${{ vars.STAGING_URL }}
|
|
|
|
steps:
|
|
- name: Checkout staging
|
|
run: |
|
|
set -euo pipefail
|
|
git init .
|
|
git remote remove origin 2>/dev/null || true
|
|
git remote add origin https://git.copse.top/root/Jyotisha.git
|
|
git -c http.connectTimeout=15 -c http.lowSpeedLimit=1024 -c http.lowSpeedTime=30 \
|
|
fetch --depth=1 --no-tags origin "$GITEA_SHA"
|
|
git checkout --detach --force "$GITEA_SHA"
|
|
|
|
- name: Build and push images
|
|
env:
|
|
REGISTRY_USERNAME: ${{ secrets.REGISTRY_USERNAME }}
|
|
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
|
|
run: |
|
|
set -euo pipefail
|
|
printf '%s' "$REGISTRY_PASSWORD" | docker login "$REGISTRY_HOST" --username "$REGISTRY_USERNAME" --password-stdin
|
|
docker build -f deploy/railway-api.Dockerfile -t "$IMAGE_REPOSITORY:api-$GITEA_SHA" .
|
|
docker build -f deploy/railway-web.Dockerfile -t "$IMAGE_REPOSITORY:web-$GITEA_SHA" .
|
|
docker push "$IMAGE_REPOSITORY:api-$GITEA_SHA"
|
|
docker push "$IMAGE_REPOSITORY:web-$GITEA_SHA"
|
|
docker logout "$REGISTRY_HOST"
|
|
|
|
- name: Deploy on test server
|
|
env:
|
|
REGISTRY_USERNAME: ${{ secrets.REGISTRY_USERNAME }}
|
|
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
|
|
SSH_PRIVATE_KEY: ${{ secrets.STAGING_SSH_PRIVATE_KEY }}
|
|
STAGING_KNOWN_HOSTS: ${{ vars.STAGING_KNOWN_HOSTS }}
|
|
run: |
|
|
set -euo pipefail
|
|
install -m 700 -d "$RUNNER_TEMP/staging-ssh"
|
|
printf '%s\n' "$SSH_PRIVATE_KEY" | tr -d '\r' > "$RUNNER_TEMP/staging-ssh/id_ed25519"
|
|
printf '%s\n' "$STAGING_KNOWN_HOSTS" | tr -d '\r' > "$RUNNER_TEMP/staging-ssh/known_hosts"
|
|
chmod 600 "$RUNNER_TEMP/staging-ssh/id_ed25519" "$RUNNER_TEMP/staging-ssh/known_hosts"
|
|
|
|
SSH_OPTIONS="-i $RUNNER_TEMP/staging-ssh/id_ed25519 -p $DEPLOY_PORT -o BatchMode=yes -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes -o UserKnownHostsFile=$RUNNER_TEMP/staging-ssh/known_hosts"
|
|
SCP_OPTIONS="-i $RUNNER_TEMP/staging-ssh/id_ed25519 -P $DEPLOY_PORT -o BatchMode=yes -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes -o UserKnownHostsFile=$RUNNER_TEMP/staging-ssh/known_hosts"
|
|
REMOTE="$DEPLOY_USER@$DEPLOY_HOST"
|
|
ARCHIVE="$RUNNER_TEMP/deploy-$GITEA_SHA.tar"
|
|
REMOTE_ARCHIVE="/tmp/jyotisha-deploy-$GITEA_SHA.tar"
|
|
|
|
tar -cf "$ARCHIVE" deploy
|
|
scp $SCP_OPTIONS "$ARCHIVE" "$REMOTE:$REMOTE_ARCHIVE"
|
|
printf '%s' "$REGISTRY_PASSWORD" | ssh $SSH_OPTIONS "$REMOTE" "sudo docker login '$REGISTRY_HOST' --username '$REGISTRY_USERNAME' --password-stdin"
|
|
ssh $SSH_OPTIONS "$REMOTE" "
|
|
set -e
|
|
sudo install -d '$DEPLOY_PATH'
|
|
sudo tar -xf '$REMOTE_ARCHIVE' -C '$DEPLOY_PATH'
|
|
rm -f '$REMOTE_ARCHIVE'
|
|
cd '$DEPLOY_PATH'
|
|
sudo env \
|
|
API_IMAGE='$IMAGE_REPOSITORY:api-$GITEA_SHA' \
|
|
WEB_IMAGE='$IMAGE_REPOSITORY:web-$GITEA_SHA' \
|
|
GITHUB_SHA='$GITEA_SHA' \
|
|
APP_ENV_FILE='../.env.staging' \
|
|
DATABASE_ENV_FILE='../.env.staging.database' \
|
|
CADDYFILE_PATH='./Caddyfile.staging' \
|
|
SITE_ADDRESS='https://staging.jyotisha.chat' \
|
|
docker compose -p jyotisha-staging --env-file .env.staging \
|
|
-f deploy/docker-compose.server.yml \
|
|
-f deploy/docker-compose.postgres.yml \
|
|
-f deploy/docker-compose.staging.yml \
|
|
pull api web
|
|
sudo env \
|
|
API_IMAGE='$IMAGE_REPOSITORY:api-$GITEA_SHA' \
|
|
WEB_IMAGE='$IMAGE_REPOSITORY:web-$GITEA_SHA' \
|
|
GITHUB_SHA='$GITEA_SHA' \
|
|
APP_ENV_FILE='../.env.staging' \
|
|
DATABASE_ENV_FILE='../.env.staging.database' \
|
|
CADDYFILE_PATH='./Caddyfile.staging' \
|
|
SITE_ADDRESS='https://staging.jyotisha.chat' \
|
|
docker compose -p jyotisha-staging --env-file .env.staging \
|
|
-f deploy/docker-compose.server.yml \
|
|
-f deploy/docker-compose.postgres.yml \
|
|
-f deploy/docker-compose.staging.yml \
|
|
up -d --no-build --remove-orphans
|
|
sudo docker logout '$REGISTRY_HOST'
|
|
"
|
|
|
|
curl --fail --silent --show-error --retry 12 --retry-delay 5 "$STAGING_URL/api/health"
|