diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 3acda52..85b25f1 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -10,9 +10,6 @@ defaults: run: shell: bash -env: - CARGO_TARGET_DIR: output - jobs: init: name: Init @@ -33,6 +30,7 @@ jobs: build: needs: ["init"] strategy: + fail-fast: false matrix: include: - name: Windows x86_64 @@ -71,6 +69,9 @@ jobs: with: targets: ${{ matrix.cargo-target }} + - name: Install Just + uses: extractions/setup-just@v1 + - name: Install build tooling (aarch64-unknown-linux-gnu) if: matrix.cargo-target == 'aarch64-unknown-linux-gnu' run: | @@ -79,26 +80,12 @@ jobs: sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu - name: Build binary - run: | - cargo build \ - --locked --release --all-features \ - --target ${{ matrix.cargo-target }} + run: just build --locked --release --target ${{ matrix.cargo-target }} - - name: Create binary archive - run: | - mkdir -p staging - if [ "${{ matrix.runner-os }}" = "windows-latest" ]; then - cp "output/${{ matrix.cargo-target }}/release/lune.exe" staging/ - cd staging - 7z a ../release.zip * - else - cp "output/${{ matrix.cargo-target }}/release/lune" staging/ - cd staging - chmod +x lune - zip ../release.zip * - fi + - name: Create release archive + run: just zip-release ${{ matrix.cargo-target }} - - name: Upload binary artifact + - name: Upload release artifact uses: actions/upload-artifact@v3 with: name: ${{ matrix.artifact-name }} @@ -109,38 +96,19 @@ jobs: runs-on: ubuntu-latest needs: ["init", "build"] steps: - - name: Download binaries + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Just + uses: extractions/setup-just@v1 + + - name: Download releases uses: actions/download-artifact@v3 with: - path: ./binaries + path: ./releases - - name: Discover binaries - run: | - cd ./binaries - echo "" - echo "Binaries dir:" - ls -lhrt - echo "" - echo "Searching for zipped releases..." - for DIR in * ; do - if [ -d "$DIR" ]; then - cd "$DIR" - for FILE in * ; do - if [ ! -d "$FILE" ]; then - if [ "$FILE" = "release.zip" ]; then - echo "Found zipped release '$DIR'" - mv "$FILE" "../$DIR.zip" - rm -rf "../$DIR/" - fi - fi - done - cd .. - fi - done - echo "" - echo "Binaries dir:" - ls -lhrt - cd .. + - name: Unpack releases + run: just unpack-releases "./releases" - name: Create release uses: softprops/action-gh-release@v1 @@ -150,5 +118,5 @@ jobs: name: ${{ needs.init.outputs.version }} tag_name: v${{ needs.init.outputs.version }} fail_on_unmatched_files: true - files: ./binaries/*.zip + files: ./releases/*.zip draft: true diff --git a/.gitignore b/.gitignore index a05cc5f..6f7b83e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,14 @@ # Autogenerated dirs /bin +/out /target +/staging + +/**/bin +/**/out +/**/target +/**/staging # Autogenerated files diff --git a/.justfile b/.justfile index 0db0e59..d29e1c3 100644 --- a/.justfile +++ b/.justfile @@ -1,22 +1,119 @@ -# Run an individual test using the Lune CLI -run-test TEST_NAME: - cargo run -- "tests/{{TEST_NAME}}" +EXT := if os() == "windows" { ".exe" } else { "" } +CWD := invocation_directory() +BIN_NAME := "lune" + +# Default hidden recipe for listing other recipes + cwd +[no-cd] +[no-exit-message] +[private] +default: + #!/usr/bin/env bash + set -euo pipefail + printf "Current directory:\n {{CWD}}\n" + just --list + +# Builds the Lune CLI binary +[no-exit-message] +build *ARGS: + #!/usr/bin/env bash + set -euo pipefail + cargo build --bin {{BIN_NAME}} {{ARGS}} # Run an individual file using the Lune CLI -run-file FILE_NAME: - cargo run -- "{{FILE_NAME}}" +[no-exit-message] +run FILE_PATH: + #!/usr/bin/env bash + set -euo pipefail + cargo run --bin {{BIN_NAME}} -- "{{FILE_PATH}}" # Run tests for the Lune library -test: - cargo test --lib +[no-exit-message] +test *ARGS: + #!/usr/bin/env bash + set -euo pipefail + cargo test --lib -- {{ARGS}} + +# Run tests for the Lune binary +[no-exit-message] +test-bin *ARGS: + #!/usr/bin/env bash + set -euo pipefail + cargo test --bin {{BIN_NAME}} -- {{ARGS}} + +# Apply formatting for all Rust & Luau files +[no-exit-message] +fmt: + #!/usr/bin/env bash + set -euo pipefail + stylua scripts tests types \ + --glob "tests/**/*.luau" \ + --glob "!tests/roblox/rbx-test-files/**" + cargo fmt # Check formatting for all Rust & Luau files +[no-exit-message] fmt-check: #!/usr/bin/env bash set -euo pipefail - stylua scripts --check - stylua types --check - stylua tests --check \ + stylua scripts tests types \ --glob "tests/**/*.luau" \ --glob "!tests/roblox/rbx-test-files/**" cargo fmt --check + +# Zips up the built binary into a single zip file +[no-exit-message] +zip-release TARGET_TRIPLE: + #!/usr/bin/env bash + set -euo pipefail + rm -rf staging + rm -rf release.zip + mkdir -p staging + cp "target/{{TARGET_TRIPLE}}/release/{{BIN_NAME}}{{EXT}}" staging/ + cd staging + if [ "{{os_family()}}" = "windows" ]; then + 7z a ../release.zip * + else + chmod +x {{BIN_NAME}} + zip ../release.zip * + fi + cd "{{CWD}}" + rm -rf staging + +# Used in GitHub workflow to move per-matrix release zips +[no-exit-message] +[private] +unpack-releases RELEASES_DIR: + #!/usr/bin/env bash + set -euo pipefail + # + if [ ! -d "{{RELEASES_DIR}}" ]; then + echo "Releases directory is missing" + exit 1 + fi + # + cd "{{RELEASES_DIR}}" + echo "" + echo "Releases dir:" + ls -lhrt + echo "" + echo "Searching for zipped releases..." + # + for DIR in * ; do + if [ -d "$DIR" ]; then + cd "$DIR" + for FILE in * ; do + if [ ! -d "$FILE" ]; then + if [ "$FILE" = "release.zip" ]; then + echo "Found zipped release '$DIR'" + mv "$FILE" "../$DIR.zip" + rm -rf "../$DIR/" + fi + fi + done + cd .. + fi + done + # + echo "" + echo "Releases dir:" + ls -lhrt