Skip to content

VCPKG as primary dependency manager (and internal submodules as optional) #969

VCPKG as primary dependency manager (and internal submodules as optional)

VCPKG as primary dependency manager (and internal submodules as optional) #969

Workflow file for this run

on: [push, pull_request]
env:
# Set this to "on" to enable integration tests and "off" to skip integration tests
RUN_INTEGRATION_TESTS: "on"
name: Build
jobs:
set-lib3mf-version:
runs-on: ubuntu-20.04
outputs:
lib3mf-version: ${{ steps.set-version.outputs.LIB3MF_VERSION }}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Run version extraction script and set environment variable
id: set-version
run: |
LIB3MF_VERSION=$(python CI/ci_cd_helper.py extract-version)
echo "LIB3MF_VERSION=$LIB3MF_VERSION" >> $GITHUB_OUTPUT
- name: Echo version for debug
run: echo "LIB3MF_VERSION=${{ steps.set-version.outputs.LIB3MF_VERSION }}"
build-linux-memtest:
runs-on: ubuntu-20.04
needs: [set-lib3mf-version]
steps:
- run: sudo apt update
- run: sudo apt install -y valgrind uuid-dev
- uses: actions/checkout@v4
with:
submodules: recursive
- run: sh cmake/GenerateMake.sh
- run: cmake --build . --target lib3mf_memcheck
working-directory: ./build
build-linux-ubi8-gcc12:
runs-on: ubuntu-20.04
needs: [set-lib3mf-version]
env:
LIB3MF_VERSION: ${{ needs.set-lib3mf-version.outputs.lib3mf-version }}
steps:
- run: sudo apt update
- run: sudo apt install -y uuid-dev
- uses: actions/checkout@v4
with:
submodules: recursive
- run: mkdir -p build
- run: zip -r build/bindings.zip Autogenerated/Bindings
- name: Archive bindings
uses: actions/upload-artifact@v4
with:
name: bindings.zip
path: build/bindings.zip
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
-
name: Docker Build
uses: docker/build-push-action@v5
with:
context: .
file: ./CI/Dockerfile
platforms: linux/amd64
tags: lib3mf_ubi8:latest
load: true
-
name: Docker Extract
uses: shrink/actions-docker-extract@v3.0.0
id: extract
with:
image: lib3mf_ubi8:latest
path: out.zip
destination: dist
- run: unzip out.zip
working-directory: ./dist
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: lib3mf.so
path: dist/lib3mf.so.2
- name: Extract File Name (CPacked Archive)
run: |
ZIP_FILE=$(ls dist/lib3mf-*.zip)
echo "ARTIFACT_NAME_ZIP=$(basename ${ZIP_FILE})" >> $GITHUB_ENV
shell: bash
- name: Upload Artifact (CPacked Archive)
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME_ZIP }}
path: dist/${{ env.ARTIFACT_NAME_ZIP }}
- name: Extract File Name (Debian)
run: |
DEB_FILE=$(ls dist/lib3mf-*.deb)
echo "ARTIFACT_NAME_DEB=$(basename ${DEB_FILE})" >> $GITHUB_ENV
shell: bash
- name: Upload Artifact (Debian Archive)
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME_DEB }}
path: dist/${{ env.ARTIFACT_NAME_DEB }}
- name: Extract File Name (RPM)
run: |
RPM_FILE=$(ls dist/lib3mf-*.rpm)
echo "ARTIFACT_NAME_RPM=$(basename ${RPM_FILE})" >> $GITHUB_ENV
shell: bash
- name: Upload Artifact (RPM Archive)
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME_RPM }}
path: dist/${{ env.ARTIFACT_NAME_RPM }}
build-macos:
runs-on: macos-latest
needs: [set-lib3mf-version]
env:
LIB3MF_VERSION: ${{ needs.set-lib3mf-version.outputs.lib3mf-version }}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- run: sh cmake/GenerateMake.sh
- run: cmake --build .
working-directory: ./build
- run: ctest -V
working-directory: ./build
- run: cpack -G ZIP -C Release
working-directory: ./build
- name: Extract File Name
run: |
ZIP_FILE=$(ls build/lib3mf-*.zip)
echo "ARTIFACT_NAME=$(basename ${ZIP_FILE})" >> $GITHUB_ENV
shell: bash
- run: ls -al build/
- name: Archive Mac binary
uses: actions/upload-artifact@v4
with:
name: lib3mf.dylib
path: build/lib3mf.${{ env.LIB3MF_VERSION }}.0.dylib
- name: Upload Artifact (CPacked Archive)
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME }}
path: build/${{ env.ARTIFACT_NAME }}
build-macos-debug:
runs-on: macos-latest
needs: [set-lib3mf-version]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- run: sh cmake/GenerateMake.sh "Debug"
- run: cmake --build .
working-directory: ./build
- run: ctest -V
working-directory: ./build
- name: Archive Mac binary
uses: actions/upload-artifact@v4
with:
name: lib3mf.debug.dylib
path: build/lib3mf.dylib
codecoverage-macos:
runs-on: macos-latest
needs: [set-lib3mf-version]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Prerequisites
run: |
brew install lcov
brew install gcovr
- run: sh cmake/GenerateMake.sh -DBUILD_FOR_CODECOVERAGE=ON
- run: cmake --build .
working-directory: ./build
- run: ./Tests/codecoverage/run_codecoverage.sh
- name: Archive Code Coverage Results
uses: actions/upload-artifact@v4
with:
name: codecoverage.zip
path: build/codecoverage.zip
- name: Upload code coverage to codecov
uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./build/Test_CPP_Bindings_filtered.info
fail_ci_if_error: false # optional (default = false)
verbose: true # optional (default = false)
build-windows-release:
runs-on: windows-2019
needs: [set-lib3mf-version]
env:
LIB3MF_VERSION: ${{ needs.set-lib3mf-version.outputs.lib3mf-version }}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- run: ./cmake/GenerateVS2019.bat
- run: cmake --build . --config Release
working-directory: ./build
- run: ctest -V
working-directory: ./build
- run: cpack -G ZIP -C Release
working-directory: ./build
- name: Extract File Name
run: |
$zipFile = Get-ChildItem build\lib3mf-*.zip -Name
echo "ARTIFACT_NAME=$zipFile" | Out-File -FilePath $env:GITHUB_ENV -Append
shell: pwsh
- name: Archive Windows Release binary
uses: actions/upload-artifact@v4
with:
name: lib3mf.dll
path: build/Release/lib3mf.dll
- name: Archive Windows Release lib
uses: actions/upload-artifact@v4
with:
name: lib3mf.lib
path: build/Release/lib3mf.lib
- name: Upload Artifact (CPacked Archive)
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME }}
path: build/${{ env.ARTIFACT_NAME }}
build-windows-debug:
runs-on: windows-2019
needs: [set-lib3mf-version]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- run: ./cmake/GenerateVS2019.bat
- run: cmake --build . --config Debug
working-directory: ./build
- run: ctest -V
working-directory: ./build
- name: Archive Windows Debug binary
uses: actions/upload-artifact@v4
with:
name: lib3mf.debug.dll
path: build/Debug/lib3mf.dll
- uses: actions/upload-artifact@v4
with:
name: lib3mf.pdb
path: build/Debug/lib3mf.pdb
- uses: actions/upload-artifact@v4
with:
name: lib3mf.debug.lib
path: build/Debug/lib3mf.lib
build-windows-32bit:
runs-on: windows-2019
needs: [set-lib3mf-version]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- run: ./cmake/GenerateVS2019_32bit.bat
- run: cmake --build . --config Release
working-directory: ./build_32bit
- run: ctest -V
working-directory: ./build_32bit
- name: Archive Windows 32 bit Release binary
uses: actions/upload-artifact@v4
with:
name: lib3mf_32bit.dll
path: build_32bit/Release/lib3mf.dll
- name: Archive Windows 32 bit Release lib
uses: actions/upload-artifact@v4
with:
name: lib3mf_32bit.lib
path: build_32bit/Release/lib3mf.lib
build-mingw-w64:
runs-on: windows-2019
needs: [set-lib3mf-version]
steps:
- run: choco install mingw -y
- uses: actions/checkout@v4
with:
submodules: recursive
- run: ./cmake/GenerateMinGW.bat
- run: cmake --build .
working-directory: ./build
- run: ctest -V
working-directory: ./build
assemble-sdk:
runs-on: ubuntu-20.04
needs: [set-lib3mf-version, build-windows-release, build-macos, build-linux-ubi8-gcc12]
env:
LIB3MF_VERSION: ${{ needs.set-lib3mf-version.outputs.lib3mf-version }}
steps:
- run: sudo apt install -y zip unzip
- run: mkdir build
- uses: actions/checkout@v4
with:
submodules: false
- name: Download all workflow run artifacts
uses: actions/download-artifact@v4
with:
path: ./build
- run: ls -Rlh ./build
- run: unzip bindings.zip/bindings.zip
working-directory: ./build
- run: bash SDK/GenerateSDK_github.sh
- name: Archive SDK artifact (Comprehensive)
uses: actions/upload-artifact@v4
with:
name: lib3mf_sdk.zip
path: build/lib3mf_sdk.zip
deploy-linux:
runs-on: ubuntu-20.04
needs: [set-lib3mf-version, assemble-sdk]
env:
LIB3MF_VERSION: ${{ needs.set-lib3mf-version.outputs.lib3mf-version }}
steps:
- run: sudo apt install -y zip unzip file
- run: pwd
- run: ls -Rl .
- name: Download lib3mf_sdk artifact
uses: actions/download-artifact@v4
with:
name: lib3mf_sdk.zip
path: lib3mf_sdk.zip
- run: ls -Rl .
- name: Unpack the SDK
run: |
unzip lib3mf_sdk.zip/lib3mf_sdk.zip
- name: Build CppDynamic
run: |
sh Examples/CppDynamic/GenerateMake.sh
cd Examples/CppDynamic/build
cmake --build .
./Example_ExtractInfo ../../Files/Helix.3mf
- name: Build Cpp
run: |
sh Examples/Cpp/GenerateMake.sh
cd Examples/Cpp/build
cmake --build .
./Example_ExtractInfo ../../Files/Helix.3mf
- name: Python Bindings
run: |
python Examples/Python/extract_info.py Examples/Files/Helix.3mf
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: true
- run: ls -Rl
- name: Download lib3mf cpack (Linux)
uses: actions/download-artifact@v4
with:
name: lib3mf-${{ env.LIB3MF_VERSION }}-Linux.zip
path: lib3mf-${{ env.LIB3MF_VERSION }}-Linux.zip
- name: Unpack the cpacked SDK
run: |
unzip lib3mf-${{ env.LIB3MF_VERSION }}-Linux.zip/lib3mf-${{ env.LIB3MF_VERSION }}-Linux.zip && ls -Rl
- name: Build CppDynamic - CPack (Linux)
run: |
sh SDK/CPackExamples/CppDynamic/GenerateMake.sh
cd SDK/CPackExamples/CppDynamic/build
cmake --build .
./Example_ExtractInfo ../../../Examples/Files/Helix.3mf
- name: Build Cpp - CPack (Linux)
run: |
sh SDK/CPackExamples/Cpp/GenerateMake.sh
cd SDK/CPackExamples/Cpp/build
cmake --build .
./Example_ExtractInfo ../../../Examples/Files/Helix.3mf
- name: Download lib3mf (Debian Linux)
uses: actions/download-artifact@v4
with:
name: lib3mf-${{ env.LIB3MF_VERSION }}-Linux.deb
path: lib3mf-${{ env.LIB3MF_VERSION }}-Linux.deb
- name: Check the file type
run: |
file lib3mf-${{ env.LIB3MF_VERSION }}-Linux.deb
file lib3mf-${{ env.LIB3MF_VERSION }}-Linux.deb/lib3mf-${{ env.LIB3MF_VERSION }}-Linux.deb
- run: pwd
- run: ls -Rl .
- name: Install the debian package
run: |
sudo dpkg -i lib3mf-${{ env.LIB3MF_VERSION }}-Linux.deb/lib3mf-${{ env.LIB3MF_VERSION }}-Linux.deb
- name: Build CppDynamic - CPack (Debian)
run: |
sh SDK/CPackExamples/CppDynamic/GenerateMake.sh
cd SDK/CPackExamples/CppDynamic/build
cmake --build .
./Example_ExtractInfo ../../../Examples/Files/Helix.3mf
- name: Build Cpp - CPack (Debian)
run: |
sh SDK/CPackExamples/Cpp/GenerateMake.sh
cd SDK/CPackExamples/Cpp/build
cmake --build .
./Example_ExtractInfo ../../../Examples/Files/Helix.3mf
deploy-windows:
runs-on: windows-2019
needs: [set-lib3mf-version, assemble-sdk]
env:
LIB3MF_VERSION: ${{ needs.set-lib3mf-version.outputs.lib3mf-version }}
steps:
- name: Download lib3mf_sdk artifact
uses: actions/download-artifact@v4
with:
name: lib3mf_sdk.zip
path: lib3mf_sdk.zip
- name: Unpack the SDK
run: |
unzip lib3mf_sdk.zip/lib3mf_sdk.zip
- name: Build CppDynamic
run: |
./Examples/CppDynamic/GenerateVS2019.bat
cd Examples/CppDynamic/build
cmake --build . --config Release
./Release/Example_ExtractInfo.exe ../../Files/Helix.3mf
- name: Build Cpp
run: |
./Examples/Cpp/GenerateVS2019.bat
cd Examples/Cpp/build
cmake --build . --config Release
./Release/Example_ExtractInfo.exe ../../Files/Helix.3mf
- name: Python Bindings
run: |
python Examples/Python/extract_info.py Examples/Files/Helix.3mf
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: true
- name: Download lib3mf cpack (Windows)
uses: actions/download-artifact@v4
with:
name: lib3mf-${{ env.LIB3MF_VERSION }}-Windows.zip
path: lib3mf-${{ env.LIB3MF_VERSION }}-Windows.zip
- name: Unpack the cpacked SDK
run: |
unzip lib3mf-${{ env.LIB3MF_VERSION }}-Windows.zip/lib3mf-${{ env.LIB3MF_VERSION }}-Windows.zip
- name: Build CppDynamic - CPack (Windows)
run: |
./SDK/CPackExamples/CppDynamic/GenerateVS2019.bat
cd SDK/CPackExamples/CppDynamic/build
cmake --build . --config Release
./Release/Example_ExtractInfo.exe ../../../Examples/Files/Helix.3mf
- name: Build Cpp - CPack (Windows)
run: |
./SDK/CPackExamples/Cpp/GenerateVS2019.bat
cd SDK/CPackExamples/Cpp/build
cmake --build . --config Release
./Release/Example_ExtractInfo.exe ../../../Examples/Files/Helix.3mf
deploy-macos:
runs-on: macos-latest
needs: [set-lib3mf-version, assemble-sdk]
env:
LIB3MF_VERSION: ${{ needs.set-lib3mf-version.outputs.lib3mf-version }}
steps:
- name: Download lib3mf_sdk artifact
uses: actions/download-artifact@v4
with:
name: lib3mf_sdk.zip
path: lib3mf_sdk.zip
- name: Unpack the SDK
run: |
unzip lib3mf_sdk.zip/lib3mf_sdk.zip
- name: Build CppDynamic
run: |
sh Examples/CppDynamic/GenerateMake.sh
cd Examples/CppDynamic/build
cmake --build .
ls -al
./Example_ExtractInfo ../../Files/Helix.3mf
- name: Build Cpp
run: |
sh Examples/Cpp/GenerateMake.sh
cd Examples/Cpp/build
cmake --build .
./Example_ExtractInfo ../../Files/Helix.3mf
- name: Python Bindings
run: |
python Examples/Python/extract_info.py Examples/Files/Helix.3mf
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: true
- name: Download lib3mf cpack (Darwin)
uses: actions/download-artifact@v4
with:
name: lib3mf-${{ env.LIB3MF_VERSION }}-Darwin.zip
path: lib3mf-${{ env.LIB3MF_VERSION }}-Darwin.zip
- run: ls -Rl .
- name: Unpack the cpacked SDK (Darwin)
run: |
unzip lib3mf-${{ env.LIB3MF_VERSION }}-Darwin.zip/lib3mf-${{ env.LIB3MF_VERSION }}-Darwin.zip
- name: Build CppDynamic - CPack (Darwin)
run: |
sh SDK/CPackExamples/CppDynamic/GenerateMake.sh
cd SDK/CPackExamples/CppDynamic/build
cmake --build .
./Example_ExtractInfo ../../../Examples/Files/Helix.3mf
- name: Build Cpp - CPack (Darwin)
run: |
sh SDK/CPackExamples/Cpp/GenerateMake.sh
cd SDK/CPackExamples/Cpp/build
cmake --build .
./Example_ExtractInfo ../../../Examples/Files/Helix.3mf
deploy-source-code-with-submodules:
runs-on: ubuntu-20.04
needs: [ set-lib3mf-version, assemble-sdk ]
env:
LIB3MF_VERSION: ${{ needs.set-lib3mf-version.outputs.lib3mf-version }}
steps:
- uses: actions/checkout@v4
with:
submodules: true
- run: |
mkdir -p lib3mf-${{ env.LIB3MF_VERSION }}-source-with-submodules
rsync -av --progress . ./lib3mf-${{ env.LIB3MF_VERSION }}-source-with-submodules --exclude .git --exclude .gitignore --exclude .github --exclude .gitmodules --exclude *.yml --exclude lib3mf-${{ env.LIB3MF_VERSION }}-source-with-submodules
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: lib3mf-${{ env.LIB3MF_VERSION }}-source-with-submodules
path: lib3mf-${{ env.LIB3MF_VERSION }}-source-with-submodules
set-integration-tests-status:
runs-on: ubuntu-20.04
needs: [ deploy-linux, deploy-windows, deploy-macos, deploy-source-code-with-submodules ]
outputs:
run_integration_tests: ${{ steps.set-status.outputs.run_integration_tests }}
steps:
- name: Set status
id: set-status
run: |
if [ "${{ env.RUN_INTEGRATION_TESTS }}" == "on" ]; then
echo "run_integration_tests=true" >> $GITHUB_OUTPUT
else
echo "run_integration_tests=false" >> $GITHUB_OUTPUT
fi
integration-tests-latest-release:
runs-on: ubuntu-20.04
needs: [set-integration-tests-status]
if: needs.set-integration-tests-status.outputs.run_integration_tests == 'true' # Single check before the job starts
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: true
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.8'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
- name: Get latest lib3mf SDK release info from GitHub API
id: get_lib3mf_release
run: |
echo "LATEST_LIB3MF_URL=$(python CI/ci_cd_helper.py fetch-sdk-url 0 | xargs)" >> $GITHUB_ENV
- name: Download latest lib3mf SDK zip
run: |
wget ${{ env.LATEST_LIB3MF_URL }} -O latest_lib3mf_sdk.zip
- name: Unpack the SDK
run: |
unzip latest_lib3mf_sdk.zip -d lib3mf_sdk
mv lib3mf_sdk/lib3mf_sdk/* lib3mf_sdk/
rmdir lib3mf_sdk/lib3mf_sdk
- name: Build CppDynamic
run: |
sh lib3mf_sdk/Examples/CppDynamic/GenerateMake.sh
cd lib3mf_sdk/Examples/CppDynamic/build
cmake --build .
./Example_ExtractInfo ../../Files/Helix.3mf
- name: Download and unzip test suite
run: |
wget https://github.com/3MFConsortium/test_suites/releases/download/v2.0.0/3MF_Conformance_Test_Suites_v2.0.0.zip
unzip 3MF_Conformance_Test_Suites_v2.0.0.zip -d test_suites
- name: List files
run: |
ls -al
- name: Copy integration test script
run: |
cp CI/integration_test.py test_suites/ && cp -r lib3mf_sdk/Examples/CppDynamic/build/* test_suites/
- name: Run integration tests
run: |
cd test_suites && /usr/bin/time -v python integration_test.py 2>&1 | tee latest_sdk_test.log
- name: Print results (Checks the total python script execution time)
run: |
LATEST_TIME=$(grep "Elapsed (wall clock) time" test_suites/latest_sdk_test.log | awk '{print $8}')
LATEST_TOTAL_SECONDS=$(echo $LATEST_TIME | awk -F: '{ print ($1 * 60) + $2 }')
echo "Latest SDK execution time in seconds: ${LATEST_TOTAL_SECONDS}"
LATEST_MUSTPASS=$(grep "MUSTPASS files passed" test_suites/latest_sdk_test.log | awk '{print $1}')
LATEST_TOTAL_MUSTPASS=$(grep "MUSTPASS files passed" test_suites/latest_sdk_test.log | awk '{print $3}' | tr -d '()')
LATEST_MUSTFAIL=$(grep "MUSTFAIL files failed" test_suites/latest_sdk_test.log | awk '{print $1}')
LATEST_TOTAL_MUSTFAIL=$(grep "MUSTFAIL files failed" test_suites/latest_sdk_test.log | awk '{print $3}' | tr -d '()')
echo "MUSTPASS: ${LATEST_MUSTPASS} / ${LATEST_TOTAL_MUSTPASS}"
echo "MUSTFAIL: ${LATEST_MUSTFAIL} / ${LATEST_TOTAL_MUSTFAIL}"
integration-tests-last-two-releases:
runs-on: ubuntu-20.04
needs: [set-integration-tests-status]
if: needs.set-integration-tests-status.outputs.run_integration_tests == 'true' # Single check before the job starts
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: true
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.8'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
- name: Get latest lib3mf SDK release info from GitHub API
id: get_latest_release
run: |
echo "LATEST_LIB3MF_URL=$(python CI/ci_cd_helper.py fetch-sdk-url 0 | xargs)" >> $GITHUB_ENV
- name: Get second latest lib3mf SDK release info from GitHub API
id: get_second_latest_release
run: |
echo "SECOND_LATEST_LIB3MF_URL=$(python CI/ci_cd_helper.py fetch-sdk-url 1 | xargs)" >> $GITHUB_ENV
- name: Download latest lib3mf SDK zip
run: |
wget ${{ env.LATEST_LIB3MF_URL }} -O latest_lib3mf_sdk.zip
- name: Download second latest lib3mf SDK zip
run: |
wget ${{ env.SECOND_LATEST_LIB3MF_URL }} -O second_latest_lib3mf_sdk.zip
- name: Unpack the latest SDK
run: |
unzip latest_lib3mf_sdk.zip -d latest_lib3mf_sdk
mv latest_lib3mf_sdk/lib3mf_sdk/* latest_lib3mf_sdk
rmdir latest_lib3mf_sdk/lib3mf_sdk
- name: Unpack the second latest SDK
run: |
unzip second_latest_lib3mf_sdk.zip -d second_latest_lib3mf_sdk
- name: Download and unzip test suite
run: |
wget https://github.com/3MFConsortium/test_suites/releases/download/v2.0.0/3MF_Conformance_Test_Suites_v2.0.0.zip
unzip 3MF_Conformance_Test_Suites_v2.0.0.zip -d test_suites
- name: Copy integration test script
run: |
cp CI/integration_test.py test_suites/
- name: Build and run CppDynamic with latest SDK
run: |
sh latest_lib3mf_sdk/Examples/CppDynamic/GenerateMake.sh
cd latest_lib3mf_sdk/Examples/CppDynamic/build
cmake --build .
cp -r * ../../../../test_suites/
- name: Run integration tests with latest SDK
run: |
cd test_suites
/usr/bin/time -v python integration_test.py 2>&1 | tee latest_sdk_test.log
- name: Clean up latest SDK binaries
run: |
find test_suites -maxdepth 1 -type f ! -name 'integration_test.py' ! -name 'latest_sdk_test.log' ! -name 'second_latest_sdk_test.log' -exec rm -rf {} +
- name: Build and run CppDynamic with second latest SDK
run: |
sh second_latest_lib3mf_sdk/Examples/CppDynamic/GenerateMake.sh
cd second_latest_lib3mf_sdk/Examples/CppDynamic/build
cmake --build .
echo "First debug"
ls -al ../../../../
echo "This will fail"
cp -r * ../../../../test_suites/
- name: Run integration tests with second latest SDK
run: |
cd test_suites
/usr/bin/time -v python integration_test.py 2>&1 | tee second_latest_sdk_test.log
- name: Compare results (Checks the total python script execution time and must pass/fail counts)
run: |
LATEST_TIME=$(grep "Elapsed (wall clock) time" test_suites/latest_sdk_test.log | awk '{print $8}')
SECOND_LATEST_TIME=$(grep "Elapsed (wall clock) time" test_suites/second_latest_sdk_test.log | awk '{print $8}')
LATEST_TOTAL_SECONDS=$(echo $LATEST_TIME | awk -F: '{ print ($1 * 60) + $2 }')
SECOND_LATEST_TOTAL_SECONDS=$(echo $SECOND_LATEST_TIME | awk -F: '{ print ($1 * 60) + $2 }')
echo "Latest SDK execution time in seconds: ${LATEST_TOTAL_SECONDS}"
echo "Second Latest SDK execution time in seconds: ${SECOND_LATEST_TOTAL_SECONDS}"
LATEST_MUSTPASS=$(grep "MUSTPASS files passed" test_suites/latest_sdk_test.log | awk '{print $1}')
LATEST_TOTAL_MUSTPASS=$(grep "MUSTPASS files passed" test_suites/latest_sdk_test.log | awk '{print $3}' | tr -d '()')
SECOND_LATEST_MUSTPASS=$(grep "MUSTPASS files passed" test_suites/second_latest_sdk_test.log | awk '{print $1}')
SECOND_LATEST_TOTAL_MUSTPASS=$(grep "MUSTPASS files passed" test_suites/second_latest_sdk_test.log | awk '{print $3}' | tr -d '()')
LATEST_MUSTFAIL=$(grep "MUSTFAIL files failed" test_suites/latest_sdk_test.log | awk '{print $1}')
LATEST_TOTAL_MUSTFAIL=$(grep "MUSTFAIL files failed" test_suites/latest_sdk_test.log | awk '{print $3}' | tr -d '()')
SECOND_LATEST_MUSTFAIL=$(grep "MUSTFAIL files failed" test_suites/second_latest_sdk_test.log | awk '{print $1}')
SECOND_LATEST_TOTAL_MUSTFAIL=$(grep "MUSTFAIL files failed" test_suites/second_latest_sdk_test.log | awk '{print $3}' | tr -d '()')
echo "Latest MUSTPASS: ${LATEST_MUSTPASS} / ${LATEST_TOTAL_MUSTPASS}"
echo "Second Latest MUSTPASS: ${SECOND_LATEST_MUSTPASS} / ${SECOND_LATEST_TOTAL_MUSTPASS}"
echo "Latest MUSTFAIL: ${LATEST_MUSTFAIL} / ${LATEST_TOTAL_MUSTFAIL}"
echo "Second Latest MUSTFAIL: ${SECOND_LATEST_MUSTFAIL} / ${SECOND_LATEST_TOTAL_MUSTFAIL}"
# Compare the total seconds
if (( $(echo "$LATEST_TOTAL_SECONDS < $SECOND_LATEST_TOTAL_SECONDS" | bc -l) )); then
echo "New release is better in execution time"
else
echo "New release is worse in execution time"
fi
# Compare MUSTPASS and MUSTFAIL counts
if [ "$LATEST_MUSTPASS" != "$SECOND_LATEST_MUSTPASS" ] || [ "$LATEST_MUSTFAIL" != "$SECOND_LATEST_MUSTFAIL" ]; then
echo "MUSTPASS or MUSTFAIL counts have changed"
exit 1
else
echo "MUSTPASS and MUSTFAIL counts are consistent"
fi
integration-tests-latest-commit:
runs-on: ubuntu-20.04
needs: [set-integration-tests-status]
if: needs.set-integration-tests-status.outputs.run_integration_tests == 'true' # Single check before the job starts
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: true
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.8'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
- name: Download lib3mf_sdk artifact
uses: actions/download-artifact@v4
with:
name: lib3mf_sdk.zip
path: lib3mf_sdk.zip
- name: Unpack the SDK
run: |
unzip lib3mf_sdk.zip/lib3mf_sdk.zip -d lib3mf_sdk && ls -al
- name: Build CppDynamic
run: |
sh lib3mf_sdk/Examples/CppDynamic/GenerateMake.sh
cd lib3mf_sdk/Examples/CppDynamic/build
cmake --build .
./Example_ExtractInfo ../../Files/Helix.3mf
- name: Download and unzip test suite
run: |
wget https://github.com/3MFConsortium/test_suites/releases/download/v2.0.0/3MF_Conformance_Test_Suites_v2.0.0.zip
unzip 3MF_Conformance_Test_Suites_v2.0.0.zip -d test_suites
- name: Copy integration test script
run: |
cp CI/integration_test.py test_suites/ && cp -r lib3mf_sdk/Examples/CppDynamic/build/* test_suites/
- name: Run integration tests
run: |
cd test_suites && /usr/bin/time -v python integration_test.py 2>&1 | tee latest_sdk_test.log
- name: Print results (Checks the total python script execution time)
run: |
LATEST_TIME=$(grep "Elapsed (wall clock) time" test_suites/latest_sdk_test.log | awk '{print $8}')
LATEST_TOTAL_SECONDS=$(echo $LATEST_TIME | awk -F: '{ print ($1 * 60) + $2 }')
echo "Latest SDK execution time in seconds: ${LATEST_TOTAL_SECONDS}"
LATEST_MUSTPASS=$(grep "MUSTPASS files passed" test_suites/latest_sdk_test.log | awk '{print $1}')
LATEST_TOTAL_MUSTPASS=$(grep "MUSTPASS files passed" test_suites/latest_sdk_test.log | awk '{print $3}' | tr -d '()')
LATEST_MUSTFAIL=$(grep "MUSTFAIL files failed" test_suites/latest_sdk_test.log | awk '{print $1}')
LATEST_TOTAL_MUSTFAIL=$(grep "MUSTFAIL files failed" test_suites/latest_sdk_test.log | awk '{print $3}' | tr -d '()')
echo "MUSTPASS: ${LATEST_MUSTPASS} / ${LATEST_TOTAL_MUSTPASS}"
echo "MUSTFAIL: ${LATEST_MUSTFAIL} / ${LATEST_TOTAL_MUSTFAIL}"
# Save counts for comparison in other jobs
echo "LATEST_MUSTPASS=${LATEST_MUSTPASS}" >> $GITHUB_ENV
echo "LATEST_TOTAL_MUSTPASS=${LATEST_TOTAL_MUSTPASS}" >> $GITHUB_ENV
echo "LATEST_MUSTFAIL=${LATEST_MUSTFAIL}" >> $GITHUB_ENV
echo "LATEST_TOTAL_MUSTFAIL=${LATEST_TOTAL_MUSTFAIL}" >> $GITHUB_ENV
integration-test-last-commit-and-last-release:
runs-on: ubuntu-20.04
needs: [set-integration-tests-status]
if: needs.set-integration-tests-status.outputs.run_integration_tests == 'true' # Single check before the job starts
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: true
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.8'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
- name: Download lib3mf_sdk artifact
uses: actions/download-artifact@v4
with:
name: lib3mf_sdk.zip
path: lib3mf_sdk.zip
- name: Unpack the SDK
run: |
unzip lib3mf_sdk.zip/lib3mf_sdk.zip -d latest_commit_lib3mf_sdk && ls -al
- name: Build CppDynamic with latest commit SDK
run: |
sh latest_commit_lib3mf_sdk/Examples/CppDynamic/GenerateMake.sh
cd latest_commit_lib3mf_sdk/Examples/CppDynamic/build
cmake --build .
./Example_ExtractInfo ../../Files/Helix.3mf
- name: Download and unzip test suite
run: |
wget https://github.com/3MFConsortium/test_suites/releases/download/v2.0.0/3MF_Conformance_Test_Suites_v2.0.0.zip
unzip 3MF_Conformance_Test_Suites_v2.0.0.zip -d test_suites
- name: Copy integration test script
run: |
cp CI/integration_test.py test_suites/
- name: Copy latest commit SDK to test suite
run: |
cp -r latest_commit_lib3mf_sdk/Examples/CppDynamic/build/* test_suites/
- name: Run integration tests with latest commit SDK
run: |
cd test_suites && /usr/bin/time -v python integration_test.py 2>&1 | tee latest_commit_sdk_test.log
- name: Clean up latest SDK binaries
run: |
find test_suites -maxdepth 1 -type f ! -name 'integration_test.py' ! -name '*.log' -exec rm -rf {} +
- name: Get latest lib3mf SDK release info from GitHub API
id: get_latest_release
run: |
echo "LATEST_LIB3MF_URL=$(python CI/ci_cd_helper.py fetch-sdk-url 0 | xargs)" >> $GITHUB_ENV
LATEST_RELEASE_NAME=$(curl -s https://api.github.com/repos/3MFConsortium/lib3mf/releases/latest | grep '"tag_name"' | cut -d '"' -f 4)
echo "LATEST_RELEASE_NAME=${LATEST_RELEASE_NAME}" >> $GITHUB_ENV
- name: Download latest lib3mf SDK release zip
run: |
wget ${{ env.LATEST_LIB3MF_URL }} -O latest_release_lib3mf_sdk.zip
- name: Unpack the SDK from latest release
run: |
unzip latest_release_lib3mf_sdk.zip -d latest_release_lib3mf_sdk
mv latest_release_lib3mf_sdk/lib3mf_sdk/* latest_release_lib3mf_sdk/
rmdir latest_release_lib3mf_sdk/lib3mf_sdk/
- name: Build CppDynamic with latest release SDK
run: |
sh latest_release_lib3mf_sdk/Examples/CppDynamic/GenerateMake.sh
cd latest_release_lib3mf_sdk/Examples/CppDynamic/build
cmake --build .
./Example_ExtractInfo ../../Files/Helix.3mf
- name: Copy latest release SDK to test suite
run: |
cp -r latest_release_lib3mf_sdk/Examples/CppDynamic/build/* test_suites/
- name: Run integration tests with latest release SDK
run: |
cd test_suites && /usr/bin/time -v python integration_test.py 2>&1 | tee latest_release_sdk_test.log
- name: Compare results (Checks the total python script execution time)
id: compare_results
run: |
LATEST_COMMIT_TIME=$(grep "Elapsed (wall clock) time" test_suites/latest_commit_sdk_test.log | awk '{print $8}')
LATEST_RELEASE_TIME=$(grep "Elapsed (wall clock) time" test_suites/latest_release_sdk_test.log | awk '{print $8}')
LATEST_COMMIT_TOTAL_SECONDS=$(echo $LATEST_COMMIT_TIME | awk -F: '{ print ($1 * 60) + $2 }')
LATEST_RELEASE_TOTAL_SECONDS=$(echo $LATEST_RELEASE_TIME | awk -F: '{ print ($1 * 60) + $2 }')
echo "Latest commit SDK execution time in seconds: ${LATEST_COMMIT_TOTAL_SECONDS}"
echo "Latest release SDK execution time in seconds: ${LATEST_RELEASE_TOTAL_SECONDS}"
LATEST_COMMIT_MUSTPASS=$(grep "MUSTPASS files passed" test_suites/latest_commit_sdk_test.log | awk '{print $1}')
LATEST_TOTAL_COMMIT_MUSTPASS=$(grep "MUSTPASS files passed" test_suites/latest_commit_sdk_test.log | awk '{print $3}' | tr -d '()')
LATEST_RELEASE_MUSTPASS=$(grep "MUSTPASS files passed" test_suites/latest_release_sdk_test.log | awk '{print $1}')
LATEST_TOTAL_RELEASE_MUSTPASS=$(grep "MUSTPASS files passed" test_suites/latest_release_sdk_test.log | awk '{print $3}' | tr -d '()')
LATEST_COMMIT_MUSTFAIL=$(grep "MUSTFAIL files failed" test_suites/latest_commit_sdk_test.log | awk '{print $1}')
LATEST_TOTAL_COMMIT_MUSTFAIL=$(grep "MUSTFAIL files failed" test_suites/latest_commit_sdk_test.log | awk '{print $3}' | tr -d '()')
LATEST_RELEASE_MUSTFAIL=$(grep "MUSTFAIL files failed" test_suites/latest_release_sdk_test.log | awk '{print $1}')
LATEST_TOTAL_RELEASE_MUSTFAIL=$(grep "MUSTFAIL files failed" test_suites/latest_release_sdk_test.log | awk '{print $3}' | tr -d '()')
echo "Latest commit MUSTPASS: ${LATEST_COMMIT_MUSTPASS} / ${LATEST_TOTAL_COMMIT_MUSTPASS}"
echo "Latest release MUSTPASS: ${LATEST_RELEASE_MUSTPASS} / ${LATEST_TOTAL_RELEASE_MUSTPASS}"
echo "Latest commit MUSTFAIL: ${LATEST_COMMIT_MUSTFAIL} / ${LATEST_TOTAL_COMMIT_MUSTFAIL}"
echo "Latest release MUSTFAIL: ${LATEST_RELEASE_MUSTFAIL} / ${LATEST_TOTAL_RELEASE_MUSTFAIL}"
# Compare MUSTPASS and MUSTFAIL counts
if [ "$LATEST_COMMIT_MUSTPASS" != "$LATEST_RELEASE_MUSTPASS" ] || [ "$LATEST_COMMIT_MUSTFAIL" != "$LATEST_RELEASE_MUSTFAIL" ]; then
echo "MUSTPASS or MUSTFAIL counts have changed"
exit 1
else
echo "MUSTPASS and MUSTFAIL counts are consistent"
fi
# Compare the total seconds
if (( $(echo "$LATEST_COMMIT_TOTAL_SECONDS < $LATEST_RELEASE_TOTAL_SECONDS" | bc -l) )); then
echo "Latest commit is better"
else
echo "Latest release is better"
fi
echo "Latest commit with SHA ${{ github.sha }} ran in ${LATEST_COMMIT_TOTAL_SECONDS} seconds" > results.txt
echo "Latest release with tag ${{ env.LATEST_RELEASE_NAME }} ran in ${LATEST_RELEASE_TOTAL_SECONDS} seconds" >> results.txt
echo "Latest commit MUSTPASS: ${LATEST_COMMIT_MUSTPASS} / ${LATEST_TOTAL_COMMIT_MUSTPASS}" >> results.txt
echo "Latest release MUSTPASS: ${LATEST_RELEASE_MUSTPASS} / ${LATEST_TOTAL_RELEASE_MUSTPASS}" >> results.txt
echo "Latest commit MUSTFAIL: ${LATEST_COMMIT_MUSTFAIL} / ${LATEST_TOTAL_COMMIT_MUSTFAIL}" >> results.txt
echo "Latest release MUSTFAIL: ${LATEST_RELEASE_MUSTFAIL} / ${LATEST_TOTAL_RELEASE_MUSTFAIL}" >> results.txt
- name: Upload results artifact
uses: actions/upload-artifact@v4
with:
name: integration-test-results
path: results.txt