diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index ecc098c3d..561181c74 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -2,19 +2,102 @@ name: Docker Image CI/CD on: push: + branches: + - master tags: - 'v*' workflow_dispatch: jobs: - publish-docker: + build-test-image: + if: github.event_name == 'push' && startsWith(github.ref, 'refs/heads/master') runs-on: ubuntu-latest + env: + DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }} + GHCR_OWNER: ${{ github.repository_owner }} + HAS_GHCR_TOKEN: ${{ secrets.GHCR_GITHUB_TOKEN != '' }} steps: - - name: Pull The Codes + - name: Checkout uses: actions/checkout@v5 with: - fetch-depth: 0 # Must be 0 so we can fetch tags + fetch-depth: 0 + + - name: Build Dashboard + run: | + cd dashboard + npm install + npm run build + mkdir -p dist/assets + echo $(git rev-parse HEAD) > dist/assets/version + cd .. + mkdir -p data + cp -r dashboard/dist data/ + + - name: Determine test image tags + id: test-meta + run: | + short_sha=$(echo "${GITHUB_SHA}" | cut -c1-12) + echo "short_sha=$short_sha" >> $GITHUB_OUTPUT + + - name: Set QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_PASSWORD }} + + - name: Login to GitHub Container Registry + if: env.HAS_GHCR_TOKEN == 'true' + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ env.GHCR_OWNER }} + password: ${{ secrets.GHCR_GITHUB_TOKEN }} + + - name: Build test image tags list + id: test-tags + run: | + TAGS="${{ env.DOCKER_HUB_USERNAME }}/astrbot:test-latest + ${{ env.DOCKER_HUB_USERNAME }}/astrbot:test-${{ steps.test-meta.outputs.short_sha }}" + if [ "${{ env.HAS_GHCR_TOKEN }}" = "true" ]; then + TAGS="$TAGS + ghcr.io/${{ env.GHCR_OWNER }}/astrbot:test-latest + ghcr.io/${{ env.GHCR_OWNER }}/astrbot:test-${{ steps.test-meta.outputs.short_sha }}" + fi + echo "tags<> $GITHUB_OUTPUT + echo "$TAGS" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + - name: Build and Push Test Image + uses: docker/build-push-action@v6 + with: + context: . + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.test-tags.outputs.tags }} + + - name: Post build notifications + run: echo "Test Docker image has been built and pushed successfully" + + build-release-image: + if: github.event_name == 'workflow_dispatch' || (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')) + runs-on: ubuntu-latest + env: + DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }} + GHCR_OWNER: ${{ github.repository_owner }} + HAS_GHCR_TOKEN: ${{ secrets.GHCR_GITHUB_TOKEN != '' }} + + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + fetch-depth: 0 - name: Get latest tag (only on manual trigger) id: get-latest-tag @@ -27,21 +110,22 @@ jobs: if: github.event_name == 'workflow_dispatch' run: git checkout ${{ steps.get-latest-tag.outputs.latest_tag }} - - name: Check if version is pre-release - id: check-prerelease + - name: Compute release metadata + id: release-meta run: | - if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then version="${{ steps.get-latest-tag.outputs.latest_tag }}" else - version="${{ github.ref_name }}" + version="${GITHUB_REF#refs/tags/}" fi if [[ "$version" == *"beta"* ]] || [[ "$version" == *"alpha"* ]]; then echo "is_prerelease=true" >> $GITHUB_OUTPUT - echo "Version $version is a pre-release, will not push latest tag" + echo "Version $version marked as pre-release" else echo "is_prerelease=false" >> $GITHUB_OUTPUT - echo "Version $version is a stable release, will push latest tag" + echo "Version $version marked as stable" fi + echo "version=$version" >> $GITHUB_OUTPUT - name: Build Dashboard run: | @@ -67,23 +151,24 @@ jobs: password: ${{ secrets.DOCKER_HUB_PASSWORD }} - name: Login to GitHub Container Registry + if: env.HAS_GHCR_TOKEN == 'true' uses: docker/login-action@v3 with: registry: ghcr.io - username: Soulter + username: ${{ env.GHCR_OWNER }} password: ${{ secrets.GHCR_GITHUB_TOKEN }} - - name: Build and Push Docker to DockerHub and Github GHCR + - name: Build and Push Release Image uses: docker/build-push-action@v6 with: context: . platforms: linux/amd64,linux/arm64 push: true tags: | - ${{ steps.check-prerelease.outputs.is_prerelease == 'false' && format('{0}/astrbot:latest', secrets.DOCKER_HUB_USERNAME) || '' }} - ${{ secrets.DOCKER_HUB_USERNAME }}/astrbot:${{ github.event_name == 'workflow_dispatch' && steps.get-latest-tag.outputs.latest_tag || github.ref_name }} - ${{ steps.check-prerelease.outputs.is_prerelease == 'false' && 'ghcr.io/soulter/astrbot:latest' || '' }} - ghcr.io/soulter/astrbot:${{ github.event_name == 'workflow_dispatch' && steps.get-latest-tag.outputs.latest_tag || github.ref_name }} + ${{ steps.release-meta.outputs.is_prerelease == 'false' && format('{0}/astrbot:latest', env.DOCKER_HUB_USERNAME) || '' }} + ${{ steps.release-meta.outputs.is_prerelease == 'false' && env.HAS_GHCR_TOKEN == 'true' && format('ghcr.io/{0}/astrbot:latest', env.GHCR_OWNER) || '' }} + ${{ format('{0}/astrbot:{1}', env.DOCKER_HUB_USERNAME, steps.release-meta.outputs.version) }} + ${{ env.HAS_GHCR_TOKEN == 'true' && format('ghcr.io/{0}/astrbot:{1}', env.GHCR_OWNER, steps.release-meta.outputs.version) || '' }} - name: Post build notifications - run: echo "Docker image has been built and pushed successfully" + run: echo "Release Docker image has been built and pushed successfully" diff --git a/README.md b/README.md index 2d698c3da..fb6ed5aeb 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ AstrBot 是一个开源的一站式 Agent 聊天机器人平台及开发框架 4. **插件扩展**。深度优化的插件机制,支持[开发插件](https://astrbot.app/dev/plugin.html)扩展功能,社区插件生态丰富。 5. **WebUI**。可视化配置和管理机器人,功能齐全。 -## 部署方式 +## 部署方式 #### Docker 部署(推荐 🥳)