Merge pull request #3070 from fzyzcjy/feat/arm_macos #17
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: Publish Dev Docker Image | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| publish: | |
| description: 'Publish the image to Docker Hub' | |
| required: true | |
| default: true | |
| type: boolean | |
| push: | |
| branches: | |
| - master | |
| paths: | |
| - '.devcontainer/Dockerfile' | |
| - '.github/workflows/publish_dev_docker.yaml' | |
| env: | |
| IMAGE_NAME: fzyzcjy/flutter_rust_bridge_dev | |
| jobs: | |
| metadata: | |
| name: Compute image metadata | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| outputs: | |
| flutter_version: ${{ steps.metadata.outputs.flutter_version }} | |
| rust_version: ${{ steps.metadata.outputs.rust_version }} | |
| rust_nightly_version: ${{ steps.metadata.outputs.rust_nightly_version }} | |
| version_tag: ${{ steps.metadata.outputs.version_tag }} | |
| sha_tag: ${{ steps.metadata.outputs.sha_tag }} | |
| should_publish: ${{ steps.metadata.outputs.should_publish }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v5 | |
| - name: Compute tags from Dockerfile | |
| id: metadata | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| flutter_version="$(awk -F= '/^ARG FLUTTER_VERSION=/{print $2; exit}' .devcontainer/Dockerfile)" | |
| rust_version="$(awk -F= '/^ARG RUST_VERSION=/{print $2; exit}' .devcontainer/Dockerfile)" | |
| rust_nightly_version="$(awk -F= '/^ARG RUST_NIGHTLY_VERSION=/{print $2; exit}' .devcontainer/Dockerfile)" | |
| short_sha="${GITHUB_SHA::7}" | |
| version_tag="flutter-${flutter_version}-rust-${rust_version}-nightly-${rust_nightly_version}" | |
| sha_tag="sha-${short_sha}" | |
| if [[ "${{ github.event_name }}" == "push" || "${{ inputs.publish }}" == "true" ]]; then | |
| should_publish="true" | |
| else | |
| should_publish="false" | |
| fi | |
| { | |
| echo "flutter_version=${flutter_version}" | |
| echo "rust_version=${rust_version}" | |
| echo "rust_nightly_version=${rust_nightly_version}" | |
| echo "version_tag=${version_tag}" | |
| echo "sha_tag=${sha_tag}" | |
| echo "should_publish=${should_publish}" | |
| } >> "${GITHUB_OUTPUT}" | |
| build: | |
| name: Build and smoke test (${{ matrix.arch }}) | |
| needs: metadata | |
| runs-on: ${{ matrix.runner }} | |
| permissions: | |
| contents: read | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - arch: amd64 | |
| platform: linux/amd64 | |
| runner: ubuntu-latest | |
| - arch: arm64 | |
| platform: linux/arm64 | |
| runner: ubuntu-24.04-arm | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v5 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Log in to Docker Hub | |
| if: needs.metadata.outputs.should_publish == 'true' | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: docker.io | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Build local image for smoke test | |
| uses: docker/build-push-action@v6 | |
| with: | |
| context: .devcontainer | |
| file: .devcontainer/Dockerfile | |
| platforms: ${{ matrix.platform }} | |
| load: true | |
| push: false | |
| tags: frb-dev-image-smoke:${{ needs.metadata.outputs.sha_tag }}-${{ matrix.arch }} | |
| - name: Smoke test local image | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| docker run --rm --platform "${{ matrix.platform }}" "frb-dev-image-smoke:${{ needs.metadata.outputs.sha_tag }}-${{ matrix.arch }}" bash -lc ' | |
| set -euo pipefail | |
| flutter --version | |
| dart --version | |
| cargo --version | |
| rustup show | |
| rustup target list --toolchain nightly-${{ needs.metadata.outputs.rust_nightly_version }} --installed | |
| wasm-pack --version | |
| "${CHROME_BIN}" --version | |
| rustup target list --toolchain nightly-${{ needs.metadata.outputs.rust_nightly_version }} --installed | grep wasm32-unknown-unknown | |
| rustup show | grep "nightly-${{ needs.metadata.outputs.rust_nightly_version }}" | |
| ' | |
| - name: Push platform image to Docker Hub | |
| if: needs.metadata.outputs.should_publish == 'true' | |
| uses: docker/build-push-action@v6 | |
| with: | |
| context: .devcontainer | |
| file: .devcontainer/Dockerfile | |
| platforms: ${{ matrix.platform }} | |
| push: true | |
| tags: | | |
| ${{ env.IMAGE_NAME }}:${{ needs.metadata.outputs.sha_tag }}-${{ matrix.arch }} | |
| ${{ env.IMAGE_NAME }}:${{ needs.metadata.outputs.version_tag }}-${{ matrix.arch }} | |
| ${{ env.IMAGE_NAME }}:latest-${{ matrix.arch }} | |
| - name: Build workflow summary | |
| shell: bash | |
| run: | | |
| { | |
| echo "## Dev Docker Image ${{ matrix.arch }} Verified" | |
| echo | |
| echo "- Repository: \`${IMAGE_NAME}\`" | |
| echo "- Published platform image: \`${{ needs.metadata.outputs.should_publish }}\`" | |
| echo "- Platform: \`${{ matrix.platform }}\`" | |
| echo "- Flutter: \`${{ needs.metadata.outputs.flutter_version }}\`" | |
| echo "- Rust: \`${{ needs.metadata.outputs.rust_version }}\`" | |
| echo "- Rust nightly: \`${{ needs.metadata.outputs.rust_nightly_version }}\`" | |
| } >> "${GITHUB_STEP_SUMMARY}" | |
| publish_manifest: | |
| name: Publish multi-arch manifest | |
| needs: | |
| - metadata | |
| - build | |
| if: needs.metadata.outputs.should_publish == 'true' | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| steps: | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Log in to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: docker.io | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Publish multi-arch tags | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| docker buildx imagetools create \ | |
| -t "${IMAGE_NAME}:latest" \ | |
| -t "${IMAGE_NAME}:${{ needs.metadata.outputs.version_tag }}" \ | |
| -t "${IMAGE_NAME}:${{ needs.metadata.outputs.sha_tag }}" \ | |
| "${IMAGE_NAME}:${{ needs.metadata.outputs.sha_tag }}-amd64" \ | |
| "${IMAGE_NAME}:${{ needs.metadata.outputs.sha_tag }}-arm64" | |
| - name: Publish workflow summary | |
| shell: bash | |
| run: | | |
| { | |
| echo "## Dev Docker Image Published" | |
| echo | |
| echo "- Repository: \`${IMAGE_NAME}\`" | |
| echo "- Platforms: \`linux/amd64\`, \`linux/arm64\`" | |
| echo "- Flutter: \`${{ needs.metadata.outputs.flutter_version }}\`" | |
| echo "- Rust: \`${{ needs.metadata.outputs.rust_version }}\`" | |
| echo "- Rust nightly: \`${{ needs.metadata.outputs.rust_nightly_version }}\`" | |
| echo "- Tags:" | |
| echo " - \`latest\`" | |
| echo " - \`${{ needs.metadata.outputs.version_tag }}\`" | |
| echo " - \`${{ needs.metadata.outputs.sha_tag }}\`" | |
| } >> "${GITHUB_STEP_SUMMARY}" |