diff --git a/.github/workflows/nextjs.yml b/.github/workflows/nextjs.yml index 393ccff..ce50d88 100644 --- a/.github/workflows/nextjs.yml +++ b/.github/workflows/nextjs.yml @@ -1,104 +1,108 @@ -name: 部署 Next.js 站点到 Gitea +name: Next.js CI/CD 流水线 -# 定义触发工作流程的条件 on: push: - # 当推送到 "main" 分支时触发工作流程 - branches: ["main"] - # 手动触发工作流程 - workflow_dispatch: + branches: [ "main" ] + pull_request: + branches: [ "main" ] -#permissions: -# contents: read -# pages: write -# id-token: write - -# 设置工作流程中所需的权限 +# 设置权限 permissions: - # 只读权限用于读取仓库内容 contents: read + pages: write + id-token: write -#concurrency: -# group: "pages" -# cancel-in-progress: false - -# 设置工作流的并发控制 -concurrency: - group: "deploy" # 定义并发组名称为 "deploy" - cancel-in-progress: false # 不取消正在运行的工作流 +# 定义作业和环境变量 +env: + DB_HOST: ${{ secrets.DB_HOST }} + DB_PORT: ${{ secrets.DB_PORT }} + DB_USER: ${{ secrets.DB_USER }} + DB_PASSWORD: ${{ secrets.DB_PASSWORD }} + DB_DATABASE: ${{ secrets.DB_DATABASE }} + DB_ADMIN_USER: ${{ secrets.DB_ADMIN_USER }} + DB_ADMIN_PASSWORD: ${{ secrets.DB_ADMIN_PASSWORD }} jobs: - deploy: - # 指定在最新的 Ubuntu 环境下运行 + # 构建作业 + build: runs-on: ubuntu-latest - # 主要执行的步骤 - steps: - # 第一步:检出(checkout)代码 - - name: 检出代码 - # 使用 GitHub 官方的 actions/checkout@v4 - #uses: actions/checkout@v4 - uses: https://git.aoun.ltd/actions/checkout@v4 - - # 第二步:将代码通过 SCP 传输到群晖服务器上 - - name: 🚚 将项目文件复制到目标服务器 - # 使用 appleboy 的 SCP 动作传输文件到远程服务器 - #uses: appleboy/scp-action@v0.1.7 - uses: https://git.aoun.ltd/298977887/scp-action@v0.1.7 - with: - host: ${{ secrets.SYNOLOGY_HOST }} - username: ${{ secrets.SYNOLOGY_USERNAME }} - key: ${{ secrets.SSH_PRIVATE_KEY }} - port: ${{ secrets.SYNOLOGY_SSH_PORT }} - source: "." - target: "/volume2/docker/aounsaas/" - - name: 🛠️ 在群晖上构建并运行Docker镜像 - #uses: appleboy/ssh-action@master - # 使用 appleboy 的 SSH 动作来连接服务器并运行命令 - #uses: appleboy/ssh-action@v1.0.3 - #使用自定义的 SSH 动作 - uses: https://git.aoun.ltd/298977887/ssh-action@v1.0.3 + steps: + # 检出代码 + - name: 检出代码 + uses: actions/checkout@v4 + + # 配置 Node.js + - name: 配置 Node.js + uses: actions/setup-node@v4 with: - host: ${{ secrets.SYNOLOGY_HOST }} - username: ${{ secrets.SYNOLOGY_USERNAME }} - key: ${{ secrets.SSH_PRIVATE_KEY }} - port: ${{ secrets.SYNOLOGY_SSH_PORT }} + node-version: '20' + + # 安装依赖 + - name: 安装依赖 + run: npm install --frozen-lockfile + + # 构建应用 + - name: 构建应用 + run: npm run build + + # 上传构建产物 + - name: 上传构建产物 + uses: actions/upload-artifact@v4 + with: + name: build-output + path: | + .next + public + package.json + npm-lock.yaml + next.config.ts + + # 部署作业 + deploy: + needs: build + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/main' + + steps: + # 下载构建产物 + - name: 下载构建产物 + uses: actions/download-artifact@v4 + with: + name: build-output + + # 配置 Node.js + - name: 配置 Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + # 安装生产依赖 + - name: 安装生产依赖 + run: npm install --prod + + # 构建 Docker 镜像并推送 + - name: 登录到 Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: 构建并推送 Docker 镜像 + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: ${{ secrets.DOCKER_USERNAME }}/saas-app:latest + + # 可选: 部署到服务器 + - name: 部署到服务器 + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SERVER_USERNAME }} + key: ${{ secrets.SERVER_SSH_KEY }} script: | - # 通过 set -e 使脚本在遇到错误时立即停止 - set -e - echo "🚀 开始执行部署..." - #cd /volume1/docker/aounsaas - cd /volume2/docker/aounsaas - echo "🔧 正在构建临时镜像..." - #/usr/local/bin/docker build -t aounsaas-temp . - if /usr/local/bin/docker build -t aounsaas-temp .; then - echo "✅ 镜像构建成功,开始更新容器..." - echo "🔧 正在停止旧容器..." - /usr/local/bin/docker stop aounsaas || true - echo "🔧 正在删除旧容器..." - /usr/local/bin/docker rm aounsaas || true - echo "🔧 正在删除旧镜像..." - /usr/local/bin/docker rmi aounsaas || true - echo "🔧 重命名新镜像..." - /usr/local/bin/docker tag aounsaas-temp aounsaas - /usr/local/bin/docker rmi aounsaas-temp - echo "🚀 正在运行新容器..." - #/usr/local/bin/docker run -d -p 3300:3000 --name aounsaas -e TZ=Asia/Shanghai aounsaas - # 启动新的容器,使用指定的环境变量和端口映射,并设置自动重启功能 - # 容器名称为 aounsaas,镜像名称为 aounsaas - # 自动重启容器,除非手动停止 - # 将本地 3300 端口映射到容器的 3000 端口 - # 设置时区为上海 - # 设置 API 地址,最后一行没有反斜杠 - # 使用 aounsaas 镜像运行容器 - /usr/local/bin/docker run -d \ - --name aounsaas \ - --restart unless-stopped \ - -p 3300:3000 \ - -e TZ=Asia/Shanghai \ - -e NEXT_PUBLIC_API=https://emoji.aoun.ltd/ \ - aounsaas - echo "🎉 部署完成!" - else - echo "❌ 镜像构建失败!,保留旧容器运行。" - fi + cd /path/to/deployment + docker-compose pull + docker-compose up -d \ No newline at end of file