1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| name: Deploy to EC2
on: push: branches: [ main ]
jobs: deploy: runs-on: ubuntu-latest
steps: - name: 📥 Checkout code uses: actions/checkout@v4
- name: 🟢 Setup Node.js uses: actions/setup-node@v4 with: node-version: '18' cache: 'npm'
- name: 📦 Install dependencies run: npm ci
- name: ⚙️ Build app run: npm run build
- name: 📦 Prepare deployment package run: | mkdir -p deploy-package cp -r .next public next.config.js package.json package-lock.json deploy-package/ # 如果有 .env 文件也复制(确保它在 Git 中) if [ -f .env ]; then cp .env deploy-package/ echo "✅ .env included in deployment" else echo "⚠️ No .env file found (make sure it's committed or handled separately)" fi # 调试:显示部署包内容 echo "=== Deployment package contents ===" ls -la deploy-package/
- name: 🔑 Setup SSH key run: | mkdir -p ~/.ssh echo "$EC2_SSH_PRIVATE_KEY" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan "$EC2_HOST" >> ~/.ssh/known_hosts env: EC2_SSH_PRIVATE_KEY: ${{ secrets.EC2_SSH_PRIVATE_KEY }} EC2_HOST: ${{ secrets.EC2_HOST }}
- name: 📁 Create app directory on EC2 run: ssh deployer@${{ secrets.EC2_HOST }} "mkdir -p /home/deployer/app/ArtChais-Web"
- name: 🚀 Sync files to EC2 run: | rsync -avz --delete \ deploy-package/ \ deployer@${{ secrets.EC2_HOST }}:/home/deployer/app/ArtChais-Web/ env: EC2_HOST: ${{ secrets.EC2_HOST }}
- name: 🔄 Restart app on EC2 run: | ssh deployer@${{ secrets.EC2_HOST }} << 'EOF' export PATH="$HOME/.npm-global/bin:$PATH" cd /home/deployer/app/ArtChais-Web npm ci --omit=dev pm2 delete artchais-web 2>/dev/null || true pm2 start "npm start" \ --name "artchais-web" \ --output "/home/deployer/app/ArtChais-Web/out.log" \ --error "/home/deployer/app/ArtChais-Web/error.log" \ --log-date-format "YYYY-MM-DD HH:mm:ss"
pm2 save EOF
|