2
0

dev.yml 5.1 KB

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