| name: Release builds (Docker) |
|
|
| on: |
| workflow_dispatch: |
| inputs: |
| manual_tag: |
| description: 'Tag name (like v0.1.0). Required if as_latest is true.' |
| required: false |
| type: string |
| as_latest: |
| description: 'Tag as latest?' |
| required: true |
| default: 'false' |
| type: choice |
| options: |
| - 'true' |
| - 'false' |
| push: |
| tags: |
| - 'v*' |
|
|
| concurrency: |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} |
| cancel-in-progress: true |
|
|
| env: |
| DOCKERHUB_ORG_NAME: ${{ vars.DOCKERHUB_ORG_NAME || 'openlistteam' }} |
| GHCR_ORG_NAME: ${{ vars.GHCR_ORG_NAME || 'openlistteam' }} |
| IMAGE_NAME: openlist-git |
| IMAGE_NAME_DOCKERHUB: openlist |
| REGISTRY: ghcr.io |
| ARTIFACT_NAME: 'binaries_docker_release' |
| ARTIFACT_NAME_LITE: 'binaries_docker_release_lite' |
| RELEASE_PLATFORMS: 'linux/amd64,linux/arm64,linux/arm/v7,linux/386,linux/arm/v6,linux/ppc64le,linux/riscv64,linux/loong64' |
| IMAGE_PUSH: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' }} |
|
|
| permissions: |
| packages: write |
|
|
| jobs: |
| build_binary: |
| name: Build Binaries for Docker Release |
| runs-on: ubuntu-latest |
| steps: |
| - name: Checkout |
| uses: actions/checkout@v6 |
|
|
| - uses: actions/setup-go@v5 |
| with: |
| go-version: '1.25.0' |
|
|
| - name: Cache Musl |
| id: cache-musl |
| uses: actions/cache@v4 |
| with: |
| path: build/musl-libs |
| key: docker-musl-libs-v2 |
|
|
| - name: Download Musl Library |
| if: steps.cache-musl.outputs.cache-hit != 'true' |
| run: bash build.sh prepare docker-multiplatform |
| env: |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
|
|
| - name: Build go binary (release) |
| run: bash build.sh release docker-multiplatform |
| env: |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| FRONTEND_REPO: ${{ vars.FRONTEND_REPO }} |
|
|
| - name: Upload artifacts |
| uses: actions/upload-artifact@v4 |
| with: |
| name: ${{ env.ARTIFACT_NAME }} |
| overwrite: true |
| path: | |
| build/ |
| !build/*.tgz |
| !build/musl-libs/** |
| |
| build_binary_lite: |
| name: Build Binaries for Docker Release (Lite) |
| runs-on: ubuntu-latest |
| steps: |
| - name: Checkout |
| uses: actions/checkout@v6 |
|
|
| - uses: actions/setup-go@v5 |
| with: |
| go-version: '1.25.0' |
|
|
| - name: Cache Musl |
| id: cache-musl |
| uses: actions/cache@v4 |
| with: |
| path: build/musl-libs |
| key: docker-musl-libs-v2 |
|
|
| - name: Download Musl Library |
| if: steps.cache-musl.outputs.cache-hit != 'true' |
| run: bash build.sh prepare lite docker-multiplatform |
| env: |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
|
|
| - name: Build go binary (release) |
| run: bash build.sh release lite docker-multiplatform |
| env: |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| FRONTEND_REPO: ${{ vars.FRONTEND_REPO }} |
|
|
| - name: Upload artifacts |
| uses: actions/upload-artifact@v4 |
| with: |
| name: ${{ env.ARTIFACT_NAME_LITE }} |
| overwrite: true |
| path: | |
| build/ |
| !build/*.tgz |
| !build/musl-libs/** |
| |
| release_docker: |
| needs: build_binary |
| name: Release Docker image |
| runs-on: ubuntu-latest |
| strategy: |
| matrix: |
| image: ["latest", "ffmpeg", "aria2", "aio"] |
| include: |
| - image: "latest" |
| base_image_tag: "base" |
| build_arg: "" |
| tag_favor: "" |
| - image: "ffmpeg" |
| base_image_tag: "ffmpeg" |
| build_arg: INSTALL_FFMPEG=true |
| tag_favor: "suffix=-ffmpeg,onlatest=true" |
| - image: "aria2" |
| base_image_tag: "aria2" |
| build_arg: INSTALL_ARIA2=true |
| tag_favor: "suffix=-aria2,onlatest=true" |
| - image: "aio" |
| base_image_tag: "aio" |
| build_arg: | |
| INSTALL_FFMPEG=true |
| INSTALL_ARIA2=true |
| tag_favor: "suffix=-aio,onlatest=true" |
| steps: |
| - name: Checkout |
| uses: actions/checkout@v6 |
| - uses: actions/download-artifact@v4 |
| with: |
| name: ${{ env.ARTIFACT_NAME }} |
| path: 'build/' |
|
|
| - name: Set up QEMU |
| uses: docker/setup-qemu-action@v3 |
|
|
| - name: Set up Docker Buildx |
| uses: docker/setup-buildx-action@v3 |
|
|
| - name: Login to GitHub Container Registry |
| if: env.IMAGE_PUSH == 'true' |
| uses: docker/login-action@v3 |
| with: |
| registry: ${{ env.REGISTRY }} |
| username: ${{ github.actor }} |
| password: ${{ secrets.GITHUB_TOKEN }} |
|
|
| - name: Login to DockerHub Container Registry |
| if: env.IMAGE_PUSH == 'true' |
| uses: docker/login-action@v3 |
| with: |
| username: ${{ vars.DOCKERHUB_ORG_NAME_BACKUP || env.DOCKERHUB_ORG_NAME }} |
| password: ${{ secrets.DOCKERHUB_TOKEN }} |
|
|
| - name: Docker meta |
| id: meta |
| uses: docker/metadata-action@v5 |
| with: |
| images: | |
| ${{ env.REGISTRY }}/${{ env.GHCR_ORG_NAME }}/${{ env.IMAGE_NAME }} |
| ${{ env.DOCKERHUB_ORG_NAME }}/${{ env.IMAGE_NAME_DOCKERHUB }} |
| tags: > |
| ${{ github.event_name == 'workflow_dispatch' |
| && format('type=raw,value={0}', github.event.inputs.manual_tag) |
| || format('type=raw,value={0}', github.ref_name) }} |
| flavor: | |
| latest=${{ github.event_name == 'push' || github.event.inputs.as_latest == 'true' }} |
| ${{ matrix.tag_favor }} |
| |
| - name: Build and push |
| id: docker_build |
| uses: docker/build-push-action@v6 |
| with: |
| context: . |
| file: Dockerfile.ci |
| push: ${{ env.IMAGE_PUSH == 'true' }} |
| build-args: | |
| BASE_IMAGE_TAG=${{ matrix.base_image_tag }} |
| ${{ matrix.build_arg }} |
| tags: ${{ steps.meta.outputs.tags }} |
| labels: ${{ steps.meta.outputs.labels }} |
| platforms: ${{ env.RELEASE_PLATFORMS }} |
|
|
| release_docker_lite: |
| needs: build_binary_lite |
| name: Release Docker image (Lite) |
| runs-on: ubuntu-latest |
| strategy: |
| matrix: |
| image: ["latest", "ffmpeg", "aria2", "aio"] |
| include: |
| - image: "latest" |
| base_image_tag: "base" |
| build_arg: "" |
| tag_favor: "suffix=-lite,onlatest=true" |
| - image: "ffmpeg" |
| base_image_tag: "ffmpeg" |
| build_arg: INSTALL_FFMPEG=true |
| tag_favor: "suffix=-lite-ffmpeg,onlatest=true" |
| - image: "aria2" |
| base_image_tag: "aria2" |
| build_arg: INSTALL_ARIA2=true |
| tag_favor: "suffix=-lite-aria2,onlatest=true" |
| - image: "aio" |
| base_image_tag: "aio" |
| build_arg: | |
| INSTALL_FFMPEG=true |
| INSTALL_ARIA2=true |
| tag_favor: "suffix=-lite-aio,onlatest=true" |
| steps: |
| - name: Checkout |
| uses: actions/checkout@v6 |
| - uses: actions/download-artifact@v4 |
| with: |
| name: ${{ env.ARTIFACT_NAME_LITE }} |
| path: 'build/' |
|
|
| - name: Set up QEMU |
| uses: docker/setup-qemu-action@v3 |
|
|
| - name: Set up Docker Buildx |
| uses: docker/setup-buildx-action@v3 |
|
|
| - name: Login to GitHub Container Registry |
| if: env.IMAGE_PUSH == 'true' |
| uses: docker/login-action@v3 |
| with: |
| registry: ${{ env.REGISTRY }} |
| username: ${{ github.actor }} |
| password: ${{ secrets.GITHUB_TOKEN }} |
|
|
| - name: Login to DockerHub Container Registry |
| if: env.IMAGE_PUSH == 'true' |
| uses: docker/login-action@v3 |
| with: |
| username: ${{ vars.DOCKERHUB_ORG_NAME_BACKUP || env.DOCKERHUB_ORG_NAME }} |
| password: ${{ secrets.DOCKERHUB_TOKEN }} |
|
|
| - name: Docker meta |
| id: meta |
| uses: docker/metadata-action@v5 |
| with: |
| images: | |
| ${{ env.REGISTRY }}/${{ env.GHCR_ORG_NAME }}/${{ env.IMAGE_NAME }} |
| ${{ env.DOCKERHUB_ORG_NAME }}/${{ env.IMAGE_NAME_DOCKERHUB }} |
| tags: > |
| ${{ github.event_name == 'workflow_dispatch' |
| && format('type=raw,value={0}', github.event.inputs.manual_tag) |
| || format('type=raw,value={0}', github.ref_name) }} |
| flavor: | |
| latest=${{ github.event_name == 'push' || github.event.inputs.as_latest == 'true' }} |
| ${{ matrix.tag_favor }} |
| |
| - name: Build and push |
| id: docker_build |
| uses: docker/build-push-action@v6 |
| with: |
| context: . |
| file: Dockerfile.ci |
| push: ${{ env.IMAGE_PUSH == 'true' }} |
| build-args: | |
| BASE_IMAGE_TAG=${{ matrix.base_image_tag }} |
| ${{ matrix.build_arg }} |
| tags: ${{ steps.meta.outputs.tags }} |
| labels: ${{ steps.meta.outputs.labels }} |
| platforms: ${{ env.RELEASE_PLATFORMS }} |
|
|