name: Release on: push: branches: - "**" tags: - "v*.*.*" paths-ignore: - "**/*.md" - "**/*.yaml" pull_request: branches: - "**" paths-ignore: - "**/*.md" - "**/*.yaml" env: DOCKERHUB_REPO: ${{ secrets.DOCKERHUB_REPO != '' && secrets.DOCKERHUB_REPO || secrets.DOCKERHUB_USERNAME != '' && format('{0}/{1}', secrets.DOCKERHUB_USERNAME, 'aiproxy') || '' }} GHCR_REPO: ghcr.io/${{ github.repository }} ALIYUN_REGISTRY: ${{ secrets.ALIYUN_REGISTRY }} ALIYUN_REPO: ${{ secrets.ALIYUN_REPO != '' && secrets.ALIYUN_REPO || (secrets.ALIYUN_REGISTRY != '' && secrets.ALIYUN_USERNAME != '') && format('{0}/{1}/{2}', secrets.ALIYUN_REGISTRY, secrets.ALIYUN_USERNAME, 'aiproxy') || '' }} jobs: release-web: name: Release Web runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v6 - name: Use Node.js 22 uses: actions/setup-node@v6 with: node-version: 22.x - name: Build working-directory: web run: | npm install -g pnpm pnpm install && pnpm run build - name: Upload Artifact uses: actions/upload-artifact@v5 with: name: web path: web/dist release: name: Release AI Proxy runs-on: ubuntu-24.04 needs: release-web permissions: contents: write strategy: fail-fast: false matrix: targets: - GOOS: linux GOARCH: arm64 - GOOS: linux GOARCH: amd64 - GOOS: darwin GOARCH: arm64 - GOOS: darwin GOARCH: amd64 - GOOS: windows GOARCH: amd64 EXT: .exe - GOOS: windows GOARCH: arm64 EXT: .exe steps: - name: Checkout uses: actions/checkout@v6 - uses: actions/download-artifact@v6 with: name: web path: core/public/dist - name: Setup Go uses: actions/setup-go@v6 with: go-version-file: "core/go.mod" - name: Generate Swagger working-directory: core run: bash scripts/swag.sh - name: Build working-directory: core run: | export GOOS=${{ matrix.targets.GOOS }} export GOARCH=${{ matrix.targets.GOARCH }} go build -trimpath -ldflags "-s -w" -o aiproxy-${{ matrix.targets.GOOS }}-${{ matrix.targets.GOARCH }}${{ matrix.targets.EXT }} - name: Get release meta id: release_meta if: ${{ startsWith(github.ref, 'refs/tags/') }} working-directory: core run: | version=${GITHUB_REF/refs\/tags\/v/} echo "version: ${version}" prerelease=$(echo ${version} | grep -E 'rc|beta|alpha|pre|dev|snapshot|nightly' || true) release_name="Version ${version}" echo "release_name: ${release_name}" if [ -n "${prerelease}" ]; then prerelease=true release_name="${release_name} (Prerelease)" else prerelease=false fi tag_name="v${version}" echo "prerelease: ${prerelease}" echo "tag_name: ${tag_name}" echo "PRERELEASE=${prerelease}" >> $GITHUB_OUTPUT echo "RELEASE_NAME=${release_name}" >> $GITHUB_OUTPUT echo "TAG_NAME=${tag_name}" >> $GITHUB_OUTPUT - name: Release uses: softprops/action-gh-release@v2 if: ${{ startsWith(github.ref, 'refs/tags/') }} with: token: ${{ secrets.GITHUB_TOKEN }} draft: false prerelease: ${{ steps.release_meta.outputs.PRERELEASE }} append_body: false fail_on_unmatched_files: true name: ${{ steps.release_meta.outputs.RELEASE_NAME }} tag_name: ${{ steps.release_meta.outputs.TAG_NAME }} files: | core/aiproxy-${{ matrix.targets.GOOS }}-${{ matrix.targets.GOARCH }}${{ matrix.targets.EXT }} build-docker-images: name: Build Docker Images permissions: packages: write strategy: matrix: include: - arch: amd64 - arch: arm64 runs-on: ubuntu-24.04-arm runs-on: ${{ matrix.runs-on || 'ubuntu-24.04' }} steps: - name: Login to GitHub Container Registry if: ${{ github.event_name != 'pull_request' && github.actor != 'dependabot[bot]' }} uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Login to DockerHub uses: docker/login-action@v3 if: ${{ github.event_name != 'pull_request' && github.actor != 'dependabot[bot]' && env.DOCKERHUB_REPO }} with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to Aliyun Registry uses: docker/login-action@v3 if: ${{ github.event_name != 'pull_request' && github.actor != 'dependabot[bot]' && env.ALIYUN_REGISTRY }} with: registry: ${{ env.ALIYUN_REGISTRY }} username: ${{ secrets.ALIYUN_USERNAME }} password: ${{ secrets.ALIYUN_PASSWORD }} - name: Checkout uses: actions/checkout@v6 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@v5 with: images: | ${{ env.DOCKERHUB_REPO }} ${{ env.GHCR_REPO }} ${{ env.ALIYUN_REPO }} - name: Build for ${{ matrix.arch }} id: build uses: docker/build-push-action@v6 with: context: . labels: ${{ steps.meta.outputs.labels }} platforms: linux/${{ matrix.arch }} 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]' }} - name: Export digest working-directory: core run: | mkdir -p ${{ runner.temp }}/digests digest="${{ steps.build.outputs.digest }}" touch "${{ runner.temp }}/digests/${digest#sha256:}" - name: Upload digest uses: actions/upload-artifact@v5 with: name: digests-${{ matrix.arch }} path: ${{ runner.temp }}/digests/* if-no-files-found: error retention-days: 1 release-docker-images: name: Push Docker Images permissions: packages: write needs: build-docker-images runs-on: ubuntu-24.04 if: ${{ github.event_name != 'pull_request' && github.actor != 'dependabot[bot]' }} steps: - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Login to DockerHub uses: docker/login-action@v3 if: ${{ env.DOCKERHUB_REPO }} with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to Aliyun Registry uses: docker/login-action@v3 if: ${{ env.ALIYUN_REGISTRY }} with: registry: ${{ env.ALIYUN_REGISTRY }} username: ${{ secrets.ALIYUN_USERNAME }} password: ${{ secrets.ALIYUN_PASSWORD }} - name: Download digests uses: actions/download-artifact@v6 with: path: ${{ runner.temp }}/digests pattern: digests-* merge-multiple: true - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@v5 with: images: | ${{ env.DOCKERHUB_REPO }} ${{ env.GHCR_REPO }} ${{ env.ALIYUN_REPO }} tags: | type=ref,event=branch type=ref,event=pr type=ref,event=tag type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} type=sha - name: Create manifest list and push working-directory: ${{ runner.temp }}/digests run: | for TAG in $DOCKER_METADATA_OUTPUT_TAGS; do docker buildx imagetools create -t $TAG \ $(printf '${{ env.GHCR_REPO }}@sha256:%s ' *) sleep 5 done - name: Inspect image run: | docker buildx imagetools inspect ${{ env.GHCR_REPO }}:${{ steps.meta.outputs.version }} release-sealos-images: name: Push Sealos Images permissions: packages: write needs: release-docker-images runs-on: ubuntu-24.04 if: ${{ github.event_name != 'pull_request' && github.actor != 'dependabot[bot]' }} steps: - name: Checkout uses: actions/checkout@v6 - name: install cache images tools run: | sudo bash ./.github/scripts/install.sh - name: Set up QEMU uses: docker/setup-qemu-action@v3 - uses: docker/setup-buildx-action@v3 - name: Prepare cluster image list id: cluster_image_targets run: | set -euo pipefail images=("${GHCR_REPO}-cluster") if [ -n "${DOCKERHUB_REPO}" ]; then images+=("${DOCKERHUB_REPO}-cluster") fi if [ -n "${ALIYUN_REPO}" ]; then images+=("${ALIYUN_REPO}-cluster") fi { echo "images<> "${GITHUB_OUTPUT}" - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@v5 with: images: ${{ steps.cluster_image_targets.outputs.images }} tags: | type=ref,event=branch type=ref,event=pr type=ref,event=tag type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} type=sha - name: cache images working-directory: core/deploy run: | sudo sealos login -u "${{ github.repository_owner }}" -p "${{ secrets.GITHUB_TOKEN }}" ghcr.io sed -i "s#image: ghcr.io/labring/aiproxy:latest#image: ${{ env.GHCR_REPO }}:${{ steps.meta.outputs.version }}#g" charts/aiproxy/values.yaml sudo sealos registry save --registry-dir=registry_amd64 --arch amd64 . sudo sealos registry save --registry-dir=registry_arm64 --arch arm64 . - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Login to DockerHub uses: docker/login-action@v3 if: ${{ env.DOCKERHUB_REPO }} with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to Aliyun Registry uses: docker/login-action@v3 if: ${{ env.ALIYUN_REGISTRY }} with: registry: ${{ env.ALIYUN_REGISTRY }} username: ${{ secrets.ALIYUN_USERNAME }} password: ${{ secrets.ALIYUN_PASSWORD }} - name: Build images uses: docker/build-push-action@v6 with: context: ./core/deploy file: ./core/deploy/Kubefile labels: ${{ steps.meta.outputs.labels }} platforms: linux/amd64,linux/arm64 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }}