diff --git a/.azure.yml b/.azure.yml index 74604fea..27bacf46 100644 --- a/.azure.yml +++ b/.azure.yml @@ -1,5 +1,11 @@ jobs: + +###################### +###### Linux ######### +###################### + - job: Linux + timeoutInMinutes: 120 pool: vmImage: 'ubuntu-16.04' strategy: @@ -7,9 +13,11 @@ jobs: AMD64 (x64): dockerTag: 'amd64' dockerName: 'Debian Stretch (AMD64)' + platform: 'x11' i386 (x86): dockerTag: 'i386' dockerName: 'Debian Stretch (i386)' + platform: 'x11' ARMv6hf (Raspberry Pi v1 & ZERO): dockerTag: 'armv6hf' dockerName: 'Debian Stretch (Raspberry Pi v1 & ZERO)' @@ -22,27 +30,122 @@ jobs: dockerTag: 'aarch64' dockerName: 'ARMv8 (Generic AARCH64)' platform: 'amlogic' + steps: - - checkout: self - submodules: recursive + - checkout: self # represents the repo where the initial Pipelines YAML file was found + submodules: recursive # set to 'recursive' to get submodules of submodules + + # read channel tag in version.json + - task: oneLuckiDevJson2Variable@1 + inputs: + jsonFile: 'version.json' + shouldPrefixVariables: true + variablePrefix: 'json' + displayName: 'Read and generate pipeline variables' + + # build process - bash: ./.ci/ci_build.sh displayName: 'Build $(dockerName)' env: DOCKER_TAG: $(dockerTag) DOCKER_NAME: $(dockerName) PLATFORM: $(platform) - - bash: ./.ci/ci_deploy.sh - displayName: 'Upload $(dockerName)' + + # copy files + - bash: 'cp -v deploy/Hyperion.NG-* $(Build.ArtifactStagingDirectory)' + workingDirectory: '$(Build.SourcesDirectory)' + condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: 'Collecting deployable artifacts' + + # publish artifacts + - task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: '$(Build.ArtifactStagingDirectory)' + ArtifactName: $(dockerTag) + condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: 'Publish deployables artifacts' + + # set release to pre-release + - bash: echo '##vso[task.setvariable variable=preRelease;]true' + condition: and(succeeded(), contains(variables['json.channel'], 'beta'), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: 'Mark beta as pre-release' + + # create or update github release + - task: GithubRelease@0 + inputs: + gitHubConnection: Hyperion.NG + repositoryName: $(Build.Repository.Name) + action: edit + target: $(Build.SourceVersion) + tagSource: manual + tag: $(Build.SourceBranchName) + assets: '$(Build.ArtifactStagingDirectory)/*' + assetUploadMode: 'replace' + addChangeLog: false + isPreRelease: $(preRelease) + condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: Create/Update GitHub release + +###################### +###### macOS ######### +###################### - job: macOS + timeoutInMinutes: 120 pool: vmImage: 'macOS-10.13' + steps: - - checkout: self - submodules: recursive + - checkout: self # represents the repo where the initial Pipelines YAML file was found + submodules: recursive # set to 'recursive' to get submodules of submodules + + # read channel tag in version.json + - task: oneLuckiDevJson2Variable@1 + inputs: + jsonFile: 'version.json' + shouldPrefixVariables: true + variablePrefix: 'json' + displayName: 'Read and generate pipeline variables' + + # install dependencies - bash: ./.ci/ci_install.sh displayName: 'Install dependencies' + + # build process - bash: ./.ci/ci_build.sh displayName: 'Build macOS 10.13' - - bash: ./.ci/ci_deploy.sh - displayName: 'Upload macOS 10.13' + + # copy files + - bash: 'cp -v build/Hyperion.NG-* $(Build.ArtifactStagingDirectory)' + workingDirectory: '$(Build.SourcesDirectory)' + condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: 'Collecting deployable artifacts' + + # publish artifacts + - task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: '$(Build.ArtifactStagingDirectory)' + ArtifactName: 'macos' + condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: 'Publish deployables artifacts' + + # set release to pre-release + - bash: echo '##vso[task.setvariable variable=preRelease;]true' + condition: and(succeeded(), contains(variables['json.channel'], 'beta'), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: 'Mark beta as pre-release' + + # create or update github release + - task: GithubRelease@0 + inputs: + gitHubConnection: Hyperion.NG + repositoryName: $(Build.Repository.Name) + action: edit + target: $(Build.SourceVersion) + tagSource: manual + tag: '$(Build.SourceBranchName)' + assets: '$(Build.ArtifactStagingDirectory)/*' + assetUploadMode: 'replace' + addChangeLog: false + isPreRelease: $(preRelease) + condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: Create/Update GitHub release diff --git a/.ci/ci_build.sh b/.ci/ci_build.sh index 016dae6e..29a8638d 100755 --- a/.ci/ci_build.sh +++ b/.ci/ci_build.sh @@ -14,47 +14,28 @@ else CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')" fi -# set environment variables -BUILD_TYPE="Debug" -PACKAGES="" -[ -z "${PLATFORM}" ] && PLATFORM="x11" - -# Detect number of processor cores -# default is 4 jobs -if [[ "$CI_NAME" == 'osx' || "$CI_NAME" == 'darwin' ]]; then - JOBS=$(sysctl -n hw.ncpu) - PLATFORM=osx -elif [[ "$CI_NAME" == 'linux' ]]; then - JOBS=$(nproc) -fi -echo "compile jobs: ${JOBS:=4}" +# set environment variables if not exists +[ -z "${BUILD_TYPE}" ] && BUILD_TYPE="Debug" # Determine cmake build type; tag builds are Release, else Debug -if [ -n "${TRAVIS_TAG:-}" ] || [[ $BUILD_SOURCEBRANCH == *"refs/tags"* ]]; then +if [[ $BUILD_SOURCEBRANCH == *"refs/tags"* ]]; then BUILD_TYPE=Release fi -# Determine package creation; True for cron/schedule and tag builds -if [ "${TRAVIS_EVENT_TYPE:-}" == 'cron' ] || [ -n "${TRAVIS_TAG:-}" ] || [[ $BUILD_REASON == "Schedule" ]] || [[ $BUILD_SOURCEBRANCH == *"refs/tags"* ]]; then - PACKAGES="package" -fi - # Determie -dev appends to platform; # Commented because tests are currently broken # [ "${TRAVIS_EVENT_TYPE:-}" != 'cron' -a -z "${TRAVIS_TAG:-}" ] && PLATFORM=${PLATFORM}-dev -# Build the package on osx or docker for linux +# Build the package on osx or linux if [[ "$CI_NAME" == 'osx' || "$CI_NAME" == 'darwin' ]]; then # compile prepare mkdir build || exit 1 mkdir ${CI_BUILD_DIR}/deploy || exit 1 cd build - cmake -DPLATFORM=$PLATFORM -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=/usr .. || exit 2 - make -j ${JOBS} ${PACKAGES} || exit 3 - echo "---> Copy binaries and packages to folder: ${CI_BUILD_DIR}/deploy" - cp -v ${CI_BUILD_DIR}/build/bin/h* ${CI_BUILD_DIR}/deploy/ 2>/dev/null || : && - cp -v ${CI_BUILD_DIR}/build/Hyperion-* ${CI_BUILD_DIR}/deploy/ 2>/dev/null || : && + cmake -DPLATFORM="osx" -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=/usr/local ../ || exit 2 + make -j $(sysctl -n hw.ncpu) package || exit 3 exit 0; + exit 1 || { echo "---> Hyperion compilation failed! Abort"; exit 4; } elif [[ "$CI_NAME" == 'linux' ]]; then echo "Compile Hyperion with DOCKER_TAG = ${DOCKER_TAG} and friendly name DOCKER_NAME = ${DOCKER_NAME}" # take ownership of deploy dir @@ -65,13 +46,12 @@ elif [[ "$CI_NAME" == 'linux' ]]; then -v "${CI_BUILD_DIR}/deploy:/deploy" \ -v "${CI_BUILD_DIR}:/source:ro" \ hyperionproject/hyperion-ci:$DOCKER_TAG \ - /bin/bash -c "mkdir build && cp -r source/. /build && - cd /build && mkdir build && cd build && - cmake -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} .. || exit 2 && - make -j ${JOBS} ${PACKAGES} || exit 3 && - echo '---> Copy binaries and packages to host folder: ${CI_BUILD_DIR}/deploy' && - cp -v /build/build/bin/h* /deploy/ 2>/dev/null || : && - cp -v /build/build/Hyperion-* /deploy/ 2>/dev/null || : && + /bin/bash -c "mkdir hyperion.ng && cp -r source/. /hyperion.ng && + cd /hyperion.ng && mkdir build && cd build && + cmake -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DDOCKER_PLATFORM=${DOCKER_TAG} ../ || exit 2 && + make -j $(nproc) package || exit 3 && + cp /hyperion.ng/build/bin/h* /deploy/ 2>/dev/null || : && + cp /hyperion.ng/build/Hyperion.NG-* /deploy/ 2>/dev/null || : && exit 0; exit 1 " || { echo "---> Hyperion compilation failed! Abort"; exit 4; } diff --git a/.ci/ci_deploy.sh b/.ci/ci_deploy.sh deleted file mode 100755 index df3ef780..00000000 --- a/.ci/ci_deploy.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash - -# detect CI -if [ -n "${TRAVIS-}" ]; then - # Travis-CI - CI_NAME="$(echo "$TRAVIS_OS_NAME" | tr '[:upper:]' '[:lower:]')" - CI_BUILD_DIR="$TRAVIS_BUILD_DIR" -elif [ "$SYSTEM_COLLECTIONID" != "" ]; then - # Azure Pipelines - CI_NAME="$(echo "$AGENT_OS" | tr '[:upper:]' '[:lower:]')" - CI_BUILD_DIR="$BUILD_SOURCESDIRECTORY" -else - # for executing in non ci environment - CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')" -fi - -# sf_upload -# { -# echo "Uploading following files: ${1} to dir /hyperion-project/${2}" -# -# } - -# append current Date to filename (just packages no binaries) -appendDate() -{ - D=$(date +%Y-%m-%d) - for F in $CI_BUILD_DIR/deploy/Hy* - do - mv "$F" "${F%.*}-$D.${F##*.}" - done -} - -# append friendly name (just packages no binaries) -appendName() -{ - for F in $CI_BUILD_DIR/deploy/Hy* - do - mv "$F" "${F%.*}-($DOCKER_NAME).${F##*.}" - done -} - -# get all files to deploy (just packages no binaries) -getFiles() -{ - FILES="" - for f in $CI_BUILD_DIR/deploy/Hy*; - do FILES+="${f} "; - done; -} - -if [[ $CI_NAME == 'linux' || "$CI_NAME" == 'osx' || "$CI_NAME" == 'darwin' ]]; then - if [[ -n $TRAVIS_TAG ]] || [[ $BUILD_SOURCEBRANCH == *"refs/tags"* ]]; then - echo "tag upload" - appendName - appendDate - getFiles - # sf_upload $FILES release - elif [[ $TRAVIS_EVENT_TYPE == 'cron' ]] || [[ $BUILD_REASON == "Schedule" ]]; then - echo "cron/schedule upload" - appendName - appendDate - getFiles - # sf_upload $FILES dev/alpha - else - echo "Direct pushed no upload, PRs not possible" - fi -fi diff --git a/.travis.yml b/.travis.yml index 38bd18bb..44ad22bf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -60,6 +60,4 @@ jobs: script: - ./.ci/ci_build.sh -after_success: - - ./.ci/ci_deploy.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d030199..46610df8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,11 +18,37 @@ if(CCACHE_FOUND) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) endif(CCACHE_FOUND) -SET ( HYPERION_VERSION_STABLE OFF ) -SET ( HYPERION_VERSION_MAJOR 2 ) -SET ( HYPERION_VERSION_MINOR 0 ) -SET ( HYPERION_VERSION_PATCH 0 ) +# Read version from version.json +EXECUTE_PROCESS ( + COMMAND python test/jsonchecks/version.py ${PROJECT_SOURCE_DIR}/version.json + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE RETURN_VERSION +) +SET( VERSION_REGEX "[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9_]+)?" ) +IF( ${RETURN_VERSION} MATCHES ${VERSION_REGEX}) + STRING(REGEX MATCHALL "[0-9]+|-([A-Za-z0-9_]+)" VERSION_PARTS ${RETURN_VERSION} ) + LIST( GET VERSION_PARTS 0 VERSION_MAJOR ) + LIST( GET VERSION_PARTS 1 VERSION_MINOR ) + LIST( GET VERSION_PARTS 2 VERSION_PATCH ) +ELSE( ${RETURN_VERSION} MATCHES ${VERSION_REGEX} ) + message( FATAL_ERROR "Failed to parse version.json string properly. Expect X.Y.Z.") +ENDIF() + +SET( HYPERION_VERSION_MAJOR ${VERSION_MAJOR} ) +SET( HYPERION_VERSION_MINOR ${VERSION_MINOR} ) +SET( HYPERION_VERSION_PATCH ${VERSION_PATCH} ) + +# Read channel from version.json +EXECUTE_PROCESS ( + COMMAND python test/jsonchecks/version.py ${PROJECT_SOURCE_DIR}/version.json "channel" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE RETURN_CHANNEL +) + +SET ( HYPERION_VERSION_CHANNEL ${RETURN_CHANNEL} ) + +# Set build variables SET ( DEFAULT_AMLOGIC OFF ) SET ( DEFAULT_DISPMANX OFF ) SET ( DEFAULT_OSX OFF ) @@ -121,9 +147,10 @@ if ( "${PLATFORM}" MATCHES "-dev" ) SET ( DEFAULT_TESTS ON ) endif() -STRING( TOUPPER "-DPLATFORM_${PLATFORM}" PLATFORM_DEFINE) -STRING( REPLACE "-DEV" "" PLATFORM_DEFINE "${PLATFORM_DEFINE}" ) -ADD_DEFINITIONS( ${PLATFORM_DEFINE} ) +# is this necessary? +# STRING( TOUPPER "-DPLATFORM_${PLATFORM}" PLATFORM_DEFINE) +# STRING( REPLACE "-DEV" "" PLATFORM_DEFINE "${PLATFORM_DEFINE}" ) +# ADD_DEFINITIONS( ${PLATFORM_DEFINE} ) # set the build options option(ENABLE_AMLOGIC "Enable the AMLOGIC video grabber" ${DEFAULT_AMLOGIC} ) diff --git a/HyperionConfig.h.in b/HyperionConfig.h.in index ddb8874e..b121c88a 100644 --- a/HyperionConfig.h.in +++ b/HyperionConfig.h.in @@ -42,6 +42,6 @@ #define HYPERION_VERSION_MAJOR "${HYPERION_VERSION_MAJOR}" #define HYPERION_VERSION_MINOR "${HYPERION_VERSION_MINOR}" #define HYPERION_VERSION_PATCH "${HYPERION_VERSION_PATCH}" -#define HYPERION_VERSION "${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}" +#define HYPERION_VERSION "${HYPERION_VERSION_CHANNEL}.${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}" #define HYPERION_JSON_VERSION "1.0.0" diff --git a/cmake/FindGitVersion.cmake b/cmake/FindGitVersion.cmake index b48f70ca..1cb1a7d0 100644 --- a/cmake/FindGitVersion.cmake +++ b/cmake/FindGitVersion.cmake @@ -7,4 +7,5 @@ STRING ( STRIP "${BUILD_ID}" BUILD_ID ) STRING ( STRIP "${VERSION_ID}" VERSION_ID ) STRING ( STRIP "${GIT_REMOTE_PATH}" GIT_REMOTE_PATH ) SET ( HYPERION_BUILD_ID "${VERSION_ID} (${BUILD_ID}) Git Remote: ${GIT_REMOTE_PATH}" ) -message ( STATUS "Current Version: ${HYPERION_BUILD_ID}" ) +SET ( HYPERION_VERSION "${HYPERION_VERSION_CHANNEL}.${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}" ) +message ( STATUS "Current Version: ${HYPERION_VERSION} (${HYPERION_BUILD_ID})" ) diff --git a/cmake/packages.cmake b/cmake/packages.cmake index 5e9765b3..aaa25fe7 100644 --- a/cmake/packages.cmake +++ b/cmake/packages.cmake @@ -24,10 +24,16 @@ ENDIF() # Apply to all packages, some of these can be overwritten with generator specific content # https://cmake.org/cmake/help/v3.5/module/CPack.html -SET ( CPACK_PACKAGE_NAME "Hyperion" ) +SET ( CPACK_PACKAGE_NAME "Hyperion.NG" ) SET ( CPACK_PACKAGE_DESCRIPTION_SUMMARY "Hyperion is an open source ambient light implementation" ) SET ( CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md" ) -SET ( CPACK_PACKAGE_FILE_NAME "Hyperion-${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}-${CMAKE_SYSTEM_NAME}") + +if ( NOT DEFINED DOCKER_PLATFORM ) + SET ( CPACK_PACKAGE_FILE_NAME "Hyperion.NG-${HYPERION_VERSION_CHANNEL}.${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}-${CMAKE_SYSTEM_NAME}") +else() + SET ( CPACK_PACKAGE_FILE_NAME "Hyperion.NG-${HYPERION_VERSION_CHANNEL}.${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}-${CMAKE_SYSTEM_NAME}-${DOCKER_PLATFORM}") +endif() + SET ( CPACK_PACKAGE_CONTACT "packages@hyperion-project.org") SET ( CPACK_PACKAGE_EXECUTABLES "hyperiond;Hyperion" ) SET ( CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/resources/icons/hyperion-icon-32px.png") diff --git a/test/jsonchecks/version.py b/test/jsonchecks/version.py new file mode 100644 index 00000000..06f6e2a7 --- /dev/null +++ b/test/jsonchecks/version.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python +import json, sys + +retval = 0 + +with open(sys.argv[1]) as f: + if len(sys.argv) < 3: + data = json.load(f) + sys.stdout.write(data['versionnr']) + sys.exit(0) + else: + data = json.load(f) + sys.stdout.write(data['channel']) + sys.exit(0) diff --git a/version.json b/version.json index 356934a4..d84a7b78 100644 --- a/version.json +++ b/version.json @@ -1,21 +1,6 @@ -[ - { - "versionnr" : "2.1.0", - "versiondesc": "This version introduces feature x and some small bugfixes at the web configuration", - "versionchangelog":"https://www.hyperion-project.org/blog/id1", - "channel" : "Stable" - }, - { - "versionnr" : "2.0.1", - "versiondesc": "This is a bugfix release for 2.0.0", - "versionchangelog": "https://www.hyperion-project.org/blog/id3", - "channel" : "Stable" - }, - { - "versionnr" : "2.0.0", - "versiondesc": "Version 2.0.0 introduces the succesor of Hyperion 1.0 with plenty new features to discover with a entire code rework and a highly extended JSON RPC!", - "versionchangelog": "https://www.hyperion-project.org/blog/id0", - "channel" : "Stable" - } -] - +{ + "versionnr": "1.0.0", + "versiondesc": "Hyperion.NG introduces the succesor of Hyperion 1.0 with plenty new features to discover with a entire code rework and a highly extended JSON RPC!", + "versionchangelog": "https://www.hyperion-project.org/blog/id0", + "channel": "Beta" +}