-
Notifications
You must be signed in to change notification settings - Fork 11.1k
Test #4527
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Test #4527
Changes from all commits
4ec920b
3380e7c
d0223d0
9e9fd44
04d900d
8a15dd7
6012953
60856b5
4bb62de
783e9ba
049c6d2
2768269
8c325b6
1b42859
a4364d7
a2a7992
322e03d
768572a
be12aa5
41fb36e
a5b719e
446d03f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,238 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # ============================================================================= | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # GQ API Docker 镜像构建与推送工作流 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # ============================================================================= | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 功能说明: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 当 gqapi_release 分支有新代码提交时,自动构建 Docker 镜像并推送到 Docker Hub | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 版本号从项目根目录的 VERSION 文件读取 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 触发条件: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 1. 推送代码到 gqapi_release 分支 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 2. 手动触发(workflow_dispatch) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 输出镜像: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - {DOCKER_HUB_USERNAME}/gq-api:{version} (如 v0.13.2) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - {DOCKER_HUB_USERNAME}/gq-api:latest | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 前置条件: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 需要在 GitHub 仓库 Settings → Secrets and variables → Actions 中配置: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - DOCKER_HUB_USERNAME: Docker Hub 用户名 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - DOCKER_HUB_ACCESS_TOKEN: Docker Hub Access Token | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - SMTP_SERVER: SMTP 服务器地址(如 smtp.qq.com) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - SMTP_PORT: SMTP 端口(如 465) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - SMTP_USERNAME: SMTP 用户名(邮箱地址) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - SMTP_PASSWORD: SMTP 密码/授权码 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - NOTIFY_EMAIL: 接收通知的邮箱地址 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # ============================================================================= | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: Build and Push Docker Image | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # ----------------------------------------------------------------------------- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 触发条件配置 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # ----------------------------------------------------------------------------- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| on: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 当推送到 gqapi_release 分支时触发 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| push: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| branches: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - gqapi_release | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 允许在 GitHub Actions 页面手动触发 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| workflow_dispatch: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # ----------------------------------------------------------------------------- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 任务定义 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # ----------------------------------------------------------------------------- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| jobs: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # --------------------------------------------------------------------------- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Job 1: 构建并推送 Docker 镜像 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # --------------------------------------------------------------------------- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| build-and-push: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 使用 Ubuntu 最新版本作为运行环境 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| runs-on: ubuntu-latest | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 指定使用 gq-api-dockerhub 环境的 secrets | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| environment: gq-api-dockerhub | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 配置权限 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - contents: read - 读取仓库代码 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - packages: write - 推送镜像到容器仓库 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| permissions: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| contents: read | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| packages: write | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 输出变量供后续任务使用 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| outputs: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| version: ${{ steps.version.outputs.version }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # ------------------------------------------------------------------------- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 构建步骤 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # ------------------------------------------------------------------------- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 步骤 1:检出代码 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 从 GitHub 仓库拉取最新代码到工作目录 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Checkout code | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: actions/checkout@v4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 步骤 2:读取版本号 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 从项目根目录的 VERSION 文件读取版本号(如 v0.13.2) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 输出变量:version - 用于后续步骤的镜像标签 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Read version from VERSION file | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id: version | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| VERSION=$(cat VERSION) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "version=$VERSION" >> $GITHUB_OUTPUT | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "Building version: $VERSION" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 步骤 3:调试 - 检查 Secrets 配置 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 安全地检查 secrets 是否已配置(不打印实际值) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Debug - Check Secrets | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "=== Checking Docker Hub Secrets ===" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "DOCKER_HUB_USERNAME length: ${#DOCKER_HUB_USERNAME}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if [ -n "$DOCKER_HUB_USERNAME" ]; then echo "DOCKER_HUB_USERNAME: SET"; else echo "DOCKER_HUB_USERNAME: NOT SET"; fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "DOCKER_HUB_ACCESS_TOKEN length: ${#DOCKER_HUB_ACCESS_TOKEN}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if [ -n "$DOCKER_HUB_ACCESS_TOKEN" ]; then echo "DOCKER_HUB_ACCESS_TOKEN: SET"; else echo "DOCKER_HUB_ACCESS_TOKEN: NOT SET"; fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| env: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| DOCKER_HUB_ACCESS_TOKEN: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 步骤 4:设置 Docker Buildx | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Buildx 是 Docker 的扩展构建工具,支持多平台构建和缓存 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Set up Docker Buildx | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: docker/setup-buildx-action@v3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 步骤 5:登录 Docker Hub | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 使用配置的 secrets 进行身份验证 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # secrets.DOCKER_HUB_USERNAME - Docker Hub 用户名 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # secrets.DOCKER_HUB_ACCESS_TOKEN - Docker Hub 访问令牌 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Login to Docker Hub | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: docker/login-action@v3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| username: ${{ secrets.DOCKER_HUB_USERNAME }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 步骤 6:构建并推送 Docker 镜像 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - context: . 表示使用当前目录(Dockerfile 所在目录) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - push: true 表示构建完成后自动推送到 Docker Hub | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - tags: 镜像标签,包含版本号标签和 latest 标签 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # - cache: 使用 GitHub Actions 缓存加速后续构建 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Build and push Docker image | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: docker/build-push-action@v5 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| context: . | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| push: true | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| tags: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ${{ secrets.DOCKER_HUB_USERNAME }}/gq-api:${{ steps.version.outputs.version }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ${{ secrets.DOCKER_HUB_USERNAME }}/gq-api:latest | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 启用 GitHub Actions 缓存,加速后续构建 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cache-from: type=gha | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cache-to: type=gha,mode=max | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 步骤 7:输出构建摘要 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 在 GitHub Actions 运行页面显示构建结果信息 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Summary | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "### Docker Image Published" >> $GITHUB_STEP_SUMMARY | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "" >> $GITHUB_STEP_SUMMARY | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "- **Version**: \`${{ steps.version.outputs.version }}\`" >> $GITHUB_STEP_SUMMARY | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "- **Tags**:" >> $GITHUB_STEP_SUMMARY | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo " - \`${{ secrets.DOCKER_HUB_USERNAME }}/gq-api:${{ steps.version.outputs.version }}\`" >> $GITHUB_STEP_SUMMARY | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo " - \`${{ secrets.DOCKER_HUB_USERNAME }}/gq-api:latest\`" >> $GITHUB_STEP_SUMMARY | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # --------------------------------------------------------------------------- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Job 2: 构建后处理 - 发送邮件通知 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # --------------------------------------------------------------------------- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # always() 确保无论构建成功还是失败都会执行邮件通知 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| post-build: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| runs-on: ubuntu-latest | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| needs: build-and-push | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if: always() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 指定使用 gq-api-dockerhub 环境的 secrets | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| environment: gq-api-dockerhub | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 获取构建任务的状态 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Get build status | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id: status | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if [ "${{ needs.build-and-push.result }}" == "success" ]; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "status=成功 ✅" >> $GITHUB_OUTPUT | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "color=#28a745" >> $GITHUB_OUTPUT | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "status=失败 ❌" >> $GITHUB_OUTPUT | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "color=#dc3545" >> $GITHUB_OUTPUT | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 发送邮件通知 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 使用 dawidd6/action-send-mail 发送邮件 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Send email notification | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: dawidd6/action-send-mail@v3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # SMTP 服务器配置 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| server_address: ${{ secrets.SMTP_SERVER }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| server_port: ${{ secrets.SMTP_PORT }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # SMTP 认证信息 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| username: ${{ secrets.SMTP_USERNAME }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| password: ${{ secrets.SMTP_PASSWORD }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 邮件内容 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| subject: "GQ API Docker 构建通知 - ${{ steps.status.outputs.status }}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| to: ${{ secrets.NOTIFY_EMAIL }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| from: GQ API CI/CD | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+167
to
+179
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🌐 Web query:
💡 Result: The from parameter in dawidd6/action-send-mail v3 is a required input that specifies the sender of the email. It supports formats parsed by nodemailer's addressparser library. From the action.yml (v5, consistent with v3 structure): - description: Full name of mail sender (might be with an email address specified in <>) - required: true From README.md examples across versions including v3 usages: - from: 'Luke Skywalker user@example.com' Supported address formats (per README): Uses nodemailer's addressparser. Formats described at https://nodemailer.com/extras/addressparser/. Addresses with YAML special characters (e.g., '<', '>') should be single-quoted. Recent changes (post-v3, e.g., v16 relaxes checks, earlier release notes mention stricter forms like "Plain Simple Name" or "user@example.com", but v3 predates these). Usage in workflows: with: from: 'Luke Skywalker user@example.com' Note: v3 is an older tag; current latest is v16 (2026-03-18). Documentation consistent across sources. Citations:
🌐 Web query:
💡 Result: According to RFC 5322, the standard for Internet Message Format, the From header requires a mailbox-list, where each mailbox is either a name-addr (optional display-name followed by angle-addr containing an addr-spec email address) or a bare addr-spec (email address alone). A display name by itself, without an email address (addr-spec), does not constitute a valid mailbox and thus is not permitted in the From field. Valid formats include: - From: sender@example.com (bare addr-spec) - From: "Display Name" sender@example.com (name-addr) Invalid examples explicitly rejected by RFC-compliant systems like Microsoft 365 include: - From: "Microsoft 365" (display name only, no email address) - From: Display Name sender@example.com (display name without enclosing email address in angle brackets) While SMTP servers (per RFC 5321) should not reject messages solely based on header defects, modern receivers often enforce strict RFC 5322 compliance for anti-phishing reasons, marking non-compliant From headers as invalid and potentially rejecting or quarantining mail. The display name serves only for user-friendly presentation and has no functional role in delivery or replies (replies default to the addr-spec). Group syntax allows display-name-only in limited cases (e.g., From: "Group":;), but RFC 6854 recommends against it for originator fields, and it requires a Sender field with a mailbox if used. Citations:
Fix the sender email format to comply with SMTP standards.
Suggested change- from: GQ API CI/CD
+ from: GQ API CI/CD <${{ secrets.SMTP_USERNAME }}>📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 邮件正文(HTML 格式) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| html_body: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <!DOCTYPE html> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <html> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <head> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <meta charset="utf-8"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <style> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .container { max-width: 600px; margin: 0 auto; padding: 20px; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .header { background: ${{ steps.status.outputs.color }}; color: white; padding: 20px; text-align: center; border-radius: 5px 5px 0 0; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .content { background: #f9f9f9; padding: 20px; border: 1px solid #ddd; border-radius: 0 0 5px 5px; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .info-table { width: 100%; border-collapse: collapse; margin-top: 15px; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .info-table td { padding: 10px; border-bottom: 1px solid #ddd; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .info-table td:first-child { font-weight: bold; width: 120px; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .footer { margin-top: 20px; font-size: 12px; color: #666; text-align: center; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </style> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </head> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <body> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div class="container"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div class="header"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <h2>🚀 GQ API Docker 构建通知</h2> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div class="content"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <p>构建状态:<strong style="color: ${{ steps.status.outputs.color }}">{{ steps.status.outputs.status }}</strong></p> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <table class="info-table"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <tr> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <td>版本号</td> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <td>${{ needs.build-and-push.outputs.version || 'N/A' }}</td> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </tr> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <tr> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <td>分支</td> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <td>${{ github.ref_name }}</td> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </tr> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <tr> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <td>触发者</td> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <td>${{ github.actor }}</td> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </tr> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <tr> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <td>提交信息</td> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <td>${{ github.event.head_commit.message }}</td> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </tr> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <tr> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <td>构建时间</td> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <td>${{ github.event.head_commit.timestamp }}</td> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </tr> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </table> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <p style="margin-top: 20px;"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <a href="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| style="background: #0366d6; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px;"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 查看构建详情 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </a> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </p> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div class="footer"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 此邮件由 GitHub Actions 自动发送 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </body> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </html> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -38,6 +38,9 @@ RUN go build -ldflags "-s -w -X 'github.com/QuantumNous/new-api/common.Version=$ | |||||||||||||||
|
|
||||||||||||||||
| FROM debian:bookworm-slim@sha256:f06537653ac770703bc45b4b113475bd402f451e85223f0f2837acbf89ab020a | ||||||||||||||||
|
|
||||||||||||||||
| RUN sed -i 's|http://deb.debian.org|http://mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \ | ||||||||||||||||
| sed -i 's|http://deb.debian.org|http://mirrors.aliyun.com|g' /etc/apt/sources.list 2>/dev/null || true | ||||||||||||||||
|
Comment on lines
+41
to
+42
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: find . -name "Dockerfile" -type f | head -20Repository: QuantumNous/new-api Length of output: 76 🏁 Script executed: wc -l ./DockerfileRepository: QuantumNous/new-api Length of output: 79 🏁 Script executed: cat -n ./DockerfileRepository: QuantumNous/new-api Length of output: 2172 🏁 Script executed: # Verify the suggested change syntax is valid shell/Dockerfile
cat > /tmp/test_dockerfile << 'EOF'
FROM debian:bookworm-slim
ARG DEBIAN_MIRROR=
RUN if [ -n "$DEBIAN_MIRROR" ]; then \
sed -i "s|http://deb.debian.org|$DEBIAN_MIRROR|g" /etc/apt/sources.list.d/debian.sources 2>/dev/null || true; \
sed -i "s|http://deb.debian.org|$DEBIAN_MIRROR|g" /etc/apt/sources.list 2>/dev/null || true; \
fi
RUN apt-get update
EOF
# Basic syntax validation
if grep -q "ARG DEBIAN_MIRROR=" /tmp/test_dockerfile && \
grep -q 'if \[ -n "$DEBIAN_MIRROR" \]' /tmp/test_dockerfile; then
echo "Proposed change syntax looks valid"
else
echo "Syntax issue detected"
fiRepository: QuantumNous/new-api Length of output: 98 Make the Debian mirror override optional. This hardcodes every build to use a regional mirror (mirrors.aliyun.com). If that mirror is slow, unavailable, or lagging, image builds fail even when the default Debian infrastructure is healthy. Especially problematic for non-China builds. Use a build argument instead to allow opt-in mirror configuration while keeping Debian's defaults as the fallback. Suggested change+ARG DEBIAN_MIRROR=
-RUN sed -i 's|http://deb.debian.org|http://mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \
- sed -i 's|http://deb.debian.org|http://mirrors.aliyun.com|g' /etc/apt/sources.list 2>/dev/null || true
+RUN if [ -n "$DEBIAN_MIRROR" ]; then \
+ sed -i "s|http://deb.debian.org|$DEBIAN_MIRROR|g" /etc/apt/sources.list.d/debian.sources 2>/dev/null || true; \
+ sed -i "s|http://deb.debian.org|$DEBIAN_MIRROR|g" /etc/apt/sources.list 2>/dev/null || true; \
+ fi📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||
|
|
||||||||||||||||
| RUN apt-get update \ | ||||||||||||||||
| && apt-get install -y --no-install-recommends ca-certificates tzdata libasan8 wget \ | ||||||||||||||||
| && rm -rf /var/lib/apt/lists/* \ | ||||||||||||||||
|
|
||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| v0.13.2 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Keep the published image name aligned with
new-api.These tags switch the pushed repository from the established
new-apiidentity togq-api. Any existing deploy/pull automation still pointing atnew-apiwill stop receiving releases once this workflow is used.Based on learnings: Do NOT modify, delete, replace, or remove any references, mentions, branding, metadata, or attributions related to new-api (project name/identity) or QuantumNous (organization/author identity) in Docker image names, CI/CD references, and deployment configurations.
🤖 Prompt for AI Agents