Skip to content

Build and Test

Build and Test #21714

Workflow file for this run

# This file is part of ICU4X. For terms of use, please see the file
# called LICENSE at the top level of the ICU4X source tree
# (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
name: Build and Test
# Each of these jobs job maps to a `ci-job-foo` entry in Makefile.toml.
# If adding further CI jobs, please add them as makefile targets as well,
# and list them under `ci-all`.
on:
push:
branches:
- 'main'
- 'release/**'
pull_request:
workflow_dispatch:
inputs:
channel:
description: "Channel"
default: 'nightly'
type: choice
options:
- pinned-stable
- stable
- beta
- nightly
schedule:
# Run nightly cronjob CI every day at 14 UTC / 6AM PST / 3PM CET
- cron: '0 14 * * *'
# Run beta slightly later
- cron: '1 14 * * *'
permissions:
contents: read
concurrency:
# Allow one run at a time for PRs, but multiple for other invocations
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
# ci-job-check & ci-job-features
# Running at MSRV
msrv:
runs-on: ubuntu-latest
# Defined as a matrix so that features can start immediately, but
# be killed if check fails.
strategy:
matrix:
behavior: [check, features-1, features-2, features-3]
fail-fast: true
# Set CARGO_HTTP_MULTIPLEXING=false to work around crates.io curl bug:
# <https://rust-lang.zulipchat.com/#narrow/stream/246057-t-cargo/topic/timeout.20investigation>
env:
CARGO_HTTP_MULTIPLEXING: false
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Job-specific dependencies
- name: Install cargo-all-features
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-all-features@1.10.0
# No toolchain boilerplate as this runs on MSRV
# Actual job
- name: Check
run: cargo make ci-job-msrv-${{ matrix.behavior }}
# ci-job-test
test:
strategy:
matrix:
os: [ ubuntu-latest, macos-latest, windows-latest ]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Actual job
- name: Run `cargo make ci-job-test`
run: cargo make ci-job-test
# ci-job-test-docs
test-docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Actual job
- name: Run `cargo make ci-job-test-docs`
run: cargo make ci-job-test-docs
# ci-job-test-gigo
test-gigo:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Actual job
- name: Run `cargo make ci-job-test-gigo`
run: cargo make ci-job-test-gigo
# ci-job-test-tutorials
test-tutorials:
runs-on: ubuntu-latest
strategy:
matrix:
behavior: [local] # reenable cratesio for 2.0
fail-fast: false
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Job-specific dependencies
- name: Install harfbuzz
run: sudo apt install libharfbuzz-dev
# Actual job
- name: Run `cargo make ci-job-test-tutorials-${{ matrix.behavior }}`
run: cargo make ci-job-test-tutorials-${{ matrix.behavior }}
# ci-job-testdata
testdata:
strategy:
matrix:
os: [ ubuntu-latest, macos-latest, windows-latest ]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Job-specific dependencies
- name: Install rustfmt
run: rustup component add rustfmt
# Actual job
- name: Run `cargo make ci-job-testdata`
run: cargo make ci-job-testdata
# ci-job-full-datagen
full-datagen:
# Generated Rust is not stable across Rust versions
if: ${{ github.event_name != 'schedule' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Job-specific dependencies
- name: Install rustfmt
run: rustup component add rustfmt
# Actual job
- name: Run `cargo make ci-job-full-datagen`
run: cargo make ci-job-full-datagen
# ci-job-test-c
test-c:
runs-on: ubuntu-24.04 # Includes LLVM 16,17,18
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Actual job
- name: Run `cargo make ci-job-test-c`
run: cargo make ci-job-test-c
env:
CXX: "g++-13"
- name: Test C++ with clang
run: cargo make test-cpp
env:
CXX: "clang++"
# ci-job-test-js
test-js:
runs-on: ubuntu-24.04 # Includes LLVM 16,17,18
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Actual job
- name: Run `cargo make ci-job-test-js`
run: cargo make ci-job-test-js
# ci-job-test-dart
test-dart:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Software setup/installation for the container
- name: Install Rust toolchains
run: |
rustup toolchain install stable
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Job-specific dependencies
- uses: dart-lang/setup-dart@0a8a0fc875eb934c15d08629302413c671d3f672 # v1.6.5
with:
sdk: 3.4.0-204.0.dev
# Actual job
- name: Run `cargo make ci-job-test-dart`
run: cargo make ci-job-test-dart
# ci-job-nostd
nostd:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Actual job
- name: Run `cargo make ci-job-nostd`
run: cargo make ci-job-nostd
# ci-job-diplomat
diplomat:
runs-on: [ ubuntu-latest ]
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Actual job
- name: Run `cargo make ci-job-diplomat`
run: cargo make ci-job-diplomat
# ci-job-gn
gn:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Job-specific dependencies
- name: Attempt to load cached GN Third-Party Tools
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
id: gn-third-party-tools-cache
with:
path: |
tutorials/gn/third_party_tools
key: gn-third-party-${{ runner.os }}-${{ hashFiles('tools/make/gn.toml', 'tutorials/gn/Cargo.lock') }}
- name: Install GN Third-Party Tools
if: steps.gn-third-party-tools-cache.outputs.cache-hit != 'true'
run: cargo make gn-install
- name: Install cargo-rdme
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-rdme@1.4.2
# Actual job
- name: Run `cargo make ci-job-gn`
run: cargo make ci-job-gn
# ci-job-fmt
fmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Job-specific dependencies
- name: Install rustfmt
run: rustup component add rustfmt
# Actual job
- name: Check Format
run: cargo make ci-job-fmt
# ci-job-tidy
tidy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Job-specific dependencies
- name: Install cargo-rdme
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-rdme@1.4.2
# Actual job
- name: Tidy
run: cargo make ci-job-tidy
# ci-job-clippy
clippy:
# We don't expect to be clippy-clean on nightly cronjob.
if: ${{ github.event_name != 'schedule' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Job-specific dependencies
- name: Install clippy
run: rustup component add clippy
# Actual job
- name: Run `ci-job-clippy`
run: cargo make ci-job-clippy
# ci-job-doc
doc:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# Cargo-make boilerplate
- name: Install cargo-make
uses: taiki-e/install-action@64e4e2f995104968c78bd697b253d55bf557af66 # v2.41.11
with:
tool: cargo-make@0.37.13
# Toolchain boilerplate
- name: Potentially override rust version with nightly
run: cargo make set-ci-toolchain
- name: Show the selected Rust toolchain
run: rustup show
# Actual job
- name: Cargo doc
run: cargo make ci-job-doc
# Notify on slack
notify-slack:
needs: [msrv, test, testdata, test-docs, full-datagen, test-c, test-js, test-dart, nostd, diplomat, gn, fmt, tidy, clippy, doc]
if: ${{ always() && contains(needs.*.result, 'failure') && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || (github.event_name == 'push' && github.ref_name == 'main')) }}
runs-on: ubuntu-latest
steps:
- name: Notify slack of failure
uses: ravsamhq/notify-slack-action@4ed28566c2bdcdaee6dca2b46b9666d01b4ed8a4 # v1
# Only notify main slack of failure for beta runs and for failed main CI
if: (github.event_name == 'schedule' && github.event.schedule == '1 14 * * *') || github.event_name == 'push'
with:
notify_when: failure
status: failure # We do the filtering earlier
notification_title: ''
message_format: ${{ format('{{emoji}} {0} CI failed!' , ((github.event_name == 'schedule') && 'Beta' || (github.event_name == 'push') && 'Main' || 'Manually dispatched')) }}
footer: '<{run_url}|View failure> | <https://github.com/unicode-org/icu4x/actions?query=event%3A${{ github.event_name }}|CI history for `${{ github.event_name }}`>'
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
- name: Notify nightly slack of failure
uses: ravsamhq/notify-slack-action@4ed28566c2bdcdaee6dca2b46b9666d01b4ed8a4 # v1
with:
notify_when: failure
status: failure # We do the filtering earlier
notification_title: ''
message_format: ${{ format('{{emoji}} {0} CI failed!' , ((github.event_name == 'schedule') && (github.event.schedule == '1 14 * * *' && 'Beta' || 'Nightly') || (github.event_name == 'push') && 'Main' || 'Manually dispatched on `${{ inputs.channel }}`')) }}
footer: '<{run_url}|View failure> | <https://github.com/unicode-org/icu4x/actions?query=event%3A${{ github.event_name }}|CI history for `${{ github.event_name }}`>'
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_NIGHTLY_WEBHOOK_URL }}