deploy.yml (4307B)
1 name: Deploy data explorer 2 on: 3 push: 4 branches: [main] 5 paths: 6 - 'explorer/**' 7 - 'scripts/build-explorer-data.py' 8 - 'papers/*/scan.json' 9 - 'papers/*/scan-v5.json' 10 - 'registry.jsonl' 11 - '.forgejo/workflows/deploy.yml' 12 13 jobs: 14 deploy: 15 runs-on: ubuntu-latest 16 env: 17 SITE_NAME: ai-research-survey 18 SITE_BASE: /var/www/research 19 steps: 20 - uses: actions/checkout@v3 21 22 - name: Setup Node 23 uses: actions/setup-node@v4 24 with: 25 node-version: '20' 26 cache: 'npm' 27 cache-dependency-path: explorer/package-lock.json 28 29 - name: Install system dependencies 30 run: | 31 apt-get update && apt-get install -y rsync apache2-utils 32 33 - name: Build explorer data 34 run: python3 scripts/build-explorer-data.py 35 36 - name: Install npm dependencies 37 run: cd explorer && npm ci 38 39 - name: Build site 40 run: cd explorer && npm run build 41 42 - name: Generate htpasswd 43 if: ${{ secrets.AUTH_USERNAME != '' && secrets.AUTH_PASSWORD != '' }} 44 run: | 45 htpasswd -cb ./explorer/dist/.htpasswd "${{ secrets.AUTH_USERNAME }}" "${{ secrets.AUTH_PASSWORD }}" 46 47 - name: Ensure site structure exists 48 uses: https://github.com/appleboy/ssh-action@v1.2.0 49 with: 50 host: ${{ secrets.HOST }} 51 username: ${{ secrets.USERNAME }} 52 key: ${{ secrets.SSH_KEY }} 53 envs: SITE_NAME,SITE_BASE 54 script: | 55 BASE="${SITE_BASE}/${SITE_NAME}" 56 if [ ! -d "$BASE" ]; then 57 echo "First deploy -- initializing $SITE_NAME" 58 mkdir -p "$BASE/blue" "$BASE/green" 59 ln -sfn "$BASE/blue" "$BASE/current" 60 else 61 echo "Site structure already exists" 62 fi 63 64 - name: Deploy files 65 run: | 66 echo "${{ secrets.SSH_KEY }}" > /tmp/deploy_key 67 chmod 600 /tmp/deploy_key 68 69 TARGET=$(ssh -i /tmp/deploy_key -o StrictHostKeyChecking=no \ 70 ${{ secrets.USERNAME }}@${{ secrets.HOST }} \ 71 "if [ \"\$(readlink ${SITE_BASE}/${SITE_NAME}/current)\" = \"${SITE_BASE}/${SITE_NAME}/blue\" ]; then echo green; else echo blue; fi") 72 73 echo "Deploying to $TARGET" 74 75 rsync -av --delete \ 76 -e "ssh -i /tmp/deploy_key -o StrictHostKeyChecking=no" \ 77 ./explorer/dist/ ${{ secrets.USERNAME }}@${{ secrets.HOST }}:${SITE_BASE}/${SITE_NAME}/$TARGET/ 78 79 rm /tmp/deploy_key 80 81 - name: Switch symlink 82 uses: https://github.com/appleboy/ssh-action@v1.2.0 83 with: 84 host: ${{ secrets.HOST }} 85 username: ${{ secrets.USERNAME }} 86 key: ${{ secrets.SSH_KEY }} 87 envs: SITE_NAME,SITE_BASE 88 script: | 89 BASE="${SITE_BASE}/${SITE_NAME}" 90 if [ "$(readlink $BASE/current)" = "$BASE/blue" ]; then 91 NEW=green 92 else 93 NEW=blue 94 fi 95 ln -sfn "$BASE/$NEW" "$BASE/current" 96 systemctl reload nginx 97 echo "Switched $SITE_NAME to $NEW" 98 99 - name: Smoke test 100 run: | 101 sleep 2 102 if [ -n "${{ secrets.AUTH_USERNAME }}" ] && [ -n "${{ secrets.AUTH_PASSWORD }}" ]; then 103 curl -f -u "${{ secrets.AUTH_USERNAME }}:${{ secrets.AUTH_PASSWORD }}" https://${SITE_NAME}.research.statagroup.com/ || exit 1 104 else 105 curl -f https://${SITE_NAME}.research.statagroup.com/ || exit 1 106 fi 107 108 - name: Rollback on failure 109 if: failure() 110 uses: https://github.com/appleboy/ssh-action@v1.2.0 111 with: 112 host: ${{ secrets.HOST }} 113 username: ${{ secrets.USERNAME }} 114 key: ${{ secrets.SSH_KEY }} 115 envs: SITE_NAME,SITE_BASE 116 script: | 117 BASE="${SITE_BASE}/${SITE_NAME}" 118 if [ -L "$BASE/current" ]; then 119 if [ "$(readlink $BASE/current)" = "$BASE/blue" ]; then 120 OLD=green 121 else 122 OLD=blue 123 fi 124 ln -sfn "$BASE/$OLD" "$BASE/current" 125 systemctl reload nginx 126 echo "Rolled back $SITE_NAME to $OLD" 127 else 128 echo "No previous deployment to roll back to" 129 fi