Skip to content

Commit

Permalink
i#4131: Set up Windows Github Actions
Browse files Browse the repository at this point in the history
Adds two separate jobs on Windows, 32-bit and 64-bit.
We target a VS2017 Win10-1607 image to match what we had on Appveyor.

Modifies the runsuite_wrapper.pl script to *not* fork, since there is
no Cygwin perl available by default.  Instead, we tee to a file.

This is based on the similar work in progress for Dr. Memory:
DynamoRIO/drmemory#23

Issue: #4131
  • Loading branch information
derekbruening committed Dec 5, 2020
1 parent e681f61 commit 1a80e83
Show file tree
Hide file tree
Showing 2 changed files with 144 additions and 8 deletions.
113 changes: 113 additions & 0 deletions .github/workflows/ci-windows.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
# **********************************************************
# Copyright (c) 2020 Google, Inc. All rights reserved.
# **********************************************************

# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# * Neither the name of Google, Inc. nor the names of its contributors may be
# used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
# DAMAGE.

# Github Actions workflow for Windows Continuous Integration testing.

# TODO i#2145: point at Qt5 for testing drgui build.

name: ci-windows
on:
# Run on pushes to master and on pull request changes, including from a
# forked repo with no "push" trigger, while avoiding duplicate triggers.
push:
branches:
- master
pull_request:
types: [opened, reopened, synchronize]

# Manual trigger using the Actions page. May remove when integration complete.
workflow_dispatch:

defaults:
run:
shell: cmd

jobs:
# 32-bit VS2017 and tests:
vs2017-32:
runs-on: windows-2016

steps:
- uses: actions/checkout@v2

- name: Fetch Sources
run: git fetch --no-tags --depth=1 origin master

- name: Download Packages
shell: powershell
run: |
md c:\projects\install
(New-Object System.Net.WebClient).DownloadFile("https://github.com/ninja-build/ninja/releases/download/v1.7.2/ninja-win.zip", "c:\projects\install\ninja.zip")
(New-Object System.Net.WebClient).DownloadFile("http://doxygen.nl/files/doxygen-1.8.19.windows.x64.bin.zip", "c:\projects\install\doxygen.zip")
- name: Run Suite
working-directory: ${{ github.workspace }}
run: |
echo ------ Setting up paths ------
7z x c:\projects\install\ninja.zip -oc:\projects\install\ninja > nul
set PATH=c:\projects\install\ninja;%PATH%
7z x c:\projects\install\doxygen.zip -oc:\projects\install\doxygen > nul
set PATH=c:\projects\install\doxygen;%PATH%
call "C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/VC/Auxiliary/Build/vcvars32.bat"
echo ------ Running suite ------
echo PATH is "%PATH%"
echo Running in directory "%CD%"
perl tests/runsuite_wrapper.pl travis use_ninja 32_only
# 64-bit VS2017 and tests:
vs2017-64:
runs-on: windows-2016

steps:
- uses: actions/checkout@v2

- name: Fetch Sources
run: git fetch --no-tags --depth=1 origin master

- name: Download Packages
shell: powershell
run: |
md c:\projects\install
(New-Object System.Net.WebClient).DownloadFile("https://github.com/ninja-build/ninja/releases/download/v1.7.2/ninja-win.zip", "c:\projects\install\ninja.zip")
(New-Object System.Net.WebClient).DownloadFile("http://doxygen.nl/files/doxygen-1.8.19.windows.x64.bin.zip", "c:\projects\install\doxygen.zip")
- name: Run Suite
working-directory: ${{ github.workspace }}
run: |
echo ------ Setting up paths ------
7z x c:\projects\install\ninja.zip -oc:\projects\install\ninja > nul
set PATH=c:\projects\install\ninja;%PATH%
7z x c:\projects\install\doxygen.zip -oc:\projects\install\doxygen > nul
set PATH=c:\projects\install\doxygen;%PATH%
call "C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/VC/Auxiliary/Build/vcvars32.bat"
echo ------ Running suite ------
echo PATH is "%PATH%"
echo Running in directory "%CD%"
perl tests/runsuite_wrapper.pl travis use_ninja 64_only
39 changes: 31 additions & 8 deletions suite/runsuite_wrapper.pl
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,17 @@

# We tee to stdout to provide incremental output and avoid the 10-min
# no-output timeout on Travis.
print "Forking child for stdout tee\n";
# If we're on UNIX or we have a Cygwin perl, we do this via a fork.
my $res = '';
my $child = open(CHILD, '-|');
die "Failed to fork: $!" if (!defined($child));
my $child = 0;
my $outfile = '';
if ($^O ne 'MSWin32') {
print "Forking child for stdout tee\n";
$child = open(CHILD, '-|');
die "Failed to fork: $!" if (!defined($child));
} else {
$outfile = "runsuite_output.txt";
}
if ($child) {
# Parent
# i#4126: We include extra printing to help diagnose hangs on Travis.
Expand Down Expand Up @@ -134,17 +141,33 @@
}
my $cmd = "ctest -VV -S \"${osdir}/../make/package.cmake${args}\"";
print "Running ${cmd}\n";
system("${cmd} 2>&1");
exit 0;
if ($^O eq 'MSWin32') {
system("${cmd} 2>&1 | tee ${outfile}");
} else {
system("${cmd} 2>&1");
exit 0;
}
} else {
# We have no way to access the log files, so we use -VV to ensure
# we can diagnose failures.
my $verbose = "-VV";
my $cmd = "ctest --output-on-failure ${verbose} -S \"${osdir}/runsuite.cmake${args}\"";
print "Running ${cmd}\n";
system("${cmd} 2>&1");
print "Finished running ${cmd}\n";
exit 0;
if ($^O eq 'MSWin32') {
system("${cmd} 2>&1 | tee ${outfile}");
print "Finished running ${cmd}\n";
} else {
system("${cmd} 2>&1");
print "Finished running ${cmd}\n";
exit 0;
}
}

if ($^O eq 'MSWin32') {
open my $handle, '<', "$outfile" or die "Failed to open teed ${outfile}: $!";
$res = do {
local $/; <$handle>
};
}

my @lines = split('\n', $res);
Expand Down

0 comments on commit 1a80e83

Please sign in to comment.