Skip to content

Merge pull request #3070 from fzyzcjy/feat/arm_macos #17

Merge pull request #3070 from fzyzcjy/feat/arm_macos

Merge pull request #3070 from fzyzcjy/feat/arm_macos #17

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}"