From 5ba7fecc2c1e6d2a47c7140565b7c06923367c5e Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Mon, 5 Jul 2021 10:39:48 +0300 Subject: workflows/test: factor out steps & refactoring --- .github/actions/check-cc-cygwin/action.yml | 26 +++++++ .github/actions/check-cc/action.yml | 25 +++++++ .github/actions/run-foo/action.yml | 26 +++++++ .github/workflows/test.yml | 115 ++++++++++------------------- 4 files changed, 116 insertions(+), 76 deletions(-) create mode 100644 .github/actions/check-cc-cygwin/action.yml create mode 100644 .github/actions/check-cc/action.yml create mode 100644 .github/actions/run-foo/action.yml diff --git a/.github/actions/check-cc-cygwin/action.yml b/.github/actions/check-cc-cygwin/action.yml new file mode 100644 index 0000000..042709f --- /dev/null +++ b/.github/actions/check-cc-cygwin/action.yml @@ -0,0 +1,26 @@ +name: Check cc/c++ +description: Check cc/c++ (on Cygwin) +runs: + using: composite + steps: + - run: | + check_tool() { + local exe + for exe; do + full_path="$( command -v "$exe" )" + echo "$full_path" + + output="$( "$full_path" --version )" + echo "$output" + + # Is this really the most stable piece of `gcc --version` output? + if ! echo "$output" | grep -F -- "This is free software; see the source for copying conditions."; then + echo 'Unexpected `'"$exe"' --version` output.' >&2 + exit 1 + fi + done + } + + check_tool cc + check_tool c++ + shell: C:\tools\cygwin\bin\bash.exe --login --norc -eo pipefail -o igncr '{0}' diff --git a/.github/actions/check-cc/action.yml b/.github/actions/check-cc/action.yml new file mode 100644 index 0000000..5a6daa8 --- /dev/null +++ b/.github/actions/check-cc/action.yml @@ -0,0 +1,25 @@ +name: Check cc/c++ +description: Check cc/c++ +runs: + using: composite + steps: + - run: | + $version = '${{ inputs.version }}' + + function Check-Exe { + param( + [Parameter(Mandatory=$true)] + [string] $Exe + ) + + echo (Get-Command $Exe).Path + $output = & $Exe --version + echo $output + + # Is this really the most stable piece of `gcc --version` output? + $($output | Select-String -Pattern "This is free software; see the source for copying conditions." -SimpleMatch -Quiet) -or $(throw "Unexpected `$Exe --version` output") + } + + Check-Exe cc + Check-Exe c++ + shell: pwsh diff --git a/.github/actions/run-foo/action.yml b/.github/actions/run-foo/action.yml new file mode 100644 index 0000000..3167545 --- /dev/null +++ b/.github/actions/run-foo/action.yml @@ -0,0 +1,26 @@ +name: Run foo.exe +description: Run foo.exe and verify its output +runs: + using: composite + steps: + - run: | + $expected = @" + Doing something #1 + Doing something #2 + Doing something #3 + "@ + + $actual = & (Join-Path . foo) + $actual = $actual -join [Environment]::NewLine + + echo @" + Expected output: + $expected + "@ + echo @" + Actual output: + $actual + "@ + + $($actual -eq $expected) -or $(throw "Unexpected output!") + shell: pwsh diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5136072..b0c63ba 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,105 +9,68 @@ on: workflow_dispatch: jobs: - test: + cygwin: strategy: - fail-fast: false matrix: platform: [x86, x64] - cygwin: [0, 1] hardlinks: [0, 1] - os: [ubuntu-18.04, ubuntu-20.04, ubuntu-latest, windows-2016, windows-2019, windows-latest] - - include: - # Prettier run names. - - {os: ubuntu-18.04, name: Ubuntu 18.04} - - {os: ubuntu-20.04, name: Ubuntu 20.04} - - {os: ubuntu-latest, name: Ubuntu (latest)} - - {os: windows-2016, name: Windows Server 2016} - - {os: windows-2019, name: Windows Server 2019} - - {os: windows-latest, name: Windows Server (latest)} - - {cygwin: 1, name: Cygwin} - exclude: - # No Cygwin on Ubuntu. - - {os: ubuntu-18.04, cygwin: 1} - - {os: ubuntu-20.04, cygwin: 1} - - {os: ubuntu-latest, cygwin: 1} - # Cygwin is the same on all Windows Server versions. - - {os: windows-2016, cygwin: 1} - - {os: windows-2019, cygwin: 1} - # Only test hardlinks on Cygwin. - - {cygwin: 0, hardlinks: 1} + runs-on: windows-latest + name: 'Cygwin: ${{ matrix.platform }} / hardlinks${{ matrix.hardlinks }}' + defaults: + run: + shell: pwsh + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Install Cygwin + uses: egor-tensin/setup-cygwin@v3 + - name: Set up MinGW + id: setup + uses: ./ + with: + platform: '${{ matrix.platform }}' + cygwin: 1 + cc: 1 + hardlinks: '${{ matrix.hardlinks }}' + - name: Build foo.exe + run: | + & '${{ steps.setup.outputs.gxx }}' -std=c++14 -o foo foo.cpp + - name: Run foo.exe + uses: ./.github/actions/run-foo + - name: Check cc/c++ + uses: ./.github/actions/check-cc + if: matrix.hardlinks + - name: Check cc/c++ + uses: ./.github/actions/check-cc-cygwin + if: '!matrix.hardlinks' + test: + strategy: + matrix: + platform: [x86, x64] + os: [ubuntu-18.04, ubuntu-20.04, ubuntu-latest, windows-2016, windows-2019, windows-latest] runs-on: '${{ matrix.os }}' - - name: '${{ matrix.name }} / ${{ matrix.platform }} / Hardlinks: ${{ matrix.hardlinks }}' - + name: 'Test: ${{ matrix.os }} / ${{ matrix.platform }}' defaults: run: shell: pwsh - steps: - name: Checkout uses: actions/checkout@v2 - - name: Clean up PATH uses: egor-tensin/cleanup-path@v1 if: runner.os == 'Windows' - - - name: Install Cygwin - uses: egor-tensin/setup-cygwin@v3 - if: matrix.cygwin - - name: Set up MinGW id: setup uses: ./ with: platform: '${{ matrix.platform }}' - cygwin: '${{ matrix.cygwin }}' cc: 1 - hardlinks: '${{ matrix.hardlinks }}' - - name: Build foo.exe run: | - $flags = '-std=c++14','-o','foo','foo.cpp' - & '${{ steps.setup.outputs.gxx }}' $flags - + & '${{ steps.setup.outputs.gxx }}' -std=c++14 -o foo foo.cpp - name: Run foo.exe - run: | - $expected = @" - Doing something #1 - Doing something #2 - Doing something #3 - "@ - - $actual = & (Join-Path . foo.exe) - $actual = $actual -join [Environment]::NewLine - - $($actual -eq $expected) -or $(throw @" - Unexpected output: - $actual - "@) + uses: ./.github/actions/run-foo if: runner.os == 'Windows' - - # Is this really the most stable piece of `gcc --version` output? - name: Check cc/c++ - run: | - echo (Get-Command cc).Path - $cc = & cc --version - echo $cc - $($cc | Select-String -Pattern "This is free software; see the source for copying conditions." -SimpleMatch -Quiet) -or $(throw "Unexpected `cc --version` output") - echo (Get-Command c++).Path - $cxx = & c++ --version - echo $cxx - $($cxx | Select-String -Pattern "This is free software; see the source for copying conditions." -SimpleMatch -Quiet) -or $(throw "Unexpected `c++ --version` output") - if: '!matrix.cygwin || matrix.hardlinks' - - - name: Check cc/c++ on Cygwin - run: | - $cc = bash.exe --login -o errexit -c 'cc --version' - echo $cc - $($cc | Select-String -Pattern "This is free software; see the source for copying conditions." -SimpleMatch -Quiet) -or $(throw "Unexpected `cc --version` output") - $cxx = bash.exe --login -o errexit -c 'c++ --version' - echo $cxx - $($cxx | Select-String -Pattern "This is free software; see the source for copying conditions." -SimpleMatch -Quiet) -or $(throw "Unexpected `c++ --version` output") - if: matrix.cygwin && !matrix.hardlinks + uses: ./.github/actions/check-cc -- cgit v1.2.3