#150 added test for FVAViewer #857
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Main flow | |
on: | |
push: | |
branches: [ master ] | |
pull_request: | |
branches: [ master ] | |
env: | |
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) | |
CMAKE_VERSION: 3.21.1 | |
NINJA_VERSION: 1.10.2 | |
QT_VERSION : "5.15.2" | |
BUILD_TYPE: Release | |
CCACHE_VERSION: 4.4 | |
jobs: | |
build: | |
name: Building the binaries for ${{ matrix.config.name }} | |
runs-on: ${{ matrix.config.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
config: | |
- { | |
name: "Windows Latest MinGW", artifact: "Windows-MinGW.7z", | |
os: windows-latest, | |
cc: "gcc", cxx: "g++" | |
} | |
# commented to reduce billed execution time | |
#- { | |
# name: "Ubuntu Latest GCC", artifact: "Linux.7z", | |
# os: ubuntu-latest, | |
# cc: "gcc", cxx: "g++" | |
# } | |
#- { | |
# name: "macOS Latest Clang", artifact: "macOS.7z", | |
# os: macos-latest, | |
# cc: "clang", cxx: "clang++" | |
# } | |
steps: | |
- name: Checkout FVA repository | |
uses: actions/checkout@v3 | |
with: #to checkout submodules as well | |
submodules: 'true' | |
- name: Download and configure Ninja and CMake. | |
shell: cmake -P {0} | |
run: | | |
set(cmake_version $ENV{CMAKE_VERSION}) | |
set(ninja_version $ENV{NINJA_VERSION}) | |
message(STATUS "Using host CMake version: ${CMAKE_VERSION}") | |
if ("${{ runner.os }}" STREQUAL "Windows") | |
set(ninja_suffix "win.zip") | |
set(cmake_suffix "windows-x86_64.zip") | |
set(cmake_dir "cmake-${cmake_version}-windows-x86_64/bin") | |
elseif ("${{ runner.os }}" STREQUAL "Linux") | |
set(ninja_suffix "linux.zip") | |
set(cmake_suffix "linux-x86_64.tar.gz") | |
set(cmake_dir "cmake-${cmake_version}-linux-x86_64/bin") | |
elseif ("${{ runner.os }}" STREQUAL "macOS") | |
set(ninja_suffix "mac.zip") | |
set(cmake_suffix "macos-universal.tar.gz") | |
set(cmake_dir "cmake-${cmake_version}-macos-universal/CMake.app/Contents/bin") | |
endif() | |
set(ninja_url "https://github.com/ninja-build/ninja/releases/download/v${ninja_version}/ninja-${ninja_suffix}") | |
file(DOWNLOAD "${ninja_url}" ./ninja.zip SHOW_PROGRESS) | |
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./ninja.zip) | |
set(cmake_url "https://github.com/Kitware/CMake/releases/download/v${cmake_version}/cmake-${cmake_version}-${cmake_suffix}") | |
file(DOWNLOAD "${cmake_url}" ./cmake.zip SHOW_PROGRESS) | |
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./cmake.zip) | |
# Add to PATH environment variable | |
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/${cmake_dir}" cmake_dir) | |
set(path_separator ":") | |
if ("${{ runner.os }}" STREQUAL "Windows") | |
set(path_separator ";") | |
endif() | |
file(APPEND "$ENV{GITHUB_PATH}" "$ENV{GITHUB_WORKSPACE}${path_separator}${cmake_dir}") | |
if (NOT "${{ runner.os }}" STREQUAL "Windows") | |
execute_process( | |
COMMAND chmod +x ninja | |
COMMAND chmod +x ${cmake_dir}/cmake | |
) | |
endif() | |
- name: Download the ccache | |
id: ccache | |
shell: cmake -P {0} | |
run: | | |
set(ccache_url "https://github.com/cristianadam/ccache/releases/download/v$ENV{CCACHE_VERSION}/${{ runner.os }}.tar.xz") | |
file(DOWNLOAD "${ccache_url}" ./ccache.tar.xz SHOW_PROGRESS) | |
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./ccache.tar.xz) | |
- name: Prepare the ccache timestamp | |
id: ccache_cache_timestamp | |
shell: cmake -P {0} | |
run: | | |
string(TIMESTAMP current_date "%Y-%m-%d-%H;%M;%S" UTC) | |
message("::set-output name=timestamp::${current_date}") | |
- name: install GoogleTest | |
if: ${{ steps.cache.output.cache-hit != 'true' }} | |
run: | | |
git clone https://github.com/google/googletest.git --branch release-1.10.0 | |
cd googletest | |
cmake -Bbuild -DCMAKE_INSTALL_PREFIX="$HOME/.local" -Dgtest_force_shared_crt=1 | |
cmake --build build --config Release | |
cmake --build build --target install --config Release | |
cd .. | |
- name: Call the ccache to cache files | |
uses: actions/cache@v3 | |
with: | |
path: .ccache | |
key: ${{ matrix.config.name }}-ccache-${{ steps.ccache_cache_timestamp.outputs.timestamp }} | |
restore-keys: | | |
${{ matrix.config.name }}-ccache- | |
- name: Download and install QT | |
uses: jurplel/install-qt-action@v3 | |
with: | |
version: ${{ env.QT_VERSION }} | |
target: 'desktop' | |
arch: 'win64_mingw81' | |
setup-python : 'false' | |
- name: Configure make files by CMake | |
shell: cmake -P {0} | |
env: | |
CMAKE_PREFIX_PATH: ${{env.Qt5_Dir}} | |
run: | | |
set(ENV{CC} ${{ matrix.config.cc }}) | |
set(ENV{CXX} ${{ matrix.config.cxx }}) | |
if ("${{ runner.os }}" STREQUAL "Windows" AND NOT "x${{ matrix.config.environment_script }}" STREQUAL "x") | |
execute_process( | |
COMMAND "${{ matrix.config.environment_script }}" && set | |
OUTPUT_FILE environment_script_output.txt | |
) | |
file(STRINGS environment_script_output.txt output_lines) | |
foreach(line IN LISTS output_lines) | |
if (line MATCHES "^([a-zA-Z0-9_-]+)=(.*)$") | |
set(ENV{${CMAKE_MATCH_1}} "${CMAKE_MATCH_2}") | |
endif() | |
endforeach() | |
endif() | |
set(path_separator ":") | |
if ("${{ runner.os }}" STREQUAL "Windows") | |
set(path_separator ";") | |
endif() | |
set(ENV{PATH} "$ENV{GITHUB_WORKSPACE}${path_separator}$ENV{PATH}") | |
execute_process( | |
COMMAND cmake | |
-S . | |
-B build | |
-D CMAKE_BUILD_TYPE=$ENV{BUILD_TYPE} | |
-G Ninja | |
-D CMAKE_MAKE_PROGRAM=ninja | |
-D CMAKE_C_COMPILER_LAUNCHER=ccache | |
-D CMAKE_CXX_COMPILER_LAUNCHER=ccache | |
RESULT_VARIABLE result | |
) | |
if (NOT result EQUAL 0) | |
message(FATAL_ERROR "Bad exit status") | |
endif() | |
- name: Build the sources | |
shell: cmake -P {0} | |
run: | | |
set(ENV{NINJA_STATUS} "[%f/%t %o/sec] ") | |
if ("${{ runner.os }}" STREQUAL "Windows" AND NOT "x${{ matrix.config.environment_script }}" STREQUAL "x") | |
file(STRINGS environment_script_output.txt output_lines) | |
foreach(line IN LISTS output_lines) | |
if (line MATCHES "^([a-zA-Z0-9_-]+)=(.*)$") | |
set(ENV{${CMAKE_MATCH_1}} "${CMAKE_MATCH_2}") | |
endif() | |
endforeach() | |
endif() | |
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}" ccache_basedir) | |
set(ENV{CCACHE_BASEDIR} "${ccache_basedir}") | |
set(ENV{CCACHE_DIR} "${ccache_basedir}/.ccache") | |
set(ENV{CCACHE_COMPRESS} "true") | |
set(ENV{CCACHE_COMPRESSLEVEL} "6") | |
set(ENV{CCACHE_MAXSIZE} "400M") | |
if ("${{ matrix.config.cxx }}" STREQUAL "cl") | |
set(ENV{CCACHE_MAXSIZE} "600M") | |
endif() | |
execute_process(COMMAND ccache -p) | |
execute_process(COMMAND ccache -z) | |
execute_process( | |
COMMAND cmake --build build | |
RESULT_VARIABLE result | |
OUTPUT_VARIABLE output | |
ERROR_VARIABLE output | |
ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE | |
) | |
if (NOT result EQUAL 0) | |
string(REGEX MATCH "FAILED:.*$" error_message "${output}") | |
string(REPLACE "\n" "%0A" error_message "${error_message}") | |
message("::error::${error_message}") | |
message(FATAL_ERROR "Build failed") | |
endif() | |
- name: Make the ccache statistics | |
shell: cmake -P {0} | |
run: | | |
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}" ccache_basedir) | |
set(ENV{CCACHE_BASEDIR} "${ccache_basedir}") | |
set(ENV{CCACHE_DIR} "${ccache_basedir}/.ccache") | |
execute_process(COMMAND ccache -s) | |
- name: Run unit tests based on CTests | |
shell: cmake -P {0} | |
run: | | |
include(ProcessorCount) | |
ProcessorCount(N) | |
set(ENV{CTEST_OUTPUT_ON_FAILURE} "ON") | |
execute_process( | |
COMMAND ctest -j ${N} | |
WORKING_DIRECTORY build | |
RESULT_VARIABLE result | |
OUTPUT_VARIABLE output | |
ERROR_VARIABLE output | |
ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE | |
) | |
if (NOT result EQUAL 0) | |
string(REGEX MATCH "[0-9]+% tests.*[0-9.]+ sec.*$" test_results "${output}") | |
string(REPLACE "\n" "%0A" test_results "${test_results}") | |
message("::error::${test_results}") | |
message(FATAL_ERROR "Running tests failed!") | |
endif() | |
#- name: Temp3 | |
# run: dir D:/a/fva/fva/build/Testing/Temporary | |
# Container action is only supported on Linux | |
#- name: Publish Test Results | |
# uses: EnricoMi/publish-unit-test-result-action@v1 | |
# if: always() | |
# with: | |
# files: build/results.xml | |
- name: Install binaries to instdir and stripping them to make binaries smaller by CMake | |
run: cmake --install build --prefix instdir --strip | |
- name: Pack the binaries by 7zip | |
working-directory: instdir | |
run: cmake -E tar cfv ../${{ matrix.config.artifact }} --format=7zip . | |
- name: Upload artifact to git hub storage to use later | |
uses: actions/upload-artifact@v3 | |
with: | |
path: ./${{ matrix.config.artifact }} | |
name: ${{ matrix.config.artifact }} | |
- name: Setup MSBuild | |
if: matrix.config.os == 'windows-latest' | |
uses: microsoft/[email protected] | |
- name: MS package build | |
if: matrix.config.os == 'windows-latest' | |
run: > | |
msbuild ./FVASetupWin/FVASetupWin.wixproj | |
- name: Upload win pkg to git hub storage to use later | |
if: matrix.config.os == 'windows-latest' | |
uses: actions/upload-artifact@v3 | |
with: | |
path: ./FVASetupWin/bin/FVASetupWin.msi | |
name: FVASetupWin.msi | |
- name: Upload LastTest.log to git hub storage to use later | |
if: matrix.config.os == 'windows-latest' | |
uses: actions/upload-artifact@v3 | |
with: | |
path: ./build/Testing/Temporary/LastTest.log | |
name: LastTest.log | |
- name: Upload CTestCostData.txt to git hub storage to use later | |
if: matrix.config.os == 'windows-latest' | |
uses: actions/upload-artifact@v3 | |
with: | |
path: ./build/Testing/Temporary/CTestCostData.txt | |
name: CTestCostData.txt | |
release: | |
if: contains(github.ref, 'tags/v') | |
runs-on: ubuntu-latest | |
needs: build | |
name: Release the product | |
steps: | |
- name: Create Release | |
id: create_release | |
uses: actions/[email protected] | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
tag_name: "v0.0.0" | |
release_name: Release ${{ github.ref }} | |
draft: false | |
prerelease: false | |
- name: Store Release url | |
run: | | |
echo "${{ steps.create_release.outputs.upload_url }}" > ./upload_url | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: ./upload_url | |
name: upload_url | |
publish: | |
if: contains(github.ref, 'tags/v') | |
name: Publish the product for ${{ matrix.config.name }} | |
needs: release | |
runs-on: ${{ matrix.config.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
config: | |
- { | |
name: "Windows Latest MinGW", artifact: "FVASetupWin.msi", | |
os: ubuntu-latest | |
} | |
- { | |
name: "Ubuntu Latest GCC", artifact: "Linux.7z", | |
os: ubuntu-latest | |
} | |
- { | |
name: "macOS Latest Clang", artifact: "macOS.7z", | |
os: ubuntu-latest | |
} | |
steps: | |
- name: Download artifact | |
uses: actions/download-artifact@v1 | |
with: | |
name: ${{ matrix.config.artifact }} | |
path: ./ | |
- name: Download URL | |
uses: actions/download-artifact@v1 | |
with: | |
name: upload_url | |
path: ./ | |
- id: set_upload_url | |
run: | | |
upload_url=`cat ./upload_url` | |
echo ::set-output name=upload_url::$upload_url | |
- name: Upload to Release | |
id: upload_to_release | |
uses: actions/[email protected] | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
upload_url: ${{ steps.set_upload_url.outputs.upload_url }} | |
asset_path: ./${{ matrix.config.artifact }} | |
asset_name: ${{ matrix.config.artifact }} | |
asset_content_type: application/x-gtar |