diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6f3f165..ae1ed55 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -35,6 +35,16 @@ jobs: expect_stripped: "--no-expect-stripped" can_test: true + - platform_name: Linux-aarch64-with-cross-v0.2.3 + os: ubuntu-20.04 + target: aarch64-unknown-linux-musl + cross-version: "v0.2.3" + expect_file_re: "aarch64" + expect_cross: "--expect-cross" + expect_cross_version: "0.2.3" + expect_stripped: "--no-expect-stripped" + can_test: true + - platform_name: Linux-arm os: ubuntu-20.04 target: arm-unknown-linux-musleabi @@ -183,6 +193,7 @@ jobs: uses: ./ with: command: both + cross-version: ${{ matrix.platform.cross-version }} target: ${{ matrix.platform.target }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} if: ${{ matrix.platform.can_test }} @@ -190,6 +201,7 @@ jobs: uses: ./ with: command: test + cross-version: ${{ matrix.platform.cross-version }} target: ${{ matrix.platform.target }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} if: ${{ matrix.platform.can_test }} @@ -197,6 +209,7 @@ jobs: uses: ./ with: command: build + cross-version: ${{ matrix.platform.cross-version }} target: ${{ matrix.platform.target }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} strip: true @@ -204,6 +217,7 @@ jobs: uses: ./ with: command: build + cross-version: ${{ matrix.platform.cross-version }} working-directory: subcrate target: ${{ matrix.platform.target }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -214,5 +228,6 @@ jobs: tests/check-binary.pl \ --target "${{ matrix.platform.target }}" \ --expect-file-re "${{ matrix.platform.expect_file_re }}" \ + --expect-cross-version "${{ matrix.platform.expect_cross_version }}" \ ${{ matrix.platform.expect_cross }} \ ${{ matrix.platform.expect_stripped }} diff --git a/Changes.md b/Changes.md index 1802b2f..b15316e 100644 --- a/Changes.md +++ b/Changes.md @@ -1,3 +1,8 @@ +## 0.0.10 + +- Added a new `cross-version` parameter. This can be specified to make this action use a specific + version of `cross`. If this is not specified, the latest version will be used. + ## 0.0.9 - 2023-09-10 - Added a `working-directory` parameter. By default this is the current directory (`.`) but you can diff --git a/README.md b/README.md index c814be4..b5c7acc 100644 --- a/README.md +++ b/README.md @@ -55,15 +55,16 @@ jobs: This action takes the following parameters: -| Key | Type | Required? | Description | -| ------------------- | ---------------------------------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -| `command` | string (one of `build`, `test`, or `both`) | no | The command(s) to run. The default is `build`. Running the `test` command will fail with \*BSD targets, non-x86 Windows, and macOS ARM. | -| `target` | string | yes | The target triple to compile for. This should be one of the targets listed by running `rustup target list`. | -| `working-directory` | string | no | The working directory in which to run the `cargo` or `cross` commands. Defaults to the current directory (`.`). | -| `toolchain` | string (one of `stable`, `beta`, or `nightly`) | no | The Rust toolchain version to install. The default is `stable`. | -| `GITHUB_TOKEN` | string | no | Defaults to the value of `${{ github.token }}`. | -| `args` | string | no | A string-separated list of arguments to be passed to `cross build`, like `--release --locked`. | -| `strip` | boolean (`true` or `false`) | no | If this is true, then the resulting binary will be stripped if possible. This is only possible for binaries which weren't cross-compiled. | +| Key | Type | Required? | Description | +| ------------------- | ---------------------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `command` | string (one of `build`, `test`, or `both`) | no | The command(s) to run. The default is `build`. Running the `test` command will fail with \*BSD targets, non-x86 Windows, and macOS ARM. | +| `target` | string | yes | The target triple to compile for. This should be one of the targets listed by running `rustup target list`. | +| `working-directory` | string | no | The working directory in which to run the `cargo` or `cross` commands. Defaults to the current directory (`.`). | +| `toolchain` | string (one of `stable`, `beta`, or `nightly`) | no | The Rust toolchain version to install. The default is `stable`. | +| `GITHUB_TOKEN` | string | no | Defaults to the value of `${{ github.token }}`. | +| `args` | string | no | A string-separated list of arguments to be passed to `cross build`, like `--release --locked`. | +| `strip` | boolean (`true` or `false`) | no | If this is true, then the resulting binary will be stripped if possible. This is only possible for binaries which weren't cross-compiled. | +| `cross-version` | string | no | This can be used to set the version of `cross` to use. If specified, it should be a specific `cross` release tag. If this is not set then the latest version will always be used. | ## How it Works diff --git a/action.yml b/action.yml index 2d2c5c4..6f9b85b 100644 --- a/action.yml +++ b/action.yml @@ -32,6 +32,10 @@ inputs: strip: description: Strip the compiled binary default: false + cross-version: + description: | + The version of cross to use. If not specified, then the latest version + will be used. runs: using: composite steps: @@ -47,10 +51,10 @@ runs: with: targets: ${{ inputs.target }} toolchain: ${{ inputs.toolchain }} - - name: Determine latest cross version - id: determine-latest-cross-version + - name: Determine cross version + id: determine-cross-version shell: bash - run: determine-latest-cross-version.sh + run: determine-cross-version.sh "${{ inputs.cross-version }}" env: GITHUB_TOKEN: ${{ inputs.GITHUB_TOKEN }} if: ${{ steps.determine-cross-compile.outputs.needs-cross == 'true' }} @@ -66,11 +70,11 @@ runs: uses: actions/cache@v3 with: path: ${{ steps.set-cross-dir.outputs.cross-dir }}/cross - key: ${{ runner.os }}-${{ steps.determine-latest-cross-version.outputs.cross-version }} + key: ${{ runner.os }}-${{ steps.determine-cross-version.outputs.cross-version }} if: ${{ steps.determine-cross-compile.outputs.needs-cross == 'true' }} - name: Install cross if cross-compiling (*nix) shell: bash - run: install-cross-nix.sh ${{ steps.set-cross-dir.outputs.cross-dir }} + run: install-cross-nix.sh ${{ steps.set-cross-dir.outputs.cross-dir }} ${{ steps.determine-cross-version.outputs.cross-version }} if: ${{ steps.determine-cross-compile.outputs.needs-cross == 'true' && steps.cache-cross.outputs.cache-hit != 'true' }} env: GITHUB_TOKEN: ${{ inputs.GITHUB_TOKEN }} diff --git a/determine-cross-version.sh b/determine-cross-version.sh new file mode 100755 index 0000000..6efde06 --- /dev/null +++ b/determine-cross-version.sh @@ -0,0 +1,15 @@ +set -e +set -x +set -o pipefail + +VERSION=$1 + +if [ -z "$VERSION" ]; then + JSON=$( curl \ + --request GET \ + --header "Authorization: Bearer $GITHUB_TOKEN" \ + https://api.github.com/repos/cross-rs/cross/releases/latest ) + VERSION=$( echo "$JSON" | jq -r ".tag_name") +fi + +echo "cross-version=$VERSION" >> $GITHUB_OUTPUT diff --git a/determine-latest-cross-version.sh b/determine-latest-cross-version.sh deleted file mode 100755 index 90278de..0000000 --- a/determine-latest-cross-version.sh +++ /dev/null @@ -1,11 +0,0 @@ -set -e -set -x -set -o pipefail - -JSON=$( curl \ - --request GET \ - --header "Authorization: Bearer $GITHUB_TOKEN" \ - https://api.github.com/repos/cross-rs/cross/releases/latest ) -VERSION=$( echo "$JSON" | jq -r ".tag_name") - -echo "cross-version=$VERSION" >> $GITHUB_OUTPUT diff --git a/install-cross-nix.sh b/install-cross-nix.sh index fb1dc86..cabd99c 100755 --- a/install-cross-nix.sh +++ b/install-cross-nix.sh @@ -3,9 +3,16 @@ set -x set -o pipefail CROSS_DIR="$1" +VERSION="$2" + +VERSION_ARGS="" +if [ -n "$VERSION" ]; then + VERSION_ARGS="--tag $VERSION" +fi + cd "$CROSS_DIR" export TARGET=. curl --silent --location \ https://raw.githubusercontent.com/houseabsolute/ubi/master/bootstrap/bootstrap-ubi.sh | sh -./ubi --project cross-rs/cross --matching musl --in . +./ubi --project cross-rs/cross --matching musl --in . $VERSION_ARGS diff --git a/tests/check-binary.pl b/tests/check-binary.pl index 2d050bb..df08a63 100755 --- a/tests/check-binary.pl +++ b/tests/check-binary.pl @@ -19,17 +19,22 @@ use Test::More; sub main { my $target; my $expect_cross; + my $expect_cross_version; my $expect_file_re; my $expect_stripped; GetOptions( - 'target=s' => \$target, - 'expect-file-re=s' => \$expect_file_re, - 'expect-cross!' => \$expect_cross, - 'expect-stripped!' => \$expect_stripped, + 'target=s' => \$target, + 'expect-file-re=s' => \$expect_file_re, + 'expect-cross!' => \$expect_cross, + 'expect-cross-version=s' => \$expect_cross_version, + 'expect-stripped!' => \$expect_stripped, ); - check_cross( path( $ENV{RUNNER_TEMP} ), $expect_cross ); + check_cross( + path( $ENV{RUNNER_TEMP} ), $expect_cross, + $expect_cross_version + ); for my $bin ( path( qw( . target ), $target, qw( debug test-project ) ), @@ -41,10 +46,17 @@ sub main { done_testing(); } -sub check_cross ( $bin_dir, $expect_cross ) { +sub check_cross ( $bin_dir, $expect_cross, $expect_cross_version ) { my $cross = $bin_dir->child('cross'); if ($expect_cross) { ok( $cross->is_file && -x $cross, 'found `cross` in $PATH' ); + if ($expect_cross_version) { + my $version = capturex( $cross, '--version' ); + like( + $version, qr/\Q$expect_cross_version/, + 'cross version matches expected version' + ); + } } else { ok( !$cross->exists, 'did not find `cross` in $PATH' );