dev.yml 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. name: Non-Main Branch CI/CD
  2. on:
  3. push:
  4. branches:
  5. - '**' # 匹配所有分支
  6. - '!main' # 排除 main 分支
  7. permissions:
  8. contents: write
  9. packages: write
  10. jobs:
  11. dev-build-deploy:
  12. runs-on: ubuntu-latest
  13. # 跳过由GitHub Actions创建的提交,避免死循环
  14. if: github.event.pusher.name != 'github-actions[bot]' && !contains(github.event.head_commit.message, '[skip ci]')
  15. steps:
  16. - name: Checkout code
  17. uses: actions/checkout@v4
  18. with:
  19. fetch-depth: 0
  20. token: ${{ secrets.GITHUB_TOKEN }}
  21. - name: Prepare branch info and tags
  22. id: branch_info
  23. run: |
  24. # 获取分支名(去掉 refs/heads/ 前缀)
  25. BRANCH_NAME="${GITHUB_REF#refs/heads/}"
  26. # 处理分支名:转小写,替换 / 为 -,只保留字母数字和连字符
  27. SAFE_BRANCH_NAME=$(echo "$BRANCH_NAME" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9-]/-/g' | sed 's/--*/-/g' | sed 's/^-//;s/-$//')
  28. # 获取短 commit hash
  29. SHORT_SHA=$(git rev-parse --short=7 HEAD)
  30. # 根据是否是 dev 分支决定 tag 策略
  31. if [ "$BRANCH_NAME" = "dev" ]; then
  32. BASE_TAG="dev"
  33. VERSIONED_TAG="dev-$SHORT_SHA"
  34. else
  35. BASE_TAG="$SAFE_BRANCH_NAME"
  36. VERSIONED_TAG="$SAFE_BRANCH_NAME-$SHORT_SHA"
  37. fi
  38. echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT
  39. echo "safe_branch_name=$SAFE_BRANCH_NAME" >> $GITHUB_OUTPUT
  40. echo "short_sha=$SHORT_SHA" >> $GITHUB_OUTPUT
  41. echo "base_tag=$BASE_TAG" >> $GITHUB_OUTPUT
  42. echo "versioned_tag=$VERSIONED_TAG" >> $GITHUB_OUTPUT
  43. echo "Building from branch: $BRANCH_NAME"
  44. echo "Safe branch name: $SAFE_BRANCH_NAME"
  45. echo "Base tag: $BASE_TAG"
  46. echo "Versioned tag: $VERSIONED_TAG"
  47. - name: Setup Node.js for formatting
  48. uses: actions/setup-node@v4
  49. with:
  50. node-version: "20"
  51. - name: Setup Bun
  52. uses: oven-sh/setup-bun@v1
  53. with:
  54. bun-version: '1.3.2'
  55. - name: Install dependencies and format code
  56. run: |
  57. bun install --frozen-lockfile
  58. bun run format
  59. - name: Commit formatted code
  60. run: |
  61. # 配置git
  62. git config user.name "github-actions[bot]"
  63. git config user.email "github-actions[bot]@users.noreply.github.com"
  64. # 添加所有更改(格式化后的代码)
  65. git add -A
  66. # 排除 .github/ 目录的更改(workflow 文件不需要自动提交,且需要特殊权限)
  67. git restore --staged .github/ 2>/dev/null || true
  68. # 检查是否有更改需要提交
  69. if git diff --cached --quiet; then
  70. echo "No changes to commit"
  71. else
  72. # 提交格式化后的代码
  73. git commit -m "chore: format code (${{ steps.branch_info.outputs.versioned_tag }})"
  74. git push origin ${{ steps.branch_info.outputs.branch_name }}
  75. fi
  76. - name: Prepare image names
  77. id: image_names
  78. run: |
  79. GHCR_IMAGE=$(echo "ghcr.io/${{ github.repository_owner }}/claude-code-hub" | tr '[:upper:]' '[:lower:]')
  80. echo "ghcr_image=${GHCR_IMAGE}" >> "$GITHUB_OUTPUT"
  81. # Docker构建步骤
  82. - name: Set up QEMU
  83. uses: docker/setup-qemu-action@v3
  84. - name: Set up Docker Buildx
  85. uses: docker/setup-buildx-action@v3
  86. - name: Log in to GitHub Container Registry
  87. uses: docker/login-action@v3
  88. with:
  89. registry: ghcr.io
  90. username: ${{ github.repository_owner }}
  91. password: ${{ secrets.GITHUB_TOKEN }}
  92. - name: Build and push Docker image
  93. uses: docker/build-push-action@v6
  94. with:
  95. context: .
  96. file: ./deploy/Dockerfile
  97. platforms: linux/amd64,linux/arm64
  98. push: true
  99. build-args: |
  100. APP_VERSION=${{ steps.branch_info.outputs.versioned_tag }}
  101. tags: |
  102. ${{ steps.image_names.outputs.ghcr_image }}:${{ steps.branch_info.outputs.versioned_tag }}
  103. ${{ steps.image_names.outputs.ghcr_image }}:${{ steps.branch_info.outputs.base_tag }}
  104. labels: |
  105. org.opencontainers.image.version=${{ steps.branch_info.outputs.versioned_tag }}
  106. org.opencontainers.image.revision=${{ github.sha }}
  107. org.opencontainers.image.source=https://github.com/${{ github.repository }}
  108. cache-from: type=gha
  109. cache-to: type=gha,mode=max
  110. - name: Build summary
  111. run: |
  112. echo "✅ Build completed successfully!"
  113. echo ""
  114. echo "📦 Branch: ${{ steps.branch_info.outputs.branch_name }}"
  115. echo "📦 Docker Images:"
  116. echo " - ${{ steps.image_names.outputs.ghcr_image }}:${{ steps.branch_info.outputs.versioned_tag }}"
  117. echo " - ${{ steps.image_names.outputs.ghcr_image }}:${{ steps.branch_info.outputs.base_tag }}"
  118. echo ""
  119. echo "🚀 Usage:"
  120. echo " docker pull ${{ steps.image_names.outputs.ghcr_image }}:${{ steps.branch_info.outputs.base_tag }}"
  121. echo " docker pull ${{ steps.image_names.outputs.ghcr_image }}:${{ steps.branch_info.outputs.versioned_tag }}"