dev.yml 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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@v5
  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@v2
  53. - name: Install dependencies, type check, and format code
  54. run: |
  55. bun install
  56. bun run typecheck
  57. bun run format
  58. - name: Commit formatted code
  59. run: |
  60. # 配置git
  61. git config user.name "github-actions[bot]"
  62. git config user.email "github-actions[bot]@users.noreply.github.com"
  63. # 添加所有更改(格式化后的代码)
  64. git add -A
  65. # 排除 .github/ 目录的更改(workflow 文件不需要自动提交,且需要特殊权限)
  66. git restore --staged .github/ 2>/dev/null || true
  67. # 检查是否有更改需要提交
  68. if git diff --cached --quiet; then
  69. echo "No changes to commit"
  70. else
  71. # 提交格式化后的代码
  72. git commit -m "chore: format code (${{ steps.branch_info.outputs.versioned_tag }})"
  73. git push origin ${{ steps.branch_info.outputs.branch_name }}
  74. fi
  75. - name: Prepare image names
  76. id: image_names
  77. run: |
  78. GHCR_IMAGE=$(echo "ghcr.io/${{ github.repository_owner }}/claude-code-hub" | tr '[:upper:]' '[:lower:]')
  79. echo "ghcr_image=${GHCR_IMAGE}" >> "$GITHUB_OUTPUT"
  80. # Docker构建步骤
  81. - name: Set up QEMU
  82. uses: docker/setup-qemu-action@v3
  83. - name: Set up Docker Buildx
  84. uses: docker/setup-buildx-action@v3
  85. - name: Log in to GitHub Container Registry
  86. uses: docker/login-action@v3
  87. with:
  88. registry: ghcr.io
  89. username: ${{ github.repository_owner }}
  90. password: ${{ secrets.GITHUB_TOKEN }}
  91. - name: Build and push Docker image
  92. uses: docker/build-push-action@v6
  93. with:
  94. context: .
  95. file: ./deploy/Dockerfile
  96. platforms: linux/amd64,linux/arm64
  97. push: true
  98. build-args: |
  99. APP_VERSION=${{ steps.branch_info.outputs.versioned_tag }}
  100. tags: |
  101. ${{ steps.image_names.outputs.ghcr_image }}:${{ steps.branch_info.outputs.versioned_tag }}
  102. ${{ steps.image_names.outputs.ghcr_image }}:${{ steps.branch_info.outputs.base_tag }}
  103. labels: |
  104. org.opencontainers.image.version=${{ steps.branch_info.outputs.versioned_tag }}
  105. org.opencontainers.image.revision=${{ github.sha }}
  106. org.opencontainers.image.source=https://github.com/${{ github.repository }}
  107. cache-from: type=gha
  108. cache-to: type=gha,mode=max
  109. - name: Build summary
  110. run: |
  111. echo "Build completed successfully!"
  112. echo ""
  113. echo "📦 Branch: ${{ steps.branch_info.outputs.branch_name }}"
  114. echo "📦 Docker Images:"
  115. echo " - ${{ steps.image_names.outputs.ghcr_image }}:${{ steps.branch_info.outputs.versioned_tag }}"
  116. echo " - ${{ steps.image_names.outputs.ghcr_image }}:${{ steps.branch_info.outputs.base_tag }}"
  117. echo ""
  118. echo "🚀 Usage:"
  119. echo " docker pull ${{ steps.image_names.outputs.ghcr_image }}:${{ steps.branch_info.outputs.base_tag }}"
  120. echo " docker pull ${{ steps.image_names.outputs.ghcr_image }}:${{ steps.branch_info.outputs.versioned_tag }}"