add githubactions packaging (#20)

* Added gitversion,cmake and last commit epoch as patch version

* Switched patch version to use commit hash instead of epoch

* Added CPACK_Version

* added message to output version

* added dockerbuild temp

* workflow fix

* fixed tabs

* fixed depends

* fixed typo

* typo in Dockerfile

* added upload artifact

* added deb_architecture

* added releases

* fixed checkout

* added tags

* fixed release gha

* Added versioning

* switch to use commit_timestamp
pull/13/head
Matthew Hilton 2021-09-24 04:16:29 +01:00 committed by GitHub
parent eb53d31c1d
commit e29f2cd9d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 344 additions and 10 deletions

View File

@ -0,0 +1,162 @@
name: Build and test with docker
on:
push:
tags:
- '*'
jobs:
version:
outputs:
version: ${{ steps.get_version.outputs.version }}
buildname: ${{ steps.get_version.outputs.buildname }}
runs-on: "ubuntu-latest"
steps:
-
name: Checkout repository
uses: actions/checkout@v1
-
name: Get the version
id: get_version
run: |
if [ -z "$version" ]
then
version=$(date '+%Y%m%d')
echo ::set-output name=version::"${version}"
else
echo ::set-output name=version::"${version}"
fi
builddate=$(date '+%Y-%m-%d')
buildhash=$(git rev-parse --short "$GITHUB_SHA")
buildname="${builddate}-${buildhash}"
echo ::set-output name=version::${VERSION}
echo ::set-output name=buildhash::${buildhash}
echo ::set-output name=builddate::${builddate}
echo ::set-output name=buildname::${buildname}
env:
version: ${{ github.event.inputs.version }}
compile:
runs-on: ${{ matrix.host }}
needs: [ version ]
strategy:
fail-fast: false
max-parallel: 3
matrix:
host: [
"ubuntu-latest",
#"macos-10.15",
]
config:
- {
name: "armhf Release",
arch: "armhf"
}
- {
name: "amd64 Release",
arch: "amd64"
}
name: 'Build and Upload release: ${{ matrix.config.name }}'
steps:
- uses: actions/checkout@v2
-
name: Build the Docker image
run: docker build -t aasdk_builder --file buildenv/Dockerfile .
-
name: 'Build ${{ matrix.config.arch }} Debian package'
run: docker run -v "${PWD}/release":/release aasdk_builder:latest ${{ matrix.config.arch }}
-
name: Get Name of Artifact
id: get-artifact-name
run: |
ls -hla
ARTIFACT_PATHNAME=$(ls ./release/*.deb | head -n 1)
ARTIFACT_NAME=$(basename $ARTIFACT_PATHNAME)
echo ::set-output name=artifact_filename::${ARTIFACT_NAME}
echo ::set-output name=artifact_path::${ARTIFACT_PATHNAME}
-
name: Upload build artifacts
id: upload_deploy
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.config.arch }}
path: |
${{ steps.get-artifact-name.outputs.artifact_path }}
# Create Release
release:
runs-on: ubuntu-latest
needs: [ version, compile ]
if: startsWith(github.ref, 'refs/tags/')
name: 'Create release'
outputs:
release_upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps
steps:
- uses: actions/checkout@v2
-
name: Build Changelog
id: github_release
uses: mikepenz/release-changelog-builder-action@v2.4.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-
name: Create GitHub release
id: create_release
uses: softprops/action-gh-release@v0.1.13
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{needs.version.outputs.version }}
release_name: ${{needs.version.outputs.buildname }}
body: ${{steps.github_release.outputs.changelog}}
draft: true
prerelease: true
# Upload release artifacts
upload:
needs: [ version, compile, release ]
runs-on: ${{ matrix.host }}
strategy:
fail-fast: false
max-parallel: 3
matrix:
host: [
"ubuntu-latest",
#"macos-10.15",
]
config:
- {
name: "armhf Release",
arch: "armhf"
}
- {
name: "amd64 Release",
arch: "amd64"
}
name: 'Upload release: ${{ matrix.config.name }}'
steps:
-
name: Download build artifacts
uses: actions/download-artifact@v2
with:
name: ${{ steps.get_version.outputs.version }}
-
name: Get Artifact Filenames
id: get-artifact-name
run: |
ARTIFACT_PATHNAME=$(ls ${{ matrix.config.arch }}/*.deb | head -n 1)
ARTIFACT_NAME=$(basename $ARTIFACT_PATHNAME)
echo ::set-output name=artifact_filename::${ARTIFACT_NAME}
echo ::set-output name=artifact_path::${ARTIFACT_PATHNAME}
-
name: Upload zip to release
id: upload_zip
uses: actions/upload-release-asset@v1.0.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_VERSION: ${{ needs.version.outputs.buildname }}
with:
upload_url: ${{needs.release.outputs.release_upload_url}}
asset_path: ${{ steps.get-artifact-name.outputs.artifact_path }}
asset_name: ${{ steps.get-artifact-name.outputs.artifact_filename }}
asset_content_type: application/vnd.debian.binary-package

View File

@ -1,10 +1,23 @@
cmake_minimum_required(VERSION 3.5.1)
set (AASDK_VERSION_MAJOR 2)
set (AASDK_VERSION_MINOR 1)
set (AASDK_VERSION_PATCH 0)
if( TARGET_ARCH STREQUAL "amd64" )
message("Building for amd64")
elseif( TARGET_ARCH STREQUAL "armhf" )
message("Building for armhf")
set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-gcc-8)
set(CMAKE_CXX_COMPILER /usr/bin/arm-linux-gnueabihf-g++-8)
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "armhf")
else()
message("Unknown target architecture. Exiting")
return()
endif()
set (aasdk_VERSION_MAJOR 3)
set (aasdk_VERSION_MINOR 1)
set (aasdk_VERSION_PATCH 0)
project(aasdk
VERSION ${AASDK_VERSION_MAJOR}.${AASDK_VERSION_MINOR}.${AASDK_VERSION_PATCH}
VERSION ${aasdk_VERSION_MAJOR}.${aasdk_VERSION_MINOR}.${aasdk_VERSION_PATCH}
LANGUAGES CXX)
find_program(CCACHE_PROGRAM ccache)
@ -36,6 +49,10 @@ set(Boost_USE_STATIC_RUNTIME OFF)
add_definitions(-DBOOST_ALL_DYN_LINK)
include(${base_directory}/cmake_modules/gitversion.cmake)
set (aasdk_VERSION_PATCH ${_commit_timestamp})
set (CMAKE_PROJECT_VERSION_PATCH ${aasdk_VERSION_PATCH})
if(WIN32)
set(WINSOCK2_LIBRARIES "ws2_32")
endif(WIN32)
@ -82,9 +99,10 @@ target_link_libraries(aasdk
${OPENSSL_LIBRARIES}
${WINSOCK2_LIBRARIES})
set(AASDK_VERSION_STRING ${AASDK_VERSION_MAJOR}.${AASDK_VERSION_MINOR}.${AASDK_VERSION_PATCH})
set_target_properties(aasdk PROPERTIES VERSION ${AASDK_VERSION_STRING}
SOVERSION ${AASDK_VERSION_MAJOR})
set(aasdk_VERSION_STRING ${aasdk_VERSION_MAJOR}.${aasdk_VERSION_MINOR}.${aasdk_VERSION_PATCH})
message(INFO " Project Version: ${aasdk_VERSION_STRING}")
set_target_properties(aasdk PROPERTIES VERSION ${aasdk_VERSION_STRING}
SOVERSION ${aasdk_VERSION_MAJOR})
install(TARGETS aasdk DESTINATION lib COMPONENT libraries)
install(DIRECTORY include/aasdk DESTINATION include COMPONENT headers)
@ -109,6 +127,7 @@ endif(AASDK_TEST)
SET(CPACK_GENERATOR "DEB")
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "AASDK") #required
SET(CPACK_PACKAGE_VENDOR "AASDK")
set(CPACK_PACKAGE_VERSION ${aasdk_VERSION_STRING})
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libusb-1.0-0,libboost-all-dev,libssl-dev,libprotobuf-dev")
set(CPACK_COMPONENTS_ALL libraries headers Unspecified)

View File

@ -7,9 +7,9 @@ protobuf_generate_cpp(proto_sources proto_headers ${proto_files})
add_library(aasdk_proto SHARED ${proto_headers} ${proto_sources})
target_link_libraries(aasdk_proto ${PROTOBUF_LIBRARIES})
set(AASDK_VERSION_STRING ${AASDK_VERSION_MAJOR}.${AASDK_VERSION_MINOR}.${AASDK_VERSION_PATCH})
set_target_properties(aasdk_proto PROPERTIES VERSION ${AASDK_VERSION_STRING}
SOVERSION ${AASDK_VERSION_MAJOR})
set(aasdk_VERSION_STRING ${aasdk_VERSION_MAJOR}.${aasdk_VERSION_MINOR}.${aasdk_VERSION_PATCH})
set_target_properties(aasdk_proto PROPERTIES VERSION ${aasdk_VERSION_STRING}
SOVERSION ${aasdk_VERSION_MAJOR})
install(TARGETS aasdk_proto DESTINATION lib)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DESTINATION include

View File

@ -0,0 +1,28 @@
FROM debian:buster AS aasdk
RUN dpkg --add-architecture armhf
RUN apt-get update
RUN apt-get -y install cmake build-essential git
RUN apt-get -y install gcc-arm-linux-gnueabihf cpp-arm-linux-gnueabihf g++-arm-linux-gnueabihf protobuf-compiler
RUN apt-get -y install gcc-8-base:armhf libc6:armhf libgcc1:armhf libicu63:armhf libidn2-0:armhf libstdc++6:armhf libunistring2:armhf
# These are all the libboost requirements. It would be shorter if libboost-log-dev wasn't a disaster that's being dealt with manually.
RUN apt-get install -y libprotobuf-dev libusb-1.0.0-dev libssl-dev libboost-dev libboost-system-dev libboost-atomic1.67.0 libboost-chrono1.67.0 libboost-date-time1.67.0 libboost-filesystem1.67.0 libboost-regex1.67.0 libboost-thread1.67.0 libboost-filesystem1.67-dev libboost-thread1.67-dev libboost-date-time1.67-dev
RUN apt-get install -y libprotobuf-dev:armhf libusb-1.0.0-dev:armhf libssl-dev:armhf libboost-dev:armhf libboost-system-dev:armhf libboost-atomic1.67.0:armhf libboost-chrono1.67.0:armhf libboost-date-time1.67.0:armhf libboost-filesystem1.67.0:armhf libboost-regex1.67.0:armhf libboost-system1.67.0:armhf libboost-thread1.67.0:armhf libboost-filesystem1.67-dev:armhf libboost-thread1.67-dev:armhf libboost-date-time1.67-dev:armhf
COPY / /src
WORKDIR /src
# Import resources
COPY ./buildenv/patch-libboost-log-deb.sh /src/resources/patch-libboost-log-deb.sh
COPY ./buildenv/entrypoint.sh /entrypoint.sh
# Patch libboost-log-dev and install
RUN chmod +x ./resources/patch-libboost-log-deb.sh
RUN ./resources/patch-libboost-log-deb.sh
# Make Executable
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]

View File

@ -0,0 +1,28 @@
#!/bin/bash
ARCH=$1
MAJORVER=0
if [ -z "$ARCH" ]
then
echo "Please supply a target architecture to build"
echo "Choose from 'amd64', 'armhf'"
exit
else
if [ "$ARCH" != "amd64" ] && [ "$ARCH" != "armhf" ]
then
echo "Invalid architecture requested"
exit
fi
fi
echo "Now building within docker for $ARCH"
# Clear out the /build directory
mkdir build;
cd build;
cmake -DCMAKE_BUILD_TYPE=Release -DTARGET_ARCH=$ARCH ../
make -j4
cpack --config CPackConfig.cmake
# Move it to release
mv *.deb /release/

View File

@ -0,0 +1,46 @@
# All this because of a packaging bug in libboost-log-dev
# 'Multi-Arch: same' is not present in the control file of Debian packages, all the way up to Sid
# Rather than recompiling the parent libbost suite, download the 6 packages, extract, edit, and repackage.
# https://bugs.debian.org/cgi-bin/pkgreport.cgi?package=libboost-log-dev
apt-get -y install --download-only libboost-log-dev:amd64 libboost-log1.67.0:amd64 libboost-log1.67-dev:amd64
apt-get -y install --download-only libboost-log-dev:armhf libboost-log1.67.0:armhf libboost-log1.67-dev:armhf
mkdir -p /tmp/armhf/libboost-log-dev/
dpkg-deb -x /var/cache/apt/archives/libboost-log-dev_1.67.0.1_armhf.deb /tmp/armhf/libboost-log-dev/
dpkg-deb -e /var/cache/apt/archives/libboost-log-dev_1.67.0.1_armhf.deb /tmp/armhf/libboost-log-dev/DEBIAN/
sed -i '/^Priority: optional/a Multi-Arch: same' /tmp/armhf/libboost-log-dev/DEBIAN/control
dpkg-deb -b /tmp/armhf/libboost-log-dev/ /tmp/libboost-log-dev_1.67.0.1_armhf.deb
mkdir -p /tmp/amd64/libboost-log-dev/
dpkg-deb -x /var/cache/apt/archives/libboost-log-dev_1.67.0.1_amd64.deb /tmp/amd64/libboost-log-dev/
dpkg-deb -e /var/cache/apt/archives/libboost-log-dev_1.67.0.1_amd64.deb /tmp/amd64/libboost-log-dev/DEBIAN/
sed -i '/^Priority: optional/a Multi-Arch: same' /tmp/amd64/libboost-log-dev/DEBIAN/control
dpkg-deb -b /tmp/amd64/libboost-log-dev/ /tmp/libboost-log-dev_1.67.0.1_amd64.deb
mkdir -p /tmp/armhf/libboost-log1.67-dev/
dpkg-deb -x /var/cache/apt/archives/libboost-log1.67-dev_1.67.0-13+deb10u1_armhf.deb /tmp/armhf/libboost-log1.67-dev/
dpkg-deb -e /var/cache/apt/archives/libboost-log1.67-dev_1.67.0-13+deb10u1_armhf.deb /tmp/armhf/libboost-log1.67-dev/DEBIAN/
sed -i '/^Priority: optional/a Multi-Arch: same' /tmp/armhf/libboost-log1.67-dev/DEBIAN/control
dpkg-deb -b /tmp/armhf/libboost-log1.67-dev/ /tmp/libboost-log1.67-dev_1.67.0-13+deb10u1_armhf.deb
mkdir -p /tmp/amd64/libboost-log1.67-dev/
dpkg-deb -x /var/cache/apt/archives/libboost-log1.67-dev_1.67.0-13+deb10u1_amd64.deb /tmp/amd64/libboost-log1.67-dev/
dpkg-deb -e /var/cache/apt/archives/libboost-log1.67-dev_1.67.0-13+deb10u1_amd64.deb /tmp/amd64/libboost-log1.67-dev/DEBIAN/
sed -i '/^Priority: optional/a Multi-Arch: same' /tmp/amd64/libboost-log1.67-dev/DEBIAN/control
dpkg-deb -b /tmp/amd64/libboost-log1.67-dev/ /tmp/libboost-log1.67-dev_1.67.0-13+deb10u1_amd64.deb
mkdir -p /tmp/armhf/libboost-log1.67.0/
dpkg-deb -x /var/cache/apt/archives/libboost-log1.67.0_1.67.0-13+deb10u1_armhf.deb /tmp/armhf/libboost-log1.67.0/
dpkg-deb -e /var/cache/apt/archives/libboost-log1.67.0_1.67.0-13+deb10u1_armhf.deb /tmp/armhf/libboost-log1.67.0/DEBIAN/
sed -i '/^Priority: optional/a Multi-Arch: same' /tmp/armhf/libboost-log1.67.0/DEBIAN/control
dpkg-deb -b /tmp/armhf/libboost-log1.67.0/ /tmp/libboost-log1.67.0_1.67.0-13+deb10u1_armhf.deb
mkdir -p /tmp/amd64/libboost-log1.67.0/
dpkg-deb -x /var/cache/apt/archives/libboost-log1.67.0_1.67.0-13+deb10u1_amd64.deb /tmp/amd64/libboost-log1.67.0/
dpkg-deb -e /var/cache/apt/archives/libboost-log1.67.0_1.67.0-13+deb10u1_amd64.deb /tmp/amd64/libboost-log1.67.0/DEBIAN/
sed -i '/^Priority: optional/a Multi-Arch: same' /tmp/amd64/libboost-log1.67.0/DEBIAN/control
dpkg-deb -b /tmp/amd64/libboost-log1.67.0/ /tmp/libboost-log1.67.0_1.67.0-13+deb10u1_amd64.deb
dpkg -i /tmp/libboost*.deb

View File

@ -0,0 +1,51 @@
# cmake/gitversion.cmake
cmake_minimum_required(VERSION 3.0.0)
message(STATUS "Resolving GIT Version")
set(_build_version "unknown")
set(_commit_timestamp "unknown")
find_package(Git)
if(GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
WORKING_DIRECTORY "${local_dir}"
OUTPUT_VARIABLE _build_version
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD
WORKING_DIRECTORY "${local_dir}"
OUTPUT_VARIABLE _build_branch
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND ${GIT_EXECUTABLE} log -1 --format=%at
WORKING_DIRECTORY "${local_dir}"
OUTPUT_VARIABLE _commit_timestamp
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
message( STATUS "GIT hash: ${_build_version}; branch: ${_build_branch}; Commit epoch: ${_commit_timestamp};")
execute_process(
COMMAND ${GIT_EXECUTABLE} diff --no-ext-diff --quiet
WORKING_DIRECTORY "${local_dir}"
RESULT_VARIABLE ret
)
if(ret EQUAL "1")
set(_build_changes "*")
else()
set(_build_changes "")
endif()
else()
message(STATUS "GIT not found")
endif()
# branch name
# git rev-parse --abbrev-ref HEAD
# changed
# git diff --no-ext-diff --quiet