Upgrade to medea-flutter-webrtc
0.12.0
#2405
Workflow file for this run
This file contains 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: CI | |
on: | |
push: | |
branches: ["master"] | |
tags: ["medea-*"] | |
pull_request: | |
branches: ["master"] | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
env: | |
CACHE: ${{ !contains(github.event.head_commit.message, '[fresh ci]') }} | |
MEDEA_TAG: edge | |
PROTOC_VER: 23.x | |
RUST_BACKTRACE: 1 | |
jobs: | |
################ | |
# Pull Request # | |
################ | |
pr: | |
if: ${{ github.event_name == 'pull_request' }} | |
needs: | |
- build-jason | |
- build-jason-linux | |
- clippy | |
- dartanalyze | |
- dartfmt | |
- docker | |
- helm-lint | |
- rustdoc | |
- rustfmt | |
- test | |
- test-e2e-browser | |
- test-e2e-native | |
- test-flutter | |
runs-on: ubuntu-latest | |
steps: | |
- run: true | |
########################## | |
# Linting and formatting # | |
########################## | |
clippy: | |
strategy: | |
fail-fast: false | |
matrix: | |
platform: | |
#- android TODO: Re-enable once fixed in `cargo-ndk`. | |
- ios | |
- linux | |
- macos | |
- web | |
- windows | |
- workspace | |
runs-on: ${{ (contains('ios macos', matrix.platform) && 'macos-latest') | |
|| (matrix.platform == 'windows' && 'windows-latest') | |
|| (matrix.platform == 'linux' && 'ubuntu-22.04') | |
|| 'ubuntu-latest' }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: dtolnay/rust-toolchain@v1 | |
with: | |
toolchain: stable | |
components: clippy | |
- run: make rustup.targets only=${{ matrix.platform }} | |
if: ${{ matrix.platform != 'workspace' }} | |
- uses: Swatinem/rust-cache@v2 | |
if: ${{ env.CACHE == 'true' }} | |
- uses: actions-rs/install@v0.1 | |
with: | |
crate: cargo-ndk | |
use-tool-cache: true | |
if: ${{ matrix.platform == 'android' }} | |
- run: make cargo.lint platform=${{ matrix.platform }} | |
if: ${{ matrix.platform != 'workspace' }} | |
- uses: arduino/setup-protoc@v3 | |
with: | |
version: ${{ env.PROTOC_VER }} | |
repo-token: ${{ secrets.GITHUB_TOKEN }} | |
if: ${{ matrix.platform == 'workspace' }} | |
- run: make cargo.lint workspace=yes | |
if: ${{ matrix.platform == 'workspace' }} | |
dartanalyze: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: subosito/flutter-action@v2 | |
- run: make flutter | |
- run: make flutter.lint | |
dartfmt: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: subosito/flutter-action@v2 | |
- run: make flutter.fmt check=yes | |
helm-lint: | |
name: helm lint | |
if: ${{ github.ref == 'refs/heads/master' | |
|| !startsWith(github.ref, 'refs/tags/medea-') }} | |
strategy: | |
matrix: | |
chart: ["medea-demo"] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: azure/setup-helm@v4 | |
- run: make helm.lint chart=${{ matrix.chart }} | |
rustfmt: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: dtolnay/rust-toolchain@v1 | |
with: | |
toolchain: nightly | |
components: rustfmt | |
- run: make cargo.fmt check=yes | |
########### | |
# Testing # | |
########### | |
test: | |
strategy: | |
matrix: | |
include: | |
- crate: medea-macro | |
features: ["all"] | |
- crate: medea-reactive | |
features: ["all"] | |
- crate: medea-client-api-proto | |
features: ["all"] | |
- crate: medea-control-api-proto | |
features: ["all"] | |
- crate: medea-control-api-proto | |
features: ["serde"] | |
- crate: medea-control-api-proto | |
features: ["client-api"] | |
- crate: medea-control-api-proto | |
features: ["client"] | |
- crate: medea-control-api-proto | |
features: ["server"] | |
- crate: medea-control-api-proto | |
features: ["direct"] | |
- crate: medea-control-api-proto | |
features: ["direct", "client"] | |
- crate: medea-control-api-proto | |
features: ["direct", "server"] | |
- crate: medea-control-api-proto | |
features: ["direct", "client", "server"] | |
- crate: medea-control-api-proto | |
features: ["grpc"] | |
- crate: medea-control-api-proto | |
features: ["grpc", "client"] | |
- crate: medea-control-api-proto | |
features: ["grpc", "server"] | |
- crate: medea-control-api-proto | |
features: ["grpc", "client", "server"] | |
- crate: medea-jason | |
browsers: ["chrome", "firefox"] | |
runs-on: ubuntu-latest | |
steps: | |
- id: skip | |
run: echo "no=${{ | |
startsWith(github.ref, format('refs/tags/{0}-', matrix.crate)) | |
|| !startsWith(github.ref, 'refs/tags/medea-') | |
}}" >> $GITHUB_OUTPUT | |
- uses: actions/checkout@v4 | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- uses: dtolnay/rust-toolchain@v1 | |
with: | |
toolchain: stable | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- run: rustup target add wasm32-unknown-unknown | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& matrix.crate == 'medea-jason' }} | |
- uses: Swatinem/rust-cache@v2 | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& env.CACHE == 'true' }} | |
- uses: arduino/setup-protoc@v3 | |
with: | |
version: ${{ env.PROTOC_VER }} | |
repo-token: ${{ secrets.GITHUB_TOKEN }} | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& matrix.crate == 'medea-control-api-proto' }} | |
- name: Parse wasm-bindgen-cli version from Cargo.lock | |
id: wasm-cli | |
run: echo "version=$(cargo pkgid wasm-bindgen | grep -o '#.*' | |
| grep -o '[0-9\.]*')" | |
>> $GITHUB_OUTPUT | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& matrix.crate == 'medea-jason' }} | |
- uses: actions-rs/install@v0.1 | |
with: | |
crate: wasm-bindgen-cli | |
version: ${{ steps.wasm-cli.outputs.version }} | |
use-tool-cache: true | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& matrix.crate == 'medea-jason' }} | |
- run: make test.unit crate=${{ matrix.crate }} browser=chrome | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& matrix.crate == 'medea-jason' | |
&& contains(matrix.browsers, 'chrome') }} | |
- run: make test.unit crate=${{ matrix.crate }} browser=firefox | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& matrix.crate == 'medea-jason' | |
&& contains(matrix.browsers, 'firefox') }} | |
- run: make test.unit crate=${{ matrix.crate }} | |
features=${{ join(matrix.features, ',') }} | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& matrix.crate != 'medea-jason' }} | |
test-e2e-browser: | |
name: test (E2E, chrome, firefox) | |
needs: ["docker"] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: dtolnay/rust-toolchain@v1 | |
with: | |
toolchain: stable | |
target: wasm32-unknown-unknown | |
- uses: arduino/setup-protoc@v3 | |
with: | |
version: ${{ env.PROTOC_VER }} | |
repo-token: ${{ secrets.GITHUB_TOKEN }} | |
- uses: Swatinem/rust-cache@v2 | |
if: ${{ env.CACHE == 'true' }} | |
- uses: satackey/action-docker-layer-caching@v0.0.11 | |
with: | |
key: test-e2e-browser-{hash} | |
restore-keys: test-e2e-browser- | |
continue-on-error: true | |
if: ${{ env.CACHE == 'true' }} | |
- uses: actions-rs/install@v0.1 | |
with: | |
crate: wasm-pack | |
use-tool-cache: true | |
- name: Download `medea-control-api-mock` Docker image | |
uses: actions/download-artifact@v4 | |
with: | |
name: docker-medea-control-api-mock-${{ github.run_number }} | |
path: .cache/ | |
- name: Unpack `medea-control-api-mock` Docker image | |
run: make docker.untar from-file=.cache/image.tar | |
- name: Login to Medea Docker registry | |
uses: docker/login-action@v3 | |
with: | |
registry: hub.instrumentisto.com | |
username: ${{ secrets.MEDEA_DOCKER_USER }} | |
password: ${{ secrets.MEDEA_DOCKER_PASS }} | |
- name: Pull edge Medea Docker image | |
run: docker pull hub.instrumentisto.com/streaming/medea:edge | |
if: ${{ env.MEDEA_TAG == 'edge' }} | |
- name: Pull review Medea Docker image | |
run: docker pull hub.instrumentisto.com/streaming/medea/review:${{ env.MEDEA_TAG }} | |
if: ${{ env.MEDEA_TAG != 'edge' }} | |
- name: Chrome (P2P mesh) | |
run: make test.e2e browser=chrome sfu=no | |
up=yes debug=no dockerized=yes | |
medea-tag=${{ env.MEDEA_TAG }} | |
control-tag=build-${{ github.run_number }} | |
- name: Chrome (SFU) | |
run: make test.e2e browser=chrome sfu=yes | |
up=yes debug=no dockerized=yes | |
medea-tag=${{ env.MEDEA_TAG }} | |
control-tag=build-${{ github.run_number }} | |
- name: Firefox (P2P mesh) | |
run: make test.e2e browser=firefox sfu=no | |
up=yes debug=no dockerized=yes | |
medea-tag=${{ env.MEDEA_TAG }} | |
control-tag=build-${{ github.run_number }} | |
- name: Firefox (SFU) | |
run: make test.e2e browser=firefox sfu=yes | |
up=yes debug=no dockerized=yes | |
medea-tag=${{ env.MEDEA_TAG }} | |
control-tag=build-${{ github.run_number }} | |
test-e2e-native: | |
name: test (E2E, ${{ matrix.platform }}) | |
needs: ["build-jason", "build-jason-linux", "docker"] | |
strategy: | |
fail-fast: false | |
matrix: | |
# TODO: Run E2E test on Windows | |
platform: | |
- android | |
#- ios # TODO: Re-enable once fixed stability on CI | |
- linux | |
#- macos # TODO: Re-enable once `colima start` failing fixed on CI | |
runs-on: ${{ (contains('ios macos', matrix.platform) && 'macos-12') | |
|| (matrix.platform == 'windows' && 'windows-latest') | |
|| 'ubuntu-latest' }} | |
steps: | |
- name: Enable KVM for Android HW acceleration | |
run: | | |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' \ | |
| sudo tee /etc/udev/rules.d/99-kvm4all.rules | |
sudo udevadm control --reload-rules | |
sudo udevadm trigger --name-match=kvm | |
if: ${{ matrix.platform == 'android' }} | |
- uses: actions/checkout@v4 | |
- uses: dtolnay/rust-toolchain@v1 | |
with: | |
toolchain: stable | |
- name: Setup Docker and Docker Compose | |
run: | | |
brew install colima docker docker-compose | |
colima start | |
if: ${{ contains('ios macos', matrix.platform) }} | |
- uses: subosito/flutter-action@v2 | |
- name: Install Flutter Linux dependencies | |
run: | | |
sudo apt-get update | |
sudo apt-get install -y \ | |
cmake \ | |
libgtk-3-dev liblzma-dev libpulse-dev \ | |
ninja-build pkg-config xvfb | |
if: ${{ matrix.platform == 'linux' }} | |
- uses: actions/setup-java@v4 | |
with: | |
distribution: temurin # Temurin is cached on GitHub Actions Runners. | |
java-version: 17 | |
cache: gradle | |
if: ${{ matrix.platform == 'android' }} | |
- name: Parse Android API versions | |
id: api-version | |
run: | | |
echo "min=$(make flutter.android.version.min)" \ | |
>> $GITHUB_OUTPUT | |
echo "target=$(make flutter.android.version.compile)" \ | |
>> $GITHUB_OUTPUT | |
if: ${{ matrix.platform == 'android' }} | |
- name: Start iOS simulator | |
id: simulator | |
uses: futureware-tech/simulator-action@v4 | |
with: | |
os_version: '>=13.0' | |
os: iOS | |
if: ${{ matrix.platform == 'ios' }} | |
- name: Download `medea-jason` lib | |
uses: actions/download-artifact@v4 | |
with: | |
name: build-jason-${{ matrix.platform }} | |
path: ${{ (matrix.platform == 'android' && './flutter/android/src/main/jniLibs') | |
|| (matrix.platform == 'ios' && './flutter/ios/lib/') | |
|| (matrix.platform == 'linux' && './flutter/linux/lib/') | |
|| (matrix.platform == 'macos' && './flutter/macos/lib/') | |
|| (matrix.platform == 'windows' && './flutter/windows/lib/') | |
|| './flutter/assets/pkg/' }} | |
- name: Download `medea-control-api-mock` Docker image | |
uses: actions/download-artifact@v4 | |
with: | |
name: docker-medea-control-api-mock-${{ github.run_number }} | |
path: .cache/ | |
- name: Unpack `medea-control-api-mock` Docker image | |
run: make docker.untar from-file=.cache/image.tar | |
- name: Login to Medea Docker registry | |
uses: docker/login-action@v3 | |
with: | |
registry: hub.instrumentisto.com | |
username: ${{ secrets.MEDEA_DOCKER_USER }} | |
password: ${{ secrets.MEDEA_DOCKER_PASS }} | |
- name: P2P mesh (android) | |
uses: reactivecircus/android-emulator-runner@v2 | |
with: | |
api-level: ${{ steps.api-version.outputs.target }} | |
arch: x86_64 | |
profile: pixel_2 | |
script: make test.e2e.native sfu=no up=yes debug=no dockerized=yes | |
medea-tag=${{ env.MEDEA_TAG }} | |
control-tag=build-${{ github.run_number }} | |
server=10.0.2.2 | |
if: ${{ matrix.platform == 'android' }} | |
- name: P2P mesh | |
run: ${{ (matrix.platform == 'linux' && 'xvfb-run -a') | |
|| '' }} | |
make test.e2e.native sfu=no | |
device=${{ (matrix.platform == 'ios' | |
&& steps.simulator.outputs.udid) | |
|| matrix.platform }} | |
up=yes debug=no dockerized=yes | |
medea-tag=${{ env.MEDEA_TAG }} | |
control-tag=build-${{ github.run_number }} | |
${{ (matrix.platform == 'ios' && 'server=127.0.0.1 background=yes') | |
|| '' }} | |
if: ${{ matrix.platform != 'android' }} | |
- name: SFU (android) | |
uses: reactivecircus/android-emulator-runner@v2 | |
with: | |
api-level: ${{ steps.api-version.outputs.target }} | |
arch: x86_64 | |
profile: pixel_2 | |
script: make test.e2e.native sfu=yes up=yes debug=no dockerized=yes | |
medea-tag=${{ env.MEDEA_TAG }} | |
control-tag=build-${{ github.run_number }} | |
server=10.0.2.2 | |
if: ${{ matrix.platform == 'android' }} | |
- name: SFU | |
run: ${{ (matrix.platform == 'linux' && 'xvfb-run -a') | |
|| '' }} | |
make test.e2e.native sfu=yes | |
device=${{ (matrix.platform == 'ios' | |
&& steps.simulator.outputs.udid) | |
|| matrix.platform }} | |
up=yes debug=no dockerized=yes | |
medea-tag=${{ env.MEDEA_TAG }} | |
control-tag=build-${{ github.run_number }} | |
${{ (matrix.platform == 'ios' && 'server=127.0.0.1 background=yes') | |
|| '' }} | |
if: ${{ matrix.platform != 'android' }} | |
test-flutter: | |
name: test (medea-jason, ${{ matrix.platform }}) | |
strategy: | |
fail-fast: false | |
matrix: | |
platform: | |
- android | |
- linux | |
- macos | |
- windows | |
runs-on: ${{ (contains('android linux', matrix.platform) && 'ubuntu-22.04') | |
|| (matrix.platform == 'windows' && 'windows-latest') | |
|| 'macos-13' }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: dtolnay/rust-toolchain@v1 | |
with: | |
toolchain: stable | |
- run: make rustup.targets only=${{ matrix.platform }} | |
- uses: Swatinem/rust-cache@v2 | |
if: ${{ env.CACHE == 'true' | |
&& matrix.platform != 'windows' }} | |
- uses: jlumbroso/free-disk-space@v1.3.1 | |
with: | |
android: false | |
swap-storage: false | |
tool-cache: false | |
if: ${{ matrix.platform == 'android' }} | |
- uses: actions/setup-java@v4 | |
with: | |
distribution: temurin # Temurin is cached on GitHub Actions Runners. | |
java-version: 17 | |
cache: gradle | |
if: ${{ matrix.platform == 'android' }} | |
- name: Enable KVM for Android HW acceleration | |
run: | | |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' \ | |
| sudo tee /etc/udev/rules.d/99-kvm4all.rules | |
sudo udevadm control --reload-rules | |
sudo udevadm trigger --name-match=kvm | |
if: ${{ matrix.platform == 'android' }} | |
- uses: actions-rs/install@v0.1 | |
with: | |
crate: cargo-ndk | |
use-tool-cache: true | |
if: ${{ matrix.platform == 'android' }} | |
- uses: subosito/flutter-action@v2 | |
- run: flutter config --enable-linux-desktop | |
if: ${{ matrix.platform == 'linux' }} | |
- name: Install Flutter Linux dependencies | |
run: | | |
sudo apt-get update | |
sudo apt-get install -y \ | |
cmake \ | |
libgtk-3-dev liblzma-dev libpulse-dev \ | |
ninja-build pkg-config xvfb | |
if: ${{ matrix.platform == 'linux' }} | |
- run: make cargo.build.jason platform=${{ matrix.platform }} | |
args="--features mockable" | |
${{ (matrix.platform == 'android' | |
&& 'targets=x86_64') | |
|| '' }} | |
- name: Parse Android API versions | |
id: api-version | |
run: | | |
echo "min=$(make flutter.android.version.min)" \ | |
>> $GITHUB_OUTPUT | |
echo "target=$(make flutter.android.version.compile)" \ | |
>> $GITHUB_OUTPUT | |
if: ${{ matrix.platform == 'android' }} | |
- name: Test on min Android API version | |
uses: reactivecircus/android-emulator-runner@v2 | |
with: | |
api-level: ${{ steps.api-version.outputs.min }} | |
arch: x86_64 | |
profile: pixel_2 | |
script: make test.flutter | |
if: ${{ matrix.platform == 'android' }} | |
- name: Test on target Android API version | |
uses: reactivecircus/android-emulator-runner@v2 | |
with: | |
api-level: ${{ steps.api-version.outputs.target }} | |
arch: x86_64 | |
profile: pixel_2 | |
script: make test.flutter | |
if: ${{ matrix.platform == 'android' }} | |
- run: ${{ (matrix.platform == 'linux' && 'xvfb-run -a') | |
|| '' }} | |
make test.flutter device=${{ matrix.platform }} | |
if: ${{ contains('linux macos windows', matrix.platform) }} | |
############ | |
# Building # | |
############ | |
build-jason: | |
name: build (medea-jason, ${{ matrix.platform }}) | |
strategy: | |
fail-fast: false | |
matrix: | |
platform: | |
- android | |
- ios | |
- macos | |
- web | |
- windows | |
runs-on: ${{ (contains('ios macos', matrix.platform) && 'macos-latest') | |
|| (matrix.platform == 'windows' && 'windows-latest') | |
|| 'ubuntu-latest' }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: dtolnay/rust-toolchain@v1 | |
with: | |
toolchain: stable | |
- run: make rustup.targets only=${{ matrix.platform }} | |
- uses: Swatinem/rust-cache@v2 | |
if: ${{ env.CACHE == 'true' }} | |
- uses: actions-rs/install@v0.1 | |
with: | |
crate: cargo-ndk | |
use-tool-cache: true | |
if: ${{ matrix.platform == 'android' }} | |
- uses: jetli/wasm-pack-action@v0.4.0 | |
if: ${{ matrix.platform == 'web' }} | |
- uses: dart-lang/setup-dart@v1 | |
if: ${{ matrix.platform == 'windows' }} | |
- run: make cargo.build.jason platform=${{ matrix.platform }} | |
dockerized=no debug=no | |
- run: make flutter.web.assets | |
if: ${{ matrix.platform == 'web' }} | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: build-jason-${{ matrix.platform }} | |
path: ${{ (matrix.platform == 'android' && './flutter/android/src/main/jniLibs') | |
|| (matrix.platform == 'ios' && './flutter/ios/lib/') | |
|| (matrix.platform == 'macos' && './flutter/macos/lib/') | |
|| (matrix.platform == 'windows' && './flutter/windows/lib/') | |
|| './flutter/assets/pkg/' }} | |
build-jason-linux: | |
name: build (medea-jason, linux) | |
runs-on: ubuntu-22.04 | |
# Pin glibc to 2.28 for better compatibility. | |
container: debian:buster | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install linux dependencies | |
run: | | |
apt update | |
apt install -y clang curl make xz-utils | |
- uses: dtolnay/rust-toolchain@v1 | |
with: | |
toolchain: stable | |
# Container doesn't pick `~` (tilde) in `PATH`. | |
- run: echo "$HOME/.cargo/bin" >> $GITHUB_PATH | |
- uses: Swatinem/rust-cache@v2 | |
if: ${{ env.CACHE == 'true' }} | |
- run: make cargo.build.jason platform=linux | |
dockerized=no debug=no | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: build-jason-linux | |
path: ./flutter/linux/lib/ | |
docker: | |
name: docker build | |
strategy: | |
matrix: | |
image: | |
- medea-control-api-mock | |
- medea-demo | |
- medea-demo-edge | |
runs-on: ubuntu-latest | |
steps: | |
- id: skip | |
run: echo "no=${{ (matrix.image == 'medea-control-api-mock') | |
|| (matrix.image == 'medea-demo' | |
&& (startsWith(github.ref, 'refs/tags/medea-demo-') | |
|| !startsWith(github.ref, 'refs/tags/medea-'))) | |
|| (matrix.image == 'medea-demo-edge' | |
&& !startsWith(github.ref, 'refs/tags/medea-')) }}" | |
>> $GITHUB_OUTPUT | |
- id: export | |
run: echo "yes=${{ (matrix.image == 'medea-control-api-mock') | |
|| (matrix.image == 'medea-demo' | |
&& startsWith(github.ref, 'refs/tags/medea-demo-')) | |
|| (matrix.image == 'medea-demo-edge' | |
&& github.ref == 'refs/heads/master') }}" | |
>> $GITHUB_OUTPUT | |
- uses: actions/checkout@v4 | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- uses: docker/setup-buildx-action@v3 | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- run: make docker.build debug=no no-cache=yes | |
image=${{ matrix.image }} tag=build-${{ github.run_number }} | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- run: make docker.tar to-file=.cache/image.tar | |
image=${{ matrix.image }} tags=build-${{ github.run_number }} | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& steps.export.outputs.yes == 'true' }} | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: docker-${{ matrix.image }}-${{ github.run_number }} | |
path: .cache/image.tar | |
retention-days: 1 | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& steps.export.outputs.yes == 'true' }} | |
rustdoc: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: dtolnay/rust-toolchain@v1 | |
with: | |
toolchain: stable | |
- uses: Swatinem/rust-cache@v2 | |
if: ${{ env.CACHE == 'true' }} | |
- uses: arduino/setup-protoc@v3 | |
with: | |
version: ${{ env.PROTOC_VER }} | |
repo-token: ${{ secrets.GITHUB_TOKEN }} | |
# Run all task sequentially to not flood the jobs list. | |
- run: make docs.rust crate=medea-macro open=no | |
env: | |
RUSTFLAGS: -D warnings | |
if: ${{ startsWith(github.ref, 'refs/tags/medea-macro-') | |
|| !startsWith(github.ref, 'refs/tags/medea-') }} | |
- run: make docs.rust crate=medea-reactive open=no | |
env: | |
RUSTFLAGS: -D warnings | |
if: ${{ startsWith(github.ref, 'refs/tags/medea-reactive-') | |
|| !startsWith(github.ref, 'refs/tags/medea-') }} | |
- run: make docs.rust crate=medea-client-api-proto open=no | |
env: | |
RUSTFLAGS: -D warnings | |
if: ${{ startsWith(github.ref, 'refs/tags/medea-client-api-proto-') | |
|| !startsWith(github.ref, 'refs/tags/medea-') }} | |
- run: make docs.rust crate=medea-control-api-proto open=no | |
env: | |
RUSTFLAGS: -D warnings | |
if: ${{ startsWith(github.ref, 'refs/tags/medea-control-api-proto-') | |
|| !startsWith(github.ref, 'refs/tags/medea-') }} | |
- run: make docs.rust crate=medea-jason open=no | |
env: | |
RUSTFLAGS: -D warnings | |
if: ${{ startsWith(github.ref, 'refs/tags/medea-jason-') | |
|| !startsWith(github.ref, 'refs/tags/medea-') }} | |
############# | |
# Releasing # | |
############# | |
cargo-publish: | |
name: cargo publish (crates.io) | |
if: ${{ startsWith(github.ref, 'refs/tags/medea-jason-') | |
|| startsWith(github.ref, 'refs/tags/medea-client-api-proto-') | |
|| startsWith(github.ref, 'refs/tags/medea-control-api-proto-') | |
|| startsWith(github.ref, 'refs/tags/medea-macro-') | |
|| startsWith(github.ref, 'refs/tags/medea-reactive-') }} | |
needs: | |
- build-jason | |
- build-jason-linux | |
- clippy | |
- rustdoc | |
- rustfmt | |
- test | |
- test-e2e-browser | |
- test-e2e-native | |
- test-flutter | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: dtolnay/rust-toolchain@v1 | |
with: | |
toolchain: stable | |
- name: Parse release version | |
id: release | |
uses: actions-ecosystem/action-regex-match@v2 | |
with: | |
text: ${{ github.ref }} | |
regex: '^refs/tags/(medea[a-z-]*)-([0-9]+\.[0-9]+\.[0-9]+-?.*)$' | |
- name: Verify release version matches Cargo manifest | |
run: | | |
test "${{ steps.release.outputs.group2 }}" \ | |
== $(make cargo.version crate=${{ steps.release.outputs.group1 }}) | |
- uses: arduino/setup-protoc@v3 | |
with: | |
version: ${{ env.PROTOC_VER }} | |
repo-token: ${{ secrets.GITHUB_TOKEN }} | |
if: ${{ startsWith(github.ref, 'refs/tags/medea-control-api-proto-') }} | |
- run: make release.cargo crate=${{ steps.release.outputs.group1 }} | |
publish=yes | |
env: | |
CARGO_REGISTRY_TOKEN: ${{ secrets.CRATESIO_TOKEN }} | |
dart-pub-publish: | |
name: dart pub publish (pub.dev) | |
if: ${{ startsWith(github.ref, 'refs/tags/medea-jason-') | |
|| github.ref_name == 'master' | |
|| (github.event_name == 'pull_request' | |
&& github.event.pull_request.head.repo.owner.login == 'instrumentisto') }} | |
needs: | |
- build-jason | |
- build-jason-linux | |
- clippy | |
- dartanalyze | |
- dartfmt | |
- rustdoc | |
- rustfmt | |
- test | |
- test-e2e-browser | |
- test-e2e-native | |
- test-flutter | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 2 # for PRs only | |
- name: Parse pubspec version | |
id: pubspec | |
run: echo "version=$(grep -m1 'version:' pubspec.yaml | cut -d' ' -f2)" | |
>> $GITHUB_OUTPUT | |
working-directory: flutter/ | |
- name: Parse release version | |
id: release | |
uses: actions-ecosystem/action-regex-match@v2 | |
with: | |
text: ${{ github.ref }} | |
regex: '^refs/tags/(medea[a-z-]*)-([0-9]+\.[0-9]+\.[0-9]+-?.*)$' | |
if: ${{ startsWith(github.ref, 'refs/tags/') }} | |
- name: Verify release version matches pubspec version | |
run: | | |
test "${{ steps.release.outputs.group2 }}" \ | |
== "${{ steps.pubspec.outputs.version }}" | |
if: ${{ startsWith(github.ref, 'refs/tags/') }} | |
- name: Retrieve commit message and hash | |
id: commit | |
run: | | |
echo "message=$(git log --grep='\[publish\]' --format=%s)" \ | |
>> $GITHUB_OUTPUT | |
echo "sha=${{ (github.event_name == 'pull_request' | |
&& github.event.pull_request.head.sha) | |
|| github.sha }}" \ | |
>> $GITHUB_OUTPUT | |
- name: Check whether should be skipped | |
id: skip | |
run: echo "no=${{ !( | |
(!startsWith(github.ref, 'refs/tags/') | |
&& !contains(steps.pubspec.outputs.version, '-')) | |
|| | |
(github.event_name == 'pull_request' | |
&& !contains(steps.commit.outputs.message, '[publish]')) | |
) }}" >> $GITHUB_OUTPUT | |
- uses: subosito/flutter-action@v2 | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- uses: actions/download-artifact@v4 | |
with: | |
name: build-jason-android | |
path: ./flutter/android/src/main/jniLibs/ | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- uses: actions/download-artifact@v4 | |
with: | |
name: build-jason-ios | |
path: ./flutter/ios/lib/ | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- uses: actions/download-artifact@v4 | |
with: | |
name: build-jason-linux | |
path: ./flutter/linux/lib/ | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- uses: actions/download-artifact@v4 | |
with: | |
name: build-jason-macos | |
path: ./flutter/macos/lib/ | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- uses: actions/download-artifact@v4 | |
with: | |
name: build-jason-web | |
path: ./flutter/assets/pkg/ | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- uses: actions/download-artifact@v4 | |
with: | |
name: build-jason-windows | |
path: ./flutter/windows/lib/ | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- name: Append package version with commit SHA | |
run: | | |
sed -i "s/^version: \(.*\)$/version: \1+rev.${{ steps.commit.outputs.sha }}/g" \ | |
flutter/pubspec.yaml | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& !startsWith(github.ref, 'refs/tags/') }} | |
- name: Login to pub.dev | |
run: | | |
echo "$PUB_CREDENTIALS" > ~/pub-credentials.json | |
mkdir -p ${XDG_CONFIG_HOME:-${HOME:-default}}/dart/ | |
cp -f ~/pub-credentials.json \ | |
${XDG_CONFIG_HOME:-${HOME:-default}}/dart/pub-credentials.json | |
env: | |
PUB_CREDENTIALS: ${{ secrets.PUBDEV_CREDS }} | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- run: flutter pub publish --force | |
working-directory: flutter/ | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- name: Logout from pub.dev | |
run: | | |
rm -rf ~/pub-credentials.json \ | |
${XDG_CONFIG_HOME:-${HOME:-default}}/dart/pub-credentials.json | |
if: ${{ always() | |
&& steps.skip.outputs.no == 'true' }} | |
docker-push: | |
name: docker push | |
if: ${{ github.event_name == 'push' | |
&& (github.ref == 'refs/heads/master' | |
|| startsWith(github.ref, 'refs/tags/medea-control-api-mock-') | |
|| startsWith(github.ref, 'refs/tags/medea-demo-')) }} | |
needs: ["docker"] | |
strategy: | |
fail-fast: false | |
matrix: | |
image: | |
- medea-control-api-mock | |
- medea-demo | |
- medea-demo-edge | |
registry: ["docker.io", "ghcr.io", "quay.io"] | |
runs-on: ubuntu-latest | |
steps: | |
# Skip if this is fork and no credentials are provided. | |
- id: skip-fork | |
run: echo "no=${{ !( | |
github.repository_owner != 'instrumentisto' | |
&& ((matrix.registry == 'quay.io' | |
&& secrets.QUAYIO_ROBOT_USER == '') | |
|| (matrix.registry == 'docker.io' | |
&& secrets.DOCKERHUB_BOT_USER == '')) | |
) }}" >> $GITHUB_OUTPUT | |
- id: skip-image | |
run: echo "no=${{ (matrix.image == 'medea-control-api-mock' | |
&& (startsWith(github.ref, | |
'refs/tags/medea-control-api-mock-') | |
|| github.ref == 'refs/heads/master')) | |
|| (matrix.image == 'medea-demo' | |
&& startsWith(github.ref, 'refs/tags/medea-demo-')) | |
|| (matrix.image == 'medea-demo-edge' | |
&& github.ref == 'refs/heads/master') }}" | |
>> $GITHUB_OUTPUT | |
- id: skip | |
run: echo "no=${{ steps.skip-fork.outputs.no == 'true' | |
&& steps.skip-image.outputs.no == 'true' }}" | |
>> $GITHUB_OUTPUT | |
- uses: actions/checkout@v4 | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- uses: actions/download-artifact@v4 | |
with: | |
name: docker-${{ matrix.image }}-${{ github.run_number }} | |
path: .cache/ | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- run: make docker.untar from-file=.cache/image.tar | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- name: Login to ${{ matrix.registry }} container registry | |
uses: docker/login-action@v3 | |
with: | |
registry: ${{ matrix.registry }} | |
username: ${{ (matrix.registry == 'docker.io' | |
&& secrets.DOCKERHUB_BOT_USER) | |
|| (matrix.registry == 'quay.io' | |
&& secrets.QUAYIO_ROBOT_USER) | |
|| github.repository_owner }} | |
password: ${{ (matrix.registry == 'docker.io' | |
&& secrets.DOCKERHUB_BOT_PASS) | |
|| (matrix.registry == 'quay.io' | |
&& secrets.QUAYIO_ROBOT_TOKEN) | |
|| secrets.GITHUB_TOKEN }} | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- name: Parse semver versions | |
id: parsed | |
uses: actions-ecosystem/action-regex-match@v2 | |
with: | |
text: ${{ github.ref }} | |
regex: '^refs/tags/medea[a-z-]*-((([0-9]+)\.[0-9]+)\.[0-9]+(-.+)?)$' | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& startsWith(github.ref, 'refs/tags/medea-') }} | |
- name: Form Docker version tags | |
id: versions | |
uses: actions/github-script@v7 | |
with: | |
result-encoding: string | |
script: | | |
let versions = '${{ steps.parsed.outputs.group1 }}'; | |
if ('${{ steps.parsed.outputs.group4 }}' === '') { | |
versions += ',${{ steps.parsed.outputs.group2 }}'; | |
if ('${{ steps.parsed.outputs.group3 }}' !== '0') { | |
versions += ',${{ steps.parsed.outputs.group3 }}'; | |
} | |
} | |
return versions; | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& startsWith(github.ref, 'refs/tags/medea-') }} | |
- name: Prepare final image tags | |
id: tags | |
uses: bluwy/substitute-string-action@v3 | |
with: | |
_input-text: ${{ (startsWith(github.ref, 'refs/tags/medea-') | |
&& 'latest,@versions') | |
|| 'edge' }} | |
"@versions": ${{ steps.versions.outputs.result }} | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- name: Prepare real image name | |
id: image | |
uses: bluwy/substitute-string-action@v3 | |
with: | |
_input-text: ${{ matrix.image }} | |
-edge: "" | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- run: make docker.tag tags=${{ steps.tags.outputs.result }} | |
image=${{ matrix.image }} of=build-${{ github.run_number }} | |
repos=${{ matrix.registry }}/${{ github.repository_owner }} | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
- run: make docker.push tags=${{ steps.tags.outputs.result }} | |
image=${{ matrix.image }} | |
repos=${{ matrix.registry }}/${{ github.repository_owner }} | |
if: ${{ steps.skip.outputs.no == 'true' }} | |
# On GitHub Container Registry README is automatically updated on pushes. | |
- name: Update README on Docker Hub | |
uses: christian-korneck/update-container-description-action@v1 | |
with: | |
provider: dockerhub | |
destination_container_repo: >- | |
${{ github.repository_owner }}/${{ steps.image.outputs.result }} | |
readme_file: ${{ (matrix.image == 'medea-control-api-mock' | |
&& 'mock/control-api/README.md') | |
|| 'demo/README.md' }} | |
env: | |
DOCKER_USER: ${{ secrets.DOCKERHUB_BOT_USER }} | |
DOCKER_PASS: ${{ secrets.DOCKERHUB_BOT_PASS }} | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& matrix.registry == 'docker.io' }} | |
- name: Update README on Quay.io | |
uses: christian-korneck/update-container-description-action@v1 | |
with: | |
provider: quay | |
destination_container_repo: >- | |
${{ matrix.registry }}/${{ github.repository_owner }}/${{ steps.image.outputs.result }} | |
readme_file: ${{ (matrix.image == 'medea-control-api-mock' | |
&& 'mock/control-api/README.md') | |
|| 'demo/README.md' }} | |
env: | |
DOCKER_APIKEY: ${{ secrets.QUAYIO_API_TOKEN }} | |
if: ${{ steps.skip.outputs.no == 'true' | |
&& matrix.registry == 'quay.io' }} | |
helm-push: | |
name: helm push | |
if: ${{ github.ref == 'refs/heads/master' }} | |
needs: ["helm-lint"] | |
strategy: | |
matrix: | |
chart: ["medea-demo"] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: trilom/file-changes-action@v1.2.4 | |
id: changed | |
- id: chart | |
run: echo "manifest=$(make helm.dir | |
chart=${{ matrix.chart }})/Chart.yaml" | |
>> $GITHUB_OUTPUT | |
- uses: azure/setup-helm@v4 | |
if: ${{ contains(steps.changed.outputs.files, | |
steps.chart.outputs.manifest) }} | |
- name: Prepare Git author for push | |
run: | | |
git config --local user.email 'actions+${{ github.run_number }}@github.com' | |
git config --local user.name 'GitHub Actions' | |
if: ${{ contains(steps.changed.outputs.files, | |
steps.chart.outputs.manifest) }} | |
- run: make helm.package.release chart=${{ matrix.chart }} build=yes | |
if: ${{ contains(steps.changed.outputs.files, | |
steps.chart.outputs.manifest) }} | |
npm-publish: | |
name: npm publish (npm.js) | |
if: ${{ startsWith(github.ref, 'refs/tags/medea-jason-') }} | |
needs: ["cargo-publish"] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Parse release version | |
id: package | |
uses: actions-ecosystem/action-regex-match@v2 | |
with: | |
text: ${{ github.ref }} | |
regex: '^refs/tags/(medea[a-z-]*)-([0-9]+\.[0-9]+\.[0-9]+(-.+)?)$' | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: "20" | |
registry-url: https://registry.npmjs.org | |
- uses: dtolnay/rust-toolchain@v1 | |
with: | |
toolchain: stable | |
target: wasm32-unknown-unknown | |
- uses: jetli/wasm-pack-action@v0.4.0 | |
- run: make release.npm crate=${{ steps.package.outputs.group1 }} | |
publish=yes | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPMJS_TOKEN }} | |
release-github: | |
name: release (GitHub) | |
if: ${{ startsWith(github.ref, 'refs/tags/medea-') }} | |
needs: | |
- build-jason | |
- build-jason-linux | |
- clippy | |
- dartanalyze | |
- dartfmt | |
- rustdoc | |
- rustfmt | |
- test | |
- test-e2e-browser | |
- test-e2e-native | |
- test-flutter | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Parse pubspec version | |
id: pubspec | |
run: echo "version=$(grep -m1 'version:' pubspec.yaml | cut -d' ' -f2)" | |
>> $GITHUB_OUTPUT | |
working-directory: flutter/ | |
if: ${{ startsWith(github.ref, 'refs/tags/medea-jason-') }} | |
- name: Parse release version | |
id: release | |
uses: actions-ecosystem/action-regex-match@v2 | |
with: | |
text: ${{ github.ref }} | |
regex: '^refs/tags/(medea[a-z-]*)-([0-9]+\.[0-9]+\.[0-9]+-?.*)$' | |
- name: Verify release version matches Cargo manifest | |
run: | | |
test "${{ steps.release.outputs.group2 }}" \ | |
== $(make cargo.version crate=${{ steps.release.outputs.group1 }}) | |
if: ${{ !startsWith(github.ref, 'refs/tags/medea-demo-') }} | |
- name: Verify release version matches pubspec | |
run: | | |
test "${{ steps.release.outputs.group2 }}" \ | |
== "${{ steps.pubspec.outputs.version }}" | |
if: ${{ startsWith(github.ref, 'refs/tags/medea-jason-') }} | |
- name: Verify release version matches Yarn manifest | |
run: | | |
test "${{ steps.release.outputs.group2 }}" \ | |
== $(make yarn.version pkg=${{ steps.release.outputs.group1 }}) | |
if: ${{ startsWith(github.ref, 'refs/tags/medea-demo-') }} | |
- name: Parse CHANGELOG link | |
id: changelog | |
run: echo "link=$(make cargo.changelog.link | |
crate=${{ steps.release.outputs.group1 }} | |
ver=${{ steps.release.outputs.group2 }})" | |
>> $GITHUB_OUTPUT | |
- name: Create GitHub release | |
uses: softprops/action-gh-release@v2 | |
with: | |
name: ${{ steps.release.outputs.group1 }} ${{ steps.release.outputs.group2 }} | |
body: | | |
[API docs](https://docs.rs/${{ steps.release.outputs.group1 }}/${{ steps.release.outputs.group2 }}) | |
[Changelog](${{ steps.changelog.outputs.link }}) | |
prerelease: ${{ contains(steps.release.outputs.group2, '-') }} |