Skip to content

BuildAllAndRelease

BuildAllAndRelease #38

name: BuildAllAndRelease
on:
workflow_dispatch:
branches: [main]
inputs:
release_tag_name:
description: 'release tag name e.g. "knx_vx.y.z"'
required: true
env:
MATRIX: "{
\"config\": [
{
\"name\": \"Windows Latest MSVC\",
\"artifact\": \"Windows-MSVC.tar.xz\",
\"os\": \"windows-latest\",
\"build_type\": \"Release\",
\"cc\": \"cl\",
\"cxx\": \"cl\",
\"environment_script\": \"C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat\",
\"option\": \"-D OC_OSCORE_ENABLED=OFF -DUSE_CONSOLE=OFF\",
\"option_name\": \"unsecured\",
},
{
\"name\": \"Windows Latest MSVC\",
\"artifact\": \"Windows-MSVC.tar.xz\",
\"os\": \"windows-latest\",
\"build_type\": \"Release\",
\"cc\": \"cl\",
\"cxx\": \"cl\",
\"environment_script\": \"C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat\",
\"option\": \"-D OC_OSCORE_ENABLED=ON -DUSE_CONSOLE=OFF\",
\"option_name\": \"secured\",
},
{
\"name\": \"Windows Latest MSVC\",
\"artifact\": \"Windows-MSVC.tar.xz\",
\"os\": \"windows-latest\",
\"build_type\": \"Release\",
\"cc\": \"cl\",
\"cxx\": \"cl\",
\"environment_script\": \"C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat\",
\"option\": \"-D OC_OSCORE_ENABLED=ON -DUSE_CONSOLE=OFF -DOC_DNS_SD_ENABLED=ON\",
\"option_name\": \"secured_mdns\",
},
{
\"name\": \"Windows Latest MSVC\",
\"artifact\": \"Windows-MSVC.tar.xz\",
\"os\": \"windows-latest\",
\"build_type\": \"Release\",
\"cc\": \"cl\",
\"cxx\": \"cl\",
\"environment_script\": \"C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat\",
\"option\": \"-D OC_OSCORE_ENABLED=ON -DUSE_CONSOLE=ON\",
\"option_name\": \"secured_debuginfo\",
},
]
}"
jobs:
# Makes the matrix available to use
setup:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- id: set-matrix
run: echo "matrix=$MATRIX" >> $GITHUB_OUTPUT
# Builds KNX virtual applications for windows
windowsBuilds:
needs: setup
name: Build ${{ matrix.config.name }}
runs-on: ${{ matrix.config.os }}
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.setup.outputs.matrix) }}
steps:
- uses: actions/checkout@v1
- name: Checkout Submodules
run: git submodule update --init --recursive
- name: Download Ninja and CMake
id: cmake_and_ninja
shell: cmake -P {0}
run: |
set(ninja_version "1.9.0")
set(cmake_version "3.25.2")
message(STATUS "Using host CMake version: ${CMAKE_VERSION}")
if ("${{ runner.os }}" STREQUAL "Windows")
set(ninja_suffix "win.zip")
set(cmake_suffix "win64-x64.zip")
set(cmake_dir "cmake-${cmake_version}-win64-x64/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 "Darwin-x86_64.tar.gz")
set(cmake_dir "cmake-${cmake_version}-Darwin-x86_64/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)
# Save the path for other steps
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/${cmake_dir}" cmake_dir)
message("cmake_dir=${cmake_dir}" >> $GITHUB_OUTPUT)
if (NOT "${{ runner.os }}" STREQUAL "Windows")
execute_process(
COMMAND chmod +x ninja
COMMAND chmod +x ${cmake_dir}/cmake
)
endif()
- name: folder creation
run: |
mkdir win_build_${{ matrix.config.option_name }}
cd win_build_${{ matrix.config.option_name }}
ls
- name: Configure
shell: cmake -P {0}
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()
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/ninja" ninja_program)
execute_process(
COMMAND cmake
-S .
-B win_build_${{ matrix.config.option_name }}
-D CMAKE_BUILD_TYPE=${{ matrix.config.build_type }} ${{ matrix.config.option }}
-G Ninja
-D CMAKE_MAKE_PROGRAM=${ninja_program}
RESULT_VARIABLE result
)
if (NOT result EQUAL 0)
message(FATAL_ERROR "Bad exit status")
endif()
- name: Build
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()
execute_process(
COMMAND cmake --build win_build_${{ matrix.config.option_name }}
RESULT_VARIABLE result
)
if (NOT result EQUAL 0)
message(FATAL_ERROR "Bad exit status")
endif()
- name: ls
run: |
cd win_build_${{ matrix.config.option_name }}
ls
- name: Upload executable ${{ matrix.config.option_name }}
uses: actions/upload-artifact@v3
with:
name: windows_knx_iot_virtual_${{ matrix.config.option_name }}
path: |
./win_build_${{ matrix.config.option_name }}/knx_iot_virtual_gui_sa.exe
./win_build_${{ matrix.config.option_name }}/knx_iot_virtual_gui_pb.exe
# Build linux secured
linuxSecured:
needs: setup
# NOTE: Not building with ubuntu-latest on purpose, because that results
# in binaries that can only be run on linux machines with newest version,
# that have glibc 2.34.
# Using ubuntu-20.04 drops that requirement to glibc 2.31.
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Build secured linux binaries
run: |
# https://github.com/actions/checkout/issues/81
auth_header="$(git config --local --get http.https://github.com/.extraheader)"
git submodule sync --recursive
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
# create the make files in a subfolder
mkdir linuxbuild
cd linuxbuild
cmake ../. -DOC_OSCORE_ENABLED=ON
make all
- name: View generated binaries
run: |
cd linuxbuild
ls
- name: Upload secured linux binaries
uses: actions/upload-artifact@v3
with:
name: linux_knx_iot_virtual_secured
path: |
./linuxbuild/knx_iot_virtual_sa
./linuxbuild/knx_iot_virtual_pb
# Build linux unsecured
linuxUnsecured:
needs: setup
# NOTE: Not building with ubuntu-latest on purpose, because that results
# in binaries that can only be run on linux machines with newest version,
# that have glibc 2.34.
# Using ubuntu-20.04 drops that requirement to glibc 2.31.
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Build unsecured linux binaries
run: |
# https://github.com/actions/checkout/issues/81
auth_header="$(git config --local --get http.https://github.com/.extraheader)"
git submodule sync --recursive
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
# create the make files in a subfolder
mkdir linuxbuild
cd linuxbuild
cmake ../. -DOC_OSCORE_ENABLED=OFF
make all
- name: View generated binaries
run: |
cd linuxbuild
ls
- name: Upload secured linux binaries
uses: actions/upload-artifact@v3
with:
name: linux_knx_iot_virtual_unsecured
path: |
./linuxbuild/knx_iot_virtual_sa
./linuxbuild/knx_iot_virtual_pb
makerelease:
needs: [windowsBuilds, linuxSecured, linuxUnsecured]
name: Release archives
runs-on: ubuntu-latest
# Checkout the code, and fetch all tags (for version)
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
path: knx-iot-virtual
- run: |
cd knx-iot-virtual
git fetch --tags
# Figure out what to call the release
- name: Release info
id: releaseinfo
run: |
cd knx-iot-virtual
#echo "version=$(git describe --tags --dirty --always --long | sed -E 's/-g[0-9a-f]+//g')" >> $GITHUB_OUTPUT
echo "version=${{ github.event.inputs.release_tag_name }} " >> $GITHUB_OUTPUT
#echo "title=$(git show -s --format=%B | head -n1)" >> $GITHUB_OUTPUT
echo "title=${{ github.event.inputs.release_tag_name }}" >> $GITHUB_OUTPUT
msg=$(git show -s --format=%B)
#escape special chars
msg="${msg//'%'/'%25'}"
msg="${msg//$'\n'/'%0A'}"
msg="${msg//$'\r'/'%0D'}"
echo "msg=$msg" >> $GITHUB_OUTPUT
# Create a release to publish to
- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.releaseinfo.outputs.version }}
release_name: ${{ steps.releaseinfo.outputs.title }}
body: ${{ steps.releaseinfo.outputs.msg }}
# Download all of the previously uploaded artifacts
- uses: actions/download-artifact@v1
with:
name: linux_knx_iot_virtual_secured
- uses: actions/download-artifact@v1
with:
name: linux_knx_iot_virtual_unsecured
- uses: actions/download-artifact@v1
with:
name: windows_knx_iot_virtual_secured
- uses: actions/download-artifact@v1
with:
name: windows_knx_iot_virtual_unsecured
- uses: actions/download-artifact@v1
with:
name: windows_knx_iot_virtual_secured_debuginfo
# Zip them
- name: Zip the release assets
run: |
zip -r linux_knx_iot_virtual_secured.zip linux_knx_iot_virtual_secured
zip -r linux_knx_iot_virtual_unsecured.zip linux_knx_iot_virtual_unsecured
zip -r windows_knx_iot_virtual_secured.zip windows_knx_iot_virtual_secured
zip -r windows_knx_iot_virtual_unsecured.zip windows_knx_iot_virtual_unsecured
zip -r windows_knx_iot_virtual_secured_debuginfo.zip windows_knx_iot_virtual_secured_debuginfo
- name: Release secured linux
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{steps.create_release.outputs.upload_url}}
asset_path: ./linux_knx_iot_virtual_secured.zip
asset_name: linux_knx_iot_virtual_secured.zip
asset_content_type: application/zip
- name: Release unsecured linux
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{steps.create_release.outputs.upload_url}}
asset_path: ./linux_knx_iot_virtual_unsecured.zip
asset_name: linux_knx_iot_virtual_unsecured.zip
asset_content_type: application/zip
- name: Release secured windows
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{steps.create_release.outputs.upload_url}}
asset_path: ./windows_knx_iot_virtual_secured.zip
asset_name: windows_knx_iot_virtual_secured.zip
asset_content_type: application/zip
- name: Release unsecured windows
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{steps.create_release.outputs.upload_url}}
asset_path: ./windows_knx_iot_virtual_unsecured.zip
asset_name: windows_knx_iot_virtual_unsecured.zip
asset_content_type: application/zip
- name: Release secured debuginfo windows
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{steps.create_release.outputs.upload_url}}
asset_path: ./windows_knx_iot_virtual_secured_debuginfo.zip
asset_name: windows_knx_iot_virtual_secured_debuginfo.zip
asset_content_type: application/zip