Skip to content

Upgrade actions/checkout to 4 version (#122) #1649

Upgrade actions/checkout to 4 version (#122)

Upgrade actions/checkout to 4 version (#122) #1649

Workflow file for this run

name: CI
on:
push:
branches: ["main"]
tags: ["*"]
pull_request:
branches: ["main"]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
RUST_BACKTRACE: 1
jobs:
################
# Pull Request #
################
pr:
if: ${{ github.event_name == 'pull_request' }}
needs:
- build
- build-linux
- clippy
- dartanalyze
- dartfmt
- ktfmt
- rustdoc
- rustfmt
- swiftformat
- test-flutter
runs-on: ubuntu-latest
steps:
- run: true
##########################
# Linting and formatting #
##########################
clippy:
strategy:
fail-fast: false
matrix:
platform:
- linux
- macos
- windows
runs-on: ${{ (matrix.platform == 'linux' && 'ubuntu-latest')
|| (matrix.platform == 'windows' && 'windows-latest')
|| 'macos-latest' }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
components: clippy
- name: Install `${{ matrix.platform }}` platform dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libgtk-3-dev libpulse-dev libudev-dev libxcomposite-dev \
libxdamage-dev libxfixes-dev libxrandr-dev libxtst-dev \
ninja-build
if: ${{ matrix.platform == 'linux' }}
- run: make cargo.lint
dartanalyze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@v2
- run: flutter pub get
- run: make flutter.analyze
dartfmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@v2
- run: flutter pub get
- run: make flutter.fmt check=yes
ktfmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17
- run: make kt.fmt check=yes
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
swiftformat:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- run: brew install swiftformat
- run: make swift.fmt check=yes dockerized=no
############
# Building #
############
build:
strategy:
fail-fast: false
matrix:
platform:
- macos
- windows
runs-on: ${{ (matrix.platform == 'windows' && 'windows-latest')
|| 'macos-11' }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
- run: make rustup.targets only=${{ matrix.platform }}
- uses: subosito/flutter-action@v2
- run: flutter config --enable-${{ matrix.platform }}-desktop
# Pin Xcode version for better compatibility.
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: "12.4"
if: ${{ matrix.platform == 'macos' }}
- run: make cargo.build platform=${{ matrix.platform }} debug=no
- run: make flutter.build platform=${{ matrix.platform }}
- uses: actions/upload-artifact@v3
with:
name: build-${{ matrix.platform }}
path: ${{ matrix.platform }}/rust/
build-linux:
name: build (linux)
runs-on: ubuntu-latest
# Pin glibc to 2.31 version for better compatibility.
container: debian:bullseye
steps:
- uses: actions/checkout@v4
- name: Install Linux platform dependencies
run: |
apt-get update
apt-get install -y \
curl jq xz-utils git make clang libssl-dev cmake \
libgtk-3-dev libpulse-dev libudev-dev libxcomposite-dev \
libxdamage-dev libxfixes-dev libxrandr-dev libxtst-dev \
ninja-build
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
# Container doesn't pick `~` (tilde) in `PATH`.
- run: echo "$HOME/.cargo/bin" >> $GITHUB_PATH
- run: git config --global --add safe.directory '*'
- run: make rustup.targets only=linux
- uses: subosito/flutter-action@v2
- run: flutter config --enable-linux-desktop
- run: make cargo.build platform=linux debug=no
- run: make flutter.build platform=linux
- uses: actions/upload-artifact@v3
with:
name: build-linux
path: linux/rust/
###########
# Testing #
###########
test-flutter:
name: test (example, ${{ matrix.platform }})
needs: ["build", "build-linux"]
strategy:
fail-fast: false
matrix:
platform:
- android
- ios
- linux
- macos
- windows
runs-on: ${{ (matrix.platform == 'linux' && 'ubuntu-latest')
|| (matrix.platform == 'windows' && 'windows-latest')
|| 'macos-13' }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
if: ${{ matrix.platform != 'android'
&& matrix.platform != 'ios' }}
- run: make rustup.targets only=${{ matrix.platform }}
if: ${{ matrix.platform != 'android'
&& matrix.platform != 'ios' }}
- uses: subosito/flutter-action@v2
- run: flutter config --enable-${{ matrix.platform }}-desktop
if: ${{ matrix.platform != 'android'
&& matrix.platform != 'ios' }}
- name: Install `${{ matrix.platform }}` platform dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
cmake \
libgtk-3-dev liblzma-dev libpulse-dev libudev-dev \
ninja-build \
xvfb
if: ${{ matrix.platform == 'linux' }}
- run: make cargo.build debug=yes platform=${{ matrix.platform }}
if: ${{ matrix.platform != 'android'
&& matrix.platform != 'ios' }}
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
distribution: zulu
java-version: 11
if: ${{ matrix.platform == 'android' }}
- name: Test on `${{ matrix.platform }}` platform with emulator
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 24
cores: 3
target: google_apis
arch: x86_64
profile: Nexus 6
script: make flutter.test.mobile
if: ${{ matrix.platform == 'android' }}
- name: Start iOS simulator
id: simulator
uses: futureware-tech/simulator-action@v2
with:
os_version: '>=13.0'
os: iOS
if: ${{ matrix.platform == 'ios' }}
- name: Test on `${{ matrix.platform }}` platform with simulator
run: make flutter.test.mobile device=${{ steps.simulator.outputs.udid }}
debug=yes
if: ${{ matrix.platform == 'ios' }}
- name: Test on `${{ matrix.platform }}` platform with Xvfb
run: xvfb-run -a make flutter.test.desktop device=${{ matrix.platform }}
if: ${{ matrix.platform == 'linux' }}
- name: Test on `${{ matrix.platform }}` platform
run: make flutter.test.desktop device=${{ matrix.platform }}
if: ${{ matrix.platform == 'macos'
|| matrix.platform == 'windows' }}
#################
# Documentation #
#################
rustdoc:
strategy:
fail-fast: false
matrix:
platform:
- linux
- macos
- windows
runs-on: ${{ (matrix.platform == 'linux' && 'ubuntu-latest')
|| (matrix.platform == 'windows' && 'windows-latest')
|| 'macos-latest' }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
- name: Install `${{ matrix.platform }}` platform dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libgtk-3-dev libpulse-dev libudev-dev libxcomposite-dev \
libxdamage-dev libxfixes-dev libxrandr-dev libxtst-dev \
ninja-build
if: ${{ matrix.platform == 'linux' }}
- run: make cargo.doc
#############
# Releasing #
#############
release-dart:
name: dart pub publish (pub.dev)
if: ${{ startsWith(github.ref, 'refs/tags/')
|| github.ref_name == 'main'
|| (github.event_name == 'pull_request'
&& github.event.pull_request.head.repo.owner.login == 'instrumentisto') }}
needs:
- build
- build-linux
- clippy
- dartanalyze
- dartfmt
- ktfmt
- rustdoc
- rustfmt
- swiftformat
- 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
- name: Parse release version
id: release
run: echo "version=${GITHUB_REF#refs/tags/}"
>> $GITHUB_OUTPUT
if: ${{ startsWith(github.ref, 'refs/tags/') }}
- name: Verify release version matches pubspec version
run: |
test "${{ steps.release.outputs.version }}" \
== "${{ 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@v3
with:
name: build-linux
path: linux/rust/
if: ${{ steps.skip.outputs.no == 'true' }}
- uses: actions/download-artifact@v3
with:
name: build-macos
path: macos/rust/
if: ${{ steps.skip.outputs.no == 'true' }}
- uses: actions/download-artifact@v3
with:
name: build-windows
path: windows/rust/
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" \
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
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' }}
release-github:
name: release (GitHub)
if: ${{ startsWith(github.ref, 'refs/tags/') }}
needs: ["release-dart"]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Parse release version
id: release
run: echo "version=${GITHUB_REF#refs/tags/}"
>> $GITHUB_OUTPUT
- name: Parse CHANGELOG link
id: changelog
run: echo "link=${{ github.server_url }}/${{ github.repository }}/blob/${{ steps.release.outputs.version }}/CHANGELOG.md#$(sed -n '/^## \[${{ steps.release.outputs.version }}\]/{s/^## \[\(.*\)\][^0-9]*\([0-9].*\)/\1--\2/;s/[^0-9a-z-]*//g;p;}' CHANGELOG.md)"
>> $GITHUB_OUTPUT
- name: Create GitHub release
uses: softprops/action-gh-release@v1
with:
name: ${{ steps.release.outputs.version }}
body: |
[pub.dev](https://pub.dev/packages/medea_flutter_webrtc/versions/${{ steps.release.outputs.version }})
[Changelog](${{ steps.changelog.outputs.link }})
prerelease: ${{ contains(steps.release.outputs.version, '-') }}