From 616ced0f07d48d24030d3d9f25b39ae69c934645 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 15 Jun 2020 22:13:51 +0200 Subject: [PATCH] automatic CI builds --- .travis.yml | 72 ++++++++++++++++++++ scripts/build.sh | 169 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 241 insertions(+) create mode 100644 .travis.yml create mode 100755 scripts/build.sh diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..b1093fad4 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,72 @@ +os: linux +dist: bionic +language: python +python: + - "3.8" + +cache: + directories: + - ${HOME}/.pio + +env: + global: + - BUILDER_TOTAL_THREADS=1 + - OWNER=${TRAVIS_REPO_SLUG%/*} + - DEV=${OWNER/proddy/v2} + - BRANCH=${TRAVIS_BRANCH/v2/} + - TAG=${DEV}${BRANCH:+_}${BRANCH} + +install: + - env | grep TRAVIS + - set -e + - pip install -U platformio + - pio platform update -p + - set +e + +branches: + except: + - /^travis-.*-build$/ + +script: + - ./scripts/build.sh + +stages: + - name: Release + +jobs: + include: + - stage: Release + +before_deploy: + - export FIRMWARE_VERSION=$(grep -E '^#define APP_VERSION' ./src/version.h | awk '{print $3}' | sed 's/"//g') + - git tag -f travis-${TAG}-build + - git remote add gh + https://${OWNER}:${GITHUB_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git + - git push gh :travis-${TAG}-build || true + - git push -f gh travis-${TAG}-build + - git remote remove gh + +deploy: + provider: releases + edge: + branch: master + token: ${GITHUB_TOKEN} + file_glob: true + file: "*.bin" + name: latest v2 development build + release_notes: + Version $FIRMWARE_VERSION. + Automatic firmware builds of the current EMS-ESP branch built on $(date +'%F %T %Z') from commit $TRAVIS_COMMIT. + Warning, this is a development build and not fully tested. Use at your own risk. + cleanup: false + prerelease: true + overwrite: true + target_commitish: $TRAVIS_COMMIT + on: + tags: false + branch: dev + +notifications: + email: + on_success: change + on_failure: change diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 000000000..336434b96 --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,169 @@ +#!/bin/bash +set -e + +### Functions + +is_git() { + command -v git >/dev/null 2>&1 || return 1 + command git rev-parse >/dev/null 2>&1 || return 1 + + return 0 +} + +stat_bytes() { + filesize=`du -k "$1" | cut -f1;` + echo 'size:' $filesize 'bytes' +} + +# Available environments +list_envs() { + grep env: platformio.ini | sed 's/\[env:\(.*\)\]/\1/g' +} + +print_available() { + echo "--------------------------------------------------------------" + echo "Available environments:" + for environment in $available; do + echo "-> $environment" + done +} + +print_environments() { + echo "--------------------------------------------------------------" + echo "Current environments:" + for environment in $environments; do + echo "-> $environment" + done +} + +set_default_environments() { + # Hook to build in parallel when using travis + if [[ "${TRAVIS_BUILD_STAGE_NAME}" = "Release" ]] && ${par_build}; then + environments=$(echo ${available} | \ + awk -v par_thread=${par_thread} -v par_total_threads=${par_total_threads} \ + '{ for (i = 1; i <= NF; i++) if (++j % par_total_threads == par_thread ) print $i; }') + return + fi + + # Only build travis target + if [[ "${TRAVIS_BUILD_STAGE_NAME}" = "Test" ]]; then + environments=$travis + return + fi + + # Fallback to all available environments + environments=$available +} + +build_environments() { + echo "--------------------------------------------------------------" + echo "Building firmware images..." + # don't move to firmware folder until Travis fixed (see https://github.com/travis-ci/dpl/issues/846#issuecomment-547157406) + # mkdir -p $destination + + for environment in $environments; do + echo "* EMS-ESP-$version-$environment.bin" + platformio run --silent --environment $environment || exit 1 + stat_bytes .pio/build/$environment/firmware.bin + # mv .pio/build/$environment/firmware.bin $destination/EMS-ESP-$version-$environment.bin + # mv .pio/build/$environment/firmware.bin EMS-ESP-$version-$environment.bin + mv .pio/build/$environment/firmware.bin EMS-ESP-dev-$environment.bin + done + echo "--------------------------------------------------------------" +} + + +####### MAIN + +destination=firmware +version_file=./src/version.h +version=$(grep -E '^#define EMSESP_APP_VERSION' $version_file | awk '{print $3}' | sed 's/"//g') + +if ${TRAVIS:-false}; then + git_revision=${TRAVIS_COMMIT::7} + git_tag=${TRAVIS_TAG} +elif is_git; then + git_revision=$(git rev-parse --short HEAD) + git_tag=$(git tag --contains HEAD) +else + git_revision=unknown + git_tag= +fi + +echo $git_tag + +if [[ -n $git_tag ]]; then + new_version=${version/-*} + sed -i -e "s@$version@$new_version@" $version_file + version=$new_version + trap "git checkout -- $version_file" EXIT +fi + +par_build=false +par_thread=${BUILDER_THREAD:-0} +par_total_threads=${BUILDER_TOTAL_THREADS:-4} +if [ ${par_thread} -ne ${par_thread} -o \ + ${par_total_threads} -ne ${par_total_threads} ]; then + echo "Parallel threads should be a number." + exit +fi +if [ ${par_thread} -ge ${par_total_threads} ]; then + echo "Current thread is greater than total threads. Doesn't make sense" + exit +fi + +# travis platformio target is used for nightly Test +travis=$(list_envs | grep travis | sort) + +# get all taregts, excluding travis and debug +available=$(list_envs | grep -Ev -- 'travis|debug|release' | sort) + +export PLATFORMIO_BUILD_FLAGS="${PLATFORMIO_BUILD_FLAGS}" + +# get command line Parameters +# l prints environments +# 2 does parallel builds +# d uses next arg as destination folder +while getopts "lpd:" opt; do + case $opt in + l) + print_available + exit + ;; + p) + par_build=true + ;; + d) + destination=$OPTARG + ;; + esac +done + +shift $((OPTIND-1)) + +# Welcome message +echo "--------------------------------------------------------------" +echo "EMS-ESP FIRMWARE BUILDER" +echo "Building for version ${version}" ${git_revision:+($git_revision)} + +# Environments to build +environments=$@ + +if [ $# -eq 0 ]; then + set_default_environments +fi + +if ${CI:-false}; then + print_environments +fi + +# for debugging +echo "* git_revision = $git_revision" +echo "* git_tag = $git_tag" +echo "* TRAVIS_COMMIT = $TRAVIS_COMMIT" +echo "* TRAVIS_TAG = $TRAVIS_TAG" +echo "* TRAVIS_BRANCH = $TRAVIS_BRANCH" +echo "* TRAVIS_BUILD_STAGE_NAME = $TRAVIS_BUILD_STAGE_NAME" + +build_environments +