Files
Jyotisha/.gitea/workflows/backend-quality-gate.yml
T
linmeng 248e1b8a07
Deploy staging to test server / deploy (push) Successful in 3m16s
fix: unify staging admin access
2026-07-29 11:28:15 +08:00

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"