Build and Push Docker Image #97
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build and Push Docker Image | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| build_type: | |
| description: 'Build type' | |
| required: true | |
| type: choice | |
| options: | |
| - stage-0 | |
| - dev | |
| - release | |
| version: | |
| description: 'Version tag (for main image)' | |
| required: false | |
| default: 'latest' | |
| type: string | |
| platforms: | |
| description: 'Target platforms' | |
| required: false | |
| default: 'linux/amd64,linux/arm64,linux/arm/v7' | |
| type: string | |
| enable_aliyun: | |
| description: 'Push to Aliyun Registry' | |
| required: false | |
| default: true | |
| type: boolean | |
| env: | |
| DOCKERHUB_REGISTRY: docker.io | |
| ALIYUN_REGISTRY: registry.cn-hangzhou.aliyuncs.com | |
| STAGE0_IMAGE: kvmd-stage-0 | |
| MAIN_IMAGE: kvmd | |
| jobs: | |
| build-stage-0: | |
| runs-on: ubuntu-22.04 | |
| if: github.event.inputs.build_type == 'stage-0' | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| with: | |
| driver: docker-container | |
| platforms: ${{ github.event.inputs.platforms }} | |
| - name: Set up QEMU | |
| uses: docker/setup-qemu-action@v3 | |
| with: | |
| platforms: all | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ${{ env.DOCKERHUB_REGISTRY }} | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Login to Aliyun Registry | |
| if: github.event.inputs.enable_aliyun == 'true' | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ${{ env.ALIYUN_REGISTRY }} | |
| username: ${{ secrets.ALIYUN_USERNAME }} | |
| password: ${{ secrets.ALIYUN_PASSWORD }} | |
| - name: Extract metadata | |
| id: meta | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: | | |
| silentwind0/${{ env.STAGE0_IMAGE }} | |
| ${{ github.event.inputs.enable_aliyun == 'true' && format('{0}/silentwind/{1}', env.ALIYUN_REGISTRY, env.STAGE0_IMAGE) || '' }} | |
| tags: | | |
| type=raw,value=latest | |
| type=raw,value=latest-{{date 'YYYYMMDD-HHmmss'}} | |
| type=sha,prefix={{branch}}- | |
| labels: | | |
| org.opencontainers.image.title=One-KVM Stage-0 Base Image | |
| org.opencontainers.image.description=Base image for One-KVM build environment | |
| org.opencontainers.image.vendor=One-KVM Project | |
| - name: Build and push stage-0 image | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| file: ./build/Dockerfile-stage-0 | |
| platforms: ${{ github.event.inputs.platforms }} | |
| push: true | |
| tags: ${{ steps.meta.outputs.tags }} | |
| labels: ${{ steps.meta.outputs.labels }} | |
| cache-from: type=gha,scope=stage-0 | |
| cache-to: type=gha,mode=max,scope=stage-0 | |
| provenance: false | |
| sbom: false | |
| allow: security.insecure | |
| build-main: | |
| runs-on: ubuntu-22.04 | |
| if: github.event.inputs.build_type != 'stage-0' | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| with: | |
| driver: docker-container | |
| platforms: ${{ github.event.inputs.platforms }} | |
| - name: Set up QEMU | |
| uses: docker/setup-qemu-action@v3 | |
| with: | |
| platforms: all | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ${{ env.DOCKERHUB_REGISTRY }} | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Login to Aliyun Registry | |
| if: github.event.inputs.enable_aliyun == 'true' | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ${{ env.ALIYUN_REGISTRY }} | |
| username: ${{ secrets.ALIYUN_USERNAME }} | |
| password: ${{ secrets.ALIYUN_PASSWORD }} | |
| - name: Set version tag | |
| id: version | |
| run: | | |
| if [[ "${{ github.event.inputs.build_type }}" == "dev" ]]; then | |
| echo "tag=dev" >> $GITHUB_OUTPUT | |
| elif [[ "${{ github.event.inputs.build_type }}" == "release" ]]; then | |
| echo "tag=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Extract metadata | |
| id: meta | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: | | |
| silentwind0/${{ env.MAIN_IMAGE }} | |
| ${{ github.event.inputs.enable_aliyun == 'true' && format('{0}/silentwind/{1}', env.ALIYUN_REGISTRY, env.MAIN_IMAGE) || '' }} | |
| tags: | | |
| type=raw,value=${{ steps.version.outputs.tag }} | |
| type=raw,value=${{ steps.version.outputs.tag }}-{{date 'YYYYMMDD-HHmmss'}} | |
| type=sha,prefix={{branch}}- | |
| labels: | | |
| org.opencontainers.image.title=One-KVM | |
| org.opencontainers.image.description=DIY IP-KVM solution based on PiKVM | |
| org.opencontainers.image.vendor=One-KVM Project | |
| org.opencontainers.image.version=${{ steps.version.outputs.tag }} | |
| - name: Build and push main image | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| file: ./build/Dockerfile | |
| platforms: ${{ github.event.inputs.platforms }} | |
| push: true | |
| tags: ${{ steps.meta.outputs.tags }} | |
| labels: ${{ steps.meta.outputs.labels }} | |
| cache-from: type=gha,scope=main | |
| cache-to: type=gha,mode=max,scope=main | |
| provenance: false | |
| sbom: false | |
| - name: Build summary | |
| run: | | |
| echo "## Build Summary" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Build Type**: ${{ github.event.inputs.build_type }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Version Tag**: ${{ steps.version.outputs.tag }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Platforms**: ${{ github.event.inputs.platforms }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Aliyun Enabled**: ${{ github.event.inputs.enable_aliyun }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Tags**:" >> $GITHUB_STEP_SUMMARY | |
| echo "${{ steps.meta.outputs.tags }}" | sed 's/^/ - /' >> $GITHUB_STEP_SUMMARY |