Skip to content

Use Rust from fenix in flake #113

Use Rust from fenix in flake

Use Rust from fenix in flake #113

Workflow file for this run

name: ci
on:
pull_request:
push:
branches:
- main
workflow_dispatch:
env:
CARGO_TERM_COLOR: always
RUSTFLAGS: "-D warnings"
CARGO_INCREMENTAL: 0
CARGO_PROFILE_DEV_DEBUG: 0
CARGO_PROFILE_TEST_DEBUG: 0
CROSS_CONTAINER_UID: 0
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
test:
name: test
runs-on: ${{ matrix.os }}
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
toolchain: [1.81.0]
target:
- x86_64-unknown-linux-gnu
- x86_64-unknown-linux-musl
- aarch64-unknown-linux-gnu
- aarch64-unknown-linux-musl
- x86_64-apple-darwin
- x86_64-pc-windows-msvc
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
use-cross: false
run-integration-tests: true
supports-nix: true
- os: ubuntu-latest
target: x86_64-unknown-linux-musl
use-cross: true
run-integration-tests: true
supports-nix: true
- os: ubuntu-latest
target: aarch64-unknown-linux-gnu
use-cross: true
run-integration-tests: false # Cannot run aarch64 binaries on x86_64
supports-nix: true
- os: ubuntu-latest
target: aarch64-unknown-linux-musl
use-cross: true
run-integration-tests: false # Cannot run aarch64 binaries on x86_64
supports-nix: true
# macos>=14 runs exclusively on aarch64 and will thus fail to execute properly for x64
- os: macos-13 # intel
target: x86_64-apple-darwin
use-cross: false
run-integration-tests: true
supports-nix: true
- os: macos-latest # aarch64
toolchain: 1.81.0
target: aarch64-apple-darwin
use-cross: false
run-integration-tests: true
supports-nix: true
- os: windows-latest
target: x86_64-pc-windows-msvc
use-cross: false
run-integration-tests: true
supports-nix: false
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install musl-tools incl. musl-gcc
uses: awalsh128/cache-apt-pkgs-action@v1
with:
# musl-tools provide `musl-gcc` which is required for `ring` which is required for `rustls` et al.
packages: musl-tools
version: 1.1
if: ${{ matrix.target == 'x86_64-unknown-linux-musl'}}
- name: Install Rust toolchain
uses: dtolnay/[email protected]
with:
toolchain: ${{ matrix.toolchain }}
target: ${{ matrix.target }}
- name: Install Erlang (non-macos)
uses: erlef/setup-beam@v1
with:
otp-version: "26.1"
elixir-version: "1.16.1"
rebar3-version: "3"
if: ${{ runner.os != 'macOS' }} # setup-beam does not support macOS
- name: Install Erlang (macos)
run: |
brew install erlang rebar3 elixir
mix local.hex --force
if: ${{ runner.os == 'macOS' }} # setup-beam does not support macOS
- name: Install Nix (not ARM MacOS)
uses: nixbuild/nix-quick-install-action@v27
if: ${{ matrix.supports-nix && matrix.target != 'aarch64-apple-darwin' }}
- name: Install Nix (ARM MacOS)
uses: cachix/install-nix-action@v25
if: ${{ matrix.supports-nix && matrix.target == 'aarch64-apple-darwin' }}
- name: Handle Rust dependencies caching
uses: Swatinem/rust-cache@v2
with:
key: v1-${{ matrix.target }}
- name: Install Glistix
uses: clechasseur/rs-cargo@v2
with:
command: install
args: "--path compiler-cli --target ${{ matrix.target }} --debug --locked"
use-cross: ${{ matrix.use-cross }}
if: ${{ matrix.run-integration-tests }}
- name: Run tests
uses: clechasseur/rs-cargo@v2
with:
command: test
args: "--workspace --target ${{ matrix.target }}"
use-cross: ${{ matrix.use-cross }}
- name: test/project_erlang (non-windows)
run: |
glistix run && cd src && glistix run && cd ..
glistix check
glistix test && cd src && glistix test && cd ..
glistix docs build
working-directory: ./test/project_erlang
if: ${{ runner.os != 'Windows' && matrix.run-integration-tests }}
- name: test/project_erlang (windows)
run: |
glistix run && cd src && glistix run && cd ..
glistix check
glistix test && cd src && glistix test && cd ..
glistix docs build
working-directory: ./test/project_erlang_windows
if: ${{ runner.os == 'Windows' && matrix.run-integration-tests }}
- name: test/project_erlang export erlang-shipment (non-windows)
run: |
glistix export erlang-shipment
./build/erlang-shipment/entrypoint.sh run
working-directory: ./test/project_erlang
if: ${{ runner.os != 'Windows' && matrix.run-integration-tests }}
- name: test/project_erlang export erlang-shipment (windows)
run: |
glistix export erlang-shipment
.\build\erlang-shipment\entrypoint.ps1 run
working-directory: ./test/project_erlang_windows
if: ${{ runner.os == 'Windows' && matrix.run-integration-tests }}
- name: test/project_erlang export package-interface
run: |
glistix export package-interface --out="interface.json"
cat interface.json
working-directory: ./test/project_erlang
if: ${{ matrix.run-integration-tests }}
- name: test/external_only_javascript
run: ./test.sh
working-directory: ./test/external_only_javascript
if: ${{ matrix.run-integration-tests }}
env:
GLEAM_COMMAND: glistix
- name: test/external_only_erlang
run: ./test.sh
working-directory: ./test/external_only_erlang
if: ${{ matrix.run-integration-tests }}
env:
GLEAM_COMMAND: glistix
- name: test/project_javascript
run: |
glistix run
glistix check
glistix test
glistix docs build
working-directory: ./test/project_javascript
if: ${{ matrix.run-integration-tests }}
- name: test/project_path_deps
run: |
glistix update
glistix check
working-directory: ./test/project_path_deps/project_a
if: ${{ matrix.run-integration-tests }}
- name: Test project generation (Erlang)
env:
TEMP_PROJECT_DIR: ${{ runner.temp }}
run: |
# Create project in temp dir to avoid Git interference
cd "${TEMP_PROJECT_DIR}"
glistix new lib_project
cd lib_project
glistix run --target erlang
glistix test --target erlang
# Test adding of deps
glistix add exception # No specifier
glistix add gleam_http@3 # Version specifier
glistix test --target erlang
# Test documentation generation
# Workaround for lack of --target option for docs build
# TODO: Remove this workaround after Gleam 1.4
# (See https://github.com/gleam-lang/gleam/pull/3333)
sed -i -e 's/target = "nix"/target = "erlang"/' gleam.toml
glistix docs build
# Assert that module metadata has been written
ls build/dev/erlang/lib_project/_gleam_artefacts/lib_project.cache
# Assert that HTML docs and their assets have been written
ls build/dev/docs/lib_project/index.html
ls build/dev/docs/lib_project/lib_project.html
ls build/dev/docs/lib_project/css/atom-one-light.min.css
ls build/dev/docs/lib_project/css/atom-one-dark.min.css
ls build/dev/docs/lib_project/css/index.css
ls build/dev/docs/lib_project/js/highlight.min.js
ls build/dev/docs/lib_project/js/highlightjs-gleam.js
ls build/dev/docs/lib_project/js/highlightjs-erlang.min.js
ls build/dev/docs/lib_project/js/highlightjs-elixir.min.js
ls build/dev/docs/lib_project/js/highlightjs-javascript.min.js
ls build/dev/docs/lib_project/js/highlightjs-typescript.min.js
ls build/dev/docs/lib_project/js/highlightjs-nix.min.js
ls build/dev/docs/lib_project/js/lunr.min.js
ls build/dev/docs/lib_project/js/index.js
ls build/dev/docs/lib_project/fonts/karla-v23-bold-latin-ext.woff2
ls build/dev/docs/lib_project/fonts/karla-v23-bold-latin.woff2
ls build/dev/docs/lib_project/fonts/karla-v23-regular-latin-ext.woff2
ls build/dev/docs/lib_project/fonts/karla-v23-regular-latin.woff2
ls build/dev/docs/lib_project/fonts/ubuntu-mono-v15-regular-cyrillic-ext.woff2
ls build/dev/docs/lib_project/fonts/ubuntu-mono-v15-regular-cyrillic.woff2
ls build/dev/docs/lib_project/fonts/ubuntu-mono-v15-regular-greek-ext.woff2
ls build/dev/docs/lib_project/fonts/ubuntu-mono-v15-regular-greek.woff2
ls build/dev/docs/lib_project/fonts/ubuntu-mono-v15-regular-latin-ext.woff2
ls build/dev/docs/lib_project/fonts/ubuntu-mono-v15-regular-latin.woff2
if: ${{ matrix.run-integration-tests }}
- name: Test project generation (Nix - not Windows)
env:
TEMP_PROJECT_DIR: ${{ runner.temp }}
run: |
# Create project in temp dir to avoid Git interference
cd "${TEMP_PROJECT_DIR}"
glistix new nix_lib_project
cd nix_lib_project
glistix run
glistix test
glistix run --target nix
glistix test --target nix
glistix docs build
# Assert that module metadata has been written
ls build/dev/nix/nix_lib_project/_gleam_artefacts/nix_lib_project.cache
# Assert that HTML docs and their assets have been written
ls build/dev/docs/nix_lib_project/index.html
ls build/dev/docs/nix_lib_project/nix_lib_project.html
ls build/dev/docs/nix_lib_project/css/atom-one-light.min.css
ls build/dev/docs/nix_lib_project/css/atom-one-dark.min.css
ls build/dev/docs/nix_lib_project/css/index.css
ls build/dev/docs/nix_lib_project/js/highlight.min.js
ls build/dev/docs/nix_lib_project/js/highlightjs-gleam.js
ls build/dev/docs/nix_lib_project/js/highlightjs-erlang.min.js
ls build/dev/docs/nix_lib_project/js/highlightjs-elixir.min.js
ls build/dev/docs/nix_lib_project/js/highlightjs-javascript.min.js
ls build/dev/docs/nix_lib_project/js/highlightjs-typescript.min.js
ls build/dev/docs/nix_lib_project/js/highlightjs-nix.min.js
ls build/dev/docs/nix_lib_project/js/lunr.min.js
ls build/dev/docs/nix_lib_project/js/index.js
ls build/dev/docs/nix_lib_project/fonts/karla-v23-bold-latin-ext.woff2
ls build/dev/docs/nix_lib_project/fonts/karla-v23-bold-latin.woff2
ls build/dev/docs/nix_lib_project/fonts/karla-v23-regular-latin-ext.woff2
ls build/dev/docs/nix_lib_project/fonts/karla-v23-regular-latin.woff2
ls build/dev/docs/nix_lib_project/fonts/ubuntu-mono-v15-regular-cyrillic-ext.woff2
ls build/dev/docs/nix_lib_project/fonts/ubuntu-mono-v15-regular-cyrillic.woff2
ls build/dev/docs/nix_lib_project/fonts/ubuntu-mono-v15-regular-greek-ext.woff2
ls build/dev/docs/nix_lib_project/fonts/ubuntu-mono-v15-regular-greek.woff2
ls build/dev/docs/nix_lib_project/fonts/ubuntu-mono-v15-regular-latin-ext.woff2
ls build/dev/docs/nix_lib_project/fonts/ubuntu-mono-v15-regular-latin.woff2
if: ${{ matrix.run-integration-tests && matrix.supports-nix }}
- name: Test project generation (Nix - Windows)
env:
TEMP_PROJECT_DIR: ${{ runner.temp }}
run: |
# Create project in temp dir to avoid Git interference
cd "${TEMP_PROJECT_DIR}"
glistix new nix_lib_project
cd nix_lib_project
glistix build
glistix build --target nix
glistix docs build
# Assert that module metadata has been written
ls build/dev/nix/nix_lib_project/_gleam_artefacts/nix_lib_project.cache
# Assert that HTML docs and their assets have been written
ls build/dev/docs/nix_lib_project/index.html
ls build/dev/docs/nix_lib_project/nix_lib_project.html
ls build/dev/docs/nix_lib_project/css/atom-one-light.min.css
ls build/dev/docs/nix_lib_project/css/atom-one-dark.min.css
ls build/dev/docs/nix_lib_project/css/index.css
ls build/dev/docs/nix_lib_project/js/highlight.min.js
ls build/dev/docs/nix_lib_project/js/highlightjs-gleam.js
ls build/dev/docs/nix_lib_project/js/highlightjs-erlang.min.js
ls build/dev/docs/nix_lib_project/js/highlightjs-elixir.min.js
ls build/dev/docs/nix_lib_project/js/highlightjs-javascript.min.js
ls build/dev/docs/nix_lib_project/js/highlightjs-typescript.min.js
ls build/dev/docs/nix_lib_project/js/highlightjs-nix.min.js
ls build/dev/docs/nix_lib_project/js/lunr.min.js
ls build/dev/docs/nix_lib_project/js/index.js
ls build/dev/docs/nix_lib_project/fonts/karla-v23-bold-latin-ext.woff2
ls build/dev/docs/nix_lib_project/fonts/karla-v23-bold-latin.woff2
ls build/dev/docs/nix_lib_project/fonts/karla-v23-regular-latin-ext.woff2
ls build/dev/docs/nix_lib_project/fonts/karla-v23-regular-latin.woff2
ls build/dev/docs/nix_lib_project/fonts/ubuntu-mono-v15-regular-cyrillic-ext.woff2
ls build/dev/docs/nix_lib_project/fonts/ubuntu-mono-v15-regular-cyrillic.woff2
ls build/dev/docs/nix_lib_project/fonts/ubuntu-mono-v15-regular-greek-ext.woff2
ls build/dev/docs/nix_lib_project/fonts/ubuntu-mono-v15-regular-greek.woff2
ls build/dev/docs/nix_lib_project/fonts/ubuntu-mono-v15-regular-latin-ext.woff2
ls build/dev/docs/nix_lib_project/fonts/ubuntu-mono-v15-regular-latin.woff2
if: ${{ matrix.run-integration-tests && !matrix.supports-nix }}
test-flake:
name: test-flake
runs-on: ${{ matrix.os }}
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
target:
- x86_64-unknown-linux-gnu
- x86_64-unknown-linux-musl
- aarch64-unknown-linux-gnu
- aarch64-unknown-linux-musl
- x86_64-apple-darwin
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
- os: ubuntu-latest
target: x86_64-unknown-linux-musl
- os: ubuntu-latest
target: aarch64-unknown-linux-gnu
- os: ubuntu-latest
target: aarch64-unknown-linux-musl
- os: macos-12 # intel
target: x86_64-apple-darwin
- os: macos-14 # aarch64
target: aarch64-apple-darwin
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Nix (not ARM MacOS)
uses: nixbuild/nix-quick-install-action@v27
if: ${{ matrix.target != 'aarch64-apple-darwin' }}
- name: Install Nix (ARM MacOS)
uses: cachix/install-nix-action@v25
if: ${{ matrix.target == 'aarch64-apple-darwin' }}
- uses: DeterminateSystems/magic-nix-cache-action@v4
- name: Check Flake
run: nix flake check
- name: Build Flake
run: nix build -L .
- name: Run Flake
run: nix run -L . -- --help
- name: Generate test project
run: |
mkdir .test-flake
cd .test-flake
nix run -L .. -- new newpkg
- name: Build generated project without flake
run: |
# Build to generate manifest.toml
nix run -L ../.. -- build
git add .
working-directory: ./.test-flake/newpkg
- name: Check generated project's flake
run: nix flake check --override-input glistix ../..
working-directory: ./.test-flake/newpkg
- name: Build generated project's flake
run: |
nix build -L --override-input glistix ../.. .
# Ensure build artifacts at 'result'
ls -ltah result/dev/nix
working-directory: ./.test-flake/newpkg
- name: Test 'loadGlistixPackage' on generated project
run: "nix eval -L --override-input glistix ../.. .#lib --apply '(lib: (lib.loadGlistixPackage { }).main { })' --impure"
working-directory: ./.test-flake/newpkg
test-wasm:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/[email protected]
with:
toolchain: 1.81.0
target: wasm32-unknown-unknown
- uses: actions/setup-node@v4
with:
node-version: "18"
- name: Install wasm-pack
run: |
curl -sSL https://rustwasm.github.io/wasm-pack/installer/init.sh | sh
- name: Run wasm tests
run: wasm-pack test --node compiler-wasm
rustfmt:
name: rustfmt
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/[email protected]
with:
toolchain: 1.81.0
components: rustfmt
- run: cargo fmt --all -- --check
# validate:
# name: validate
# runs-on: ubuntu-latest
# timeout-minutes: 10
# steps:
# - name: Checkout repository
# uses: actions/checkout@v4
#
# - name: Install Rust toolchain
# uses: dtolnay/[email protected]
# with:
# toolchain: 1.81.0
#
# - name: Install cargo-deny
# run: |
# set -e
# curl -L https://github.com/EmbarkStudios/cargo-deny/releases/download/0.14.18/cargo-deny-0.14.18-x86_64-unknown-linux-musl.tar.gz | tar xzf -
# mv cargo-deny-*-x86_64-unknown-linux-musl/cargo-deny cargo-deny
# echo `pwd` >> $GITHUB_PATH
#
# - name: Validate deps
# run: cargo deny check
lint-build:
name: lint-build
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/[email protected]
with:
toolchain: 1.81.0
components: clippy
- name: Handle Rust dependencies caching
uses: Swatinem/rust-cache@v2
with:
key: v1-linux-gnu
- name: Run linter
run: cargo clippy --workspace
- run: cargo build
- name: Upload artifact (Ubuntu)
uses: actions/upload-artifact@v4
with:
name: glistix
path: target/debug/glistix
test-projects:
name: test-projects
needs: lint-build
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Deno
uses: denoland/setup-deno@v1
with:
deno-version: v1.x
- name: Install Bun
uses: oven-sh/setup-bun@v2
- name: Install Erlang
uses: erlef/setup-beam@v1
with:
otp-version: "26.1"
elixir-version: "1.16.1"
rebar3-version: "3"
- name: Install Nix
uses: nixbuild/nix-quick-install-action@v27
- name: Download Glistix binary from previous job
uses: actions/download-artifact@v4
with:
name: glistix
path: ./test
- name: Configure test projects to use Glistix binary
run: |
echo $PWD/ >> $GITHUB_PATH
chmod +x ./glistix
sed -i 's/cargo run --quiet --/glistix/' */Makefile
sed -i 's/cargo run --/glistix/' */Makefile
working-directory: ./test
- name: test/language Erlang
run: make clean erlang
working-directory: ./test/language
- name: test/language JavaScript with NodeJS
run: make clean nodejs
working-directory: ./test/language
- name: test/language JavaScript with Deno
run: make clean deno
working-directory: ./test/language
- name: test/language JavaScript with Bun
run: make clean bun
working-directory: ./test/language
- name: test/language Nix
run: make clean nix
working-directory: ./test/language
- name: test/compile_package0
run: make
working-directory: ./test/compile_package0
- name: test/compile_package1
run: make
working-directory: ./test/compile_package1
- name: Test JavaScript prelude
run: make
working-directory: ./test/javascript_prelude
- name: Test export of hex tarball
run: make test
working-directory: ./test/hextarball
- name: Test running modules
run: make test
working-directory: ./test/running_modules