Allow any command to support things like cargo-deb

This commit is contained in:
Dave Rolsky 2025-04-12 08:43:44 -05:00
parent 7cb7930e5c
commit ea9defd544
No known key found for this signature in database
6 changed files with 72 additions and 76 deletions

View File

@ -404,3 +404,37 @@ jobs:
- name: Run tests - name: Run tests
shell: bash shell: bash
run: ./validate-inputs.py --test run: ./validate-inputs.py --test
test-other-cargo-commands:
name: Test a "cargo foo" command
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Copy test project to root
shell: bash
run: |
cp -a test-project/* .
rm -fr test-project
- name: Create cargo-foo command
shell: bash
run: |
set -e
set -x
dir="${{ github.workspace }}/bin"
mkdir -p "$dir"
bin="$dir/cargo-foo"
echo "#!/bin/bash" >> "$bin"
echo "echo 'This is cargo-foo!'" >> "$bin"
echo "exit 0" >> "$bin"
chmod 0755 "$bin"
echo "PATH=$dir:$PATH" >> "$GITHUB_ENV"
- name: Run cargo-foo command
uses: ./
with:
command: foo
target: x86_64-unknown-linux-gnu

View File

@ -4,6 +4,9 @@
[dtolnay/rust-toolchain](https://github.com/dtolnay/rust-toolchain) accepts a lot of different [dtolnay/rust-toolchain](https://github.com/dtolnay/rust-toolchain) accepts a lot of different
options that this action wasn't allowing. It's simpler and more flexible to just let that action options that this action wasn't allowing. It's simpler and more flexible to just let that action
handle validation. Requested by @axos88 (Akos Vandra-Meyer). GH #42. handle validation. Requested by @axos88 (Akos Vandra-Meyer). GH #42.
- Removed validation for the `command` input. This allows you to use this action with any `cargo`
extension command, like `cargo-deb`. Setting `command` to `both` is still supported and will run
the `build` and `test` commands. Requested by @bvaisvil (Benjamin Vaisvil). GH #43.
## 1.0.3 - 2025-02-17 ## 1.0.3 - 2025-02-17

View File

@ -70,8 +70,8 @@ Ubuntu x86-64, Windows, and macOS runners.
This action takes the following parameters: This action takes the following parameters:
| Key | Type | Required? | Description | | Key | Type | Required? | Description |
| ----------------------- | -------------------------------------------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ----------------------- | --------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `command` | string (one of `build`, `test`, `both` (build and test), or `bench`) | no | The command(s) to run. The default is `build`. Running the `test` command will fail with \*BSD targets and non-x86 Windows. | | `command` | string | no | The command(s) to run. The default is `build`. Running the `test` command will fail with \*BSD targets and non-x86 Windows. You can use any command supported by `cargo` and/or `cross`. For example, if you install `cargo-deb`, the command can be `deb`. Use the special string "both" to run both `build` and `test. |
| `target` | string | yes | The target triple to compile for. This should be one of the targets found by running `rustup target list`. | | `target` | string | yes | The target triple to compile for. This should be one of the targets found 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 (`.`). | | `working-directory` | string | no | The working directory in which to run the `cargo` or `cross` commands. Defaults to the current directory (`.`). |
| `toolchain` | string) | no | The Rust toolchain version to install. This is passed directly to [dtolnay/rust-toolchain](https://github.com/dtolnay/rust-toolchain), which accepts many different options. See its documentation for more details. The default is `stable`. | | `toolchain` | string) | no | The Rust toolchain version to install. This is passed directly to [dtolnay/rust-toolchain](https://github.com/dtolnay/rust-toolchain), which accepts many different options. See its documentation for more details. The default is `stable`. |

View File

@ -15,7 +15,7 @@ inputs:
command: command:
description: | description: |
The commands to run. This must be one of "build", "test", "both" (build and test), or "bench". The commands to run. Use "both" to run both "build" and "test".
default: build default: build
toolchain: toolchain:
@ -191,51 +191,35 @@ runs:
with: ${{ steps.parse-rust-cache-parameters.outputs }} with: ${{ steps.parse-rust-cache-parameters.outputs }}
if: inputs.use-rust-cache == 'true' if: inputs.use-rust-cache == 'true'
- name: Run tests (*nix) - name: Run cargo test
working-directory: ${{ inputs.working-directory }} working-directory: ${{ inputs.working-directory }}
shell: bash # We want to run in Powershell on Windows to make sure we compile in a native Windows
# environment. Some things won't compile properly under msys, notably OpenSSL, which is
# compiled locally when using the `openssl` crate with the `vendored` feature.
shell: ${{ runner.os == 'Windows' && 'powershell' || 'bash' }}
run: | run: |
${{ steps.set-build-command.outputs.build-command }} test --target ${{ inputs.target }} ${{ inputs.args }} ${{ steps.set-build-command.outputs.build-command }} test --target ${{ inputs.target }} ${{ inputs.args }}
if: steps.determine-cargo-commands.outputs.test == 'true' && runner.os != 'Windows' if: steps.determine-cargo-commands.outputs.test == 'true'
# We want to run in Powershell on Windows to make sure we compile in a - name: Run cargo build
# native Windows environment. Some things won't compile properly under
# msys, notably OpenSSL, which is compiled locally when using the
# `openssl` crate with the `vendored` feature.
- name: Run tests (Windows)
working-directory: ${{ inputs.working-directory }} working-directory: ${{ inputs.working-directory }}
shell: powershell # We want to run in Powershell on Windows to make sure we compile in a native Windows
# environment. Some things won't compile properly under msys, notably OpenSSL, which is
# compiled locally when using the `openssl` crate with the `vendored` feature.
shell: ${{ runner.os == 'Windows' && 'powershell' || 'bash' }}
run: | run: |
& ${{ steps.set-build-command.outputs.build-command }} test --target ${{ inputs.target }} ${{ inputs.args }} ${{ steps.set-build-command.outputs.build-command }} build --target ${{ inputs.target }} ${{ inputs.args }}
if: steps.determine-cargo-commands.outputs.test == 'true' && runner.os == 'Windows' if: steps.determine-cargo-commands.outputs.build == 'true'
- name: Run benchmarks (*nix) - name: Run cargo ${{ steps.determine-cargo-commands.outputs.command }}
working-directory: ${{ inputs.working-directory }} working-directory: ${{ inputs.working-directory }}
shell: bash # We want to run in Powershell on Windows to make sure we compile in a native Windows
# environment. Some things won't compile properly under msys, notably OpenSSL, which is
# compiled locally when using the `openssl` crate with the `vendored` feature.
shell: ${{ runner.os == 'Windows' && 'powershell' || 'bash' }}
run: | run: |
${{ steps.set-build-command.outputs.build-command }} bench --target ${{ inputs.target }} ${{ inputs.args }} ${{ steps.set-build-command.outputs.build-command }} ${{ steps.determine-cargo-commands.outputs.command }} --target ${{ inputs.target }} ${{ inputs.args }}
if: steps.determine-cargo-commands.outputs.bench == 'true' && runner.os != 'Windows' if: steps.determine-cargo-commands.outputs.command != ''
- name: Run benchmarks (Windows)
working-directory: ${{ inputs.working-directory }}
shell: powershell
run: |
& ${{ steps.set-build-command.outputs.build-command }} bench --target ${{ inputs.target }} ${{ inputs.args }}
if: steps.determine-cargo-commands.outputs.bench == 'true' && runner.os == 'Windows'
- name: Build binary (*nix)
working-directory: ${{ inputs.working-directory }}
shell: bash
run: |
${{ steps.set-build-command.outputs.build-command }} build ${{ inputs.args }} --target ${{ inputs.target }}
if: steps.determine-cargo-commands.outputs.build == 'true' && runner.os != 'Windows'
- name: Build binary (Windows)
working-directory: ${{ inputs.working-directory }}
shell: powershell
run: |
& ${{ steps.set-build-command.outputs.build-command }} build ${{ inputs.args }} --target ${{ inputs.target }}
if: steps.determine-cargo-commands.outputs.build == 'true' && runner.os == 'Windows'
- name: Strip binary - name: Strip binary
working-directory: ${{ inputs.working-directory }} working-directory: ${{ inputs.working-directory }}

View File

@ -9,5 +9,5 @@ if [ "$COMMAND" == 'both' ]; then
echo "build=true" >>"$GITHUB_OUTPUT" echo "build=true" >>"$GITHUB_OUTPUT"
echo "test=true" >>"$GITHUB_OUTPUT" echo "test=true" >>"$GITHUB_OUTPUT"
else else
echo "$COMMAND=true" >>"$GITHUB_OUTPUT" echo "command=$COMMAND" >>"$GITHUB_OUTPUT"
fi fi

View File

@ -42,14 +42,6 @@ class InputValidator:
if "target" not in self.inputs: if "target" not in self.inputs:
validation_errors.append("'target' is a required parameter") validation_errors.append("'target' is a required parameter")
# Validate command if present
if "command" in self.inputs:
valid_commands = {"build", "test", "both", "bench"}
if self.inputs["command"] not in valid_commands:
validation_errors.append(
f"Invalid 'command'. Must be one of {sorted(valid_commands)}"
)
# Validate working directory if present # Validate working directory if present
if "working_directory" in self.inputs: if "working_directory" in self.inputs:
path = Path(self.inputs["working_directory"]) path = Path(self.inputs["working_directory"])
@ -135,23 +127,6 @@ class TestInputValidator(unittest.TestCase):
errors = validator.validate() errors = validator.validate()
self.assertTrue(errors) self.assertTrue(errors)
def test_validate_valid_command(self) -> None:
"""Test validation of valid commands."""
valid_commands = ["build", "test", "both", "bench"]
for command in valid_commands:
self.setup_env({"target": "x86_64-unknown-linux-gnu", "command": command})
validator = InputValidator("/root")
errors = validator.validate()
self.assertFalse(errors, f"Command '{command}' should be valid")
def test_validate_invalid_command(self) -> None:
"""Test validation of invalid command."""
self.setup_env({"target": "x86_64-unknown-linux-gnu", "command": "invalid"})
validator = InputValidator("/root")
errors = validator.validate()
self.assertTrue(errors)
def test_validate_valid_toolchain(self) -> None: def test_validate_valid_toolchain(self) -> None:
"""Test validation of valid toolchains.""" """Test validation of valid toolchains."""
valid_toolchains = [ valid_toolchains = [