release.yml 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. name: Release
  2. on:
  3. push:
  4. branches:
  5. - "**"
  6. tags:
  7. - "v*.*.*"
  8. paths-ignore:
  9. - "**/*.md"
  10. - "**/*.yaml"
  11. pull_request:
  12. branches:
  13. - "**"
  14. paths-ignore:
  15. - "**/*.md"
  16. - "**/*.yaml"
  17. env:
  18. DOCKERHUB_REPO: ${{ secrets.DOCKERHUB_REPO != '' && secrets.DOCKERHUB_REPO || secrets.DOCKERHUB_USERNAME != '' && format('{0}/{1}', secrets.DOCKERHUB_USERNAME, 'aiproxy') || '' }}
  19. GHCR_REPO: ghcr.io/${{ github.repository }}
  20. ALIYUN_REGISTRY: ${{ secrets.ALIYUN_REGISTRY }}
  21. ALIYUN_REPO: ${{ secrets.ALIYUN_REPO != '' && secrets.ALIYUN_REPO || secrets.ALIYUN_USERNAME != '' && format('{0}/{1}/{2}', secrets.ALIYUN_REGISTRY, secrets.ALIYUN_USERNAME, 'aiproxy') || '' }}
  22. jobs:
  23. release:
  24. name: Release
  25. runs-on: ubuntu-24.04
  26. strategy:
  27. fail-fast: false
  28. matrix:
  29. targets:
  30. - GOOS: linux
  31. GOARCH: arm64
  32. - GOOS: linux
  33. GOARCH: amd64
  34. - GOOS: darwin
  35. GOARCH: arm64
  36. - GOOS: darwin
  37. GOARCH: amd64
  38. - GOOS: windows
  39. GOARCH: amd64
  40. EXT: .exe
  41. - GOOS: windows
  42. GOARCH: arm64
  43. EXT: .exe
  44. steps:
  45. - name: Checkout
  46. uses: actions/checkout@v4
  47. - name: Download tiktoken
  48. run: |
  49. bash common/tiktoken/assest.sh
  50. - name: Setup Go
  51. uses: actions/setup-go@v5
  52. with:
  53. go-version: "1.23"
  54. - name: Build
  55. run: |
  56. export GOOS=${{ matrix.targets.GOOS }}
  57. export GOARCH=${{ matrix.targets.GOARCH }}
  58. go build -trimpath -tags "jsoniter" -ldflags "-s -w" -o aiproxy-${{ matrix.targets.GOOS }}-${{ matrix.targets.GOARCH }}${{ matrix.targets.EXT }}
  59. - name: Get release meta
  60. if: ${{ startsWith(github.ref, 'refs/tags/') }}
  61. id: release_meta
  62. run: |
  63. version=${GITHUB_REF/refs\/tags\/v/}
  64. echo "version: ${version}"
  65. prerelease=$(echo ${version} | grep -E 'rc|beta|alpha' || true)
  66. release_name="Version ${version}"
  67. echo "release_name: ${release_name}"
  68. if [ -n "${prerelease}" ]; then
  69. prerelease=true
  70. release_name="${release_name} (Prerelease)"
  71. fi
  72. tag_name="v${version}"
  73. echo "prerelease: ${prerelease}"
  74. echo "tag_name: ${tag_name}"
  75. echo "PRERELEASE=${prerelease}" >> $GITHUB_OUTPUT
  76. echo "RELEASE_NAME=${release_name}" >> $GITHUB_OUTPUT
  77. echo "TAG_NAME=${tag_name}" >> $GITHUB_OUTPUT
  78. - name: Release
  79. uses: softprops/action-gh-release@v2
  80. if: ${{ startsWith(github.ref, 'refs/tags/') }}
  81. with:
  82. token: ${{ secrets.GITHUB_TOKEN }}
  83. draft: false
  84. prerelease: ${{ steps.release_meta.outputs.PRERELEASE }}
  85. append_body: false
  86. fail_on_unmatched_files: true
  87. name: ${{ steps.release_meta.outputs.RELEASE_NAME }}
  88. tag_name: ${{ steps.release_meta.outputs.TAG_NAME }}
  89. files: |
  90. aiproxy-${{ matrix.targets.GOOS }}-${{ matrix.targets.GOARCH }}${{ matrix.targets.EXT }}
  91. build-docker-images:
  92. name: Build Docker Images
  93. strategy:
  94. matrix:
  95. include:
  96. - arch: amd64
  97. - arch: arm64
  98. runs-on: ubuntu-24.04-arm
  99. runs-on: ${{ matrix.runs-on || 'ubuntu-24.04' }}
  100. steps:
  101. - name: Login to GitHub Container Registry
  102. if: ${{ github.event_name != 'pull_request' && github.actor != 'dependabot[bot]' }}
  103. uses: docker/login-action@v3
  104. with:
  105. registry: ghcr.io
  106. username: ${{ github.actor }}
  107. password: ${{ secrets.GITHUB_TOKEN }}
  108. - name: Login to DockerHub
  109. uses: docker/login-action@v3
  110. if: ${{ github.event_name != 'pull_request' && github.actor != 'dependabot[bot]' && env.DOCKERHUB_REPO }}
  111. with:
  112. username: ${{ secrets.DOCKERHUB_USERNAME }}
  113. password: ${{ secrets.DOCKERHUB_TOKEN }}
  114. - name: Login to Aliyun Registry
  115. uses: docker/login-action@v3
  116. if: ${{ github.event_name != 'pull_request' && github.actor != 'dependabot[bot]' && env.ALIYUN_REGISTRY }}
  117. with:
  118. registry: ${{ env.ALIYUN_REGISTRY }}
  119. username: ${{ secrets.ALIYUN_USERNAME }}
  120. password: ${{ secrets.ALIYUN_PASSWORD }}
  121. - name: Checkout
  122. uses: actions/checkout@v4
  123. - name: Set up Docker Buildx
  124. uses: docker/setup-buildx-action@v3
  125. - name: Extract metadata (tags, labels) for Docker
  126. id: meta
  127. uses: docker/metadata-action@v5
  128. with:
  129. images: |
  130. ${{ env.DOCKERHUB_REPO }}
  131. ${{ env.GHCR_REPO }}
  132. ${{ env.ALIYUN_REPO }}
  133. - name: Build for ${{ matrix.arch }}
  134. id: build
  135. uses: docker/build-push-action@v6
  136. with:
  137. context: .
  138. labels: ${{ steps.meta.outputs.labels }}
  139. platforms: linux/${{ matrix.arch }}
  140. outputs: type=image,"name=${{ env.GHCR_REPO }}${{ env.DOCKERHUB_REPO && format(',{0}', env.DOCKERHUB_REPO) }}${{ env.ALIYUN_REPO && format(',{0}', env.ALIYUN_REPO) }}",name-canonical=true,push-by-digest=${{ github.event_name != 'pull_request' && github.actor != 'dependabot[bot]' }},push=${{ github.event_name != 'pull_request' && github.actor != 'dependabot[bot]' }}
  141. - name: Export digest
  142. run: |
  143. mkdir -p ${{ runner.temp }}/digests
  144. digest="${{ steps.build.outputs.digest }}"
  145. touch "${{ runner.temp }}/digests/${digest#sha256:}"
  146. - name: Upload digest
  147. uses: actions/upload-artifact@v4
  148. with:
  149. name: digests-${{ matrix.arch }}
  150. path: ${{ runner.temp }}/digests/*
  151. if-no-files-found: error
  152. retention-days: 1
  153. release-docker-images:
  154. name: Push Docker Images
  155. needs: build-docker-images
  156. runs-on: ubuntu-24.04
  157. if: ${{ github.event_name != 'pull_request' && github.actor != 'dependabot[bot]' }}
  158. steps:
  159. - name: Login to GitHub Container Registry
  160. uses: docker/login-action@v3
  161. with:
  162. registry: ghcr.io
  163. username: ${{ github.actor }}
  164. password: ${{ secrets.GITHUB_TOKEN }}
  165. - name: Login to DockerHub
  166. uses: docker/login-action@v3
  167. if: ${{ env.DOCKERHUB_REPO }}
  168. with:
  169. username: ${{ secrets.DOCKERHUB_USERNAME }}
  170. password: ${{ secrets.DOCKERHUB_TOKEN }}
  171. - name: Login to Aliyun Registry
  172. uses: docker/login-action@v3
  173. if: ${{ env.ALIYUN_REGISTRY }}
  174. with:
  175. registry: ${{ env.ALIYUN_REGISTRY }}
  176. username: ${{ secrets.ALIYUN_USERNAME }}
  177. password: ${{ secrets.ALIYUN_PASSWORD }}
  178. - name: Download digests
  179. uses: actions/download-artifact@v4
  180. with:
  181. path: ${{ runner.temp }}/digests
  182. pattern: digests-*
  183. merge-multiple: true
  184. - name: Set up Docker Buildx
  185. uses: docker/setup-buildx-action@v3
  186. - name: Extract metadata (tags, labels) for Docker
  187. id: meta
  188. uses: docker/metadata-action@v5
  189. with:
  190. images: |
  191. ${{ env.DOCKERHUB_REPO }}
  192. ${{ env.GHCR_REPO }}
  193. ${{ env.ALIYUN_REPO }}
  194. tags: |
  195. type=ref,event=branch
  196. type=ref,event=pr
  197. type=ref,event=tag
  198. type=semver,pattern={{version}}
  199. type=semver,pattern={{major}}.{{minor}}
  200. type=semver,pattern={{major}}
  201. type=sha
  202. - name: Create manifest list and push
  203. working-directory: ${{ runner.temp }}/digests
  204. run: |
  205. docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
  206. $(printf '${{ env.GHCR_REPO }}@sha256:%s ' *)
  207. - name: Inspect image
  208. run: |
  209. docker buildx imagetools inspect ${{ env.GHCR_REPO }}:${{ steps.meta.outputs.version }}