#!/bin/sh -e # Environment variables: # * PARALLEL_MAKE: -jN argument for make (default: -j5). # * SKIP_MASTER: don't build REPOS_MASTER (assume that they were just built and keep _temp). # * SKIP_LEGACY: don't build libosmo-legacy-mgcp (assume that it was just built and keep _temp). # # Latest result: # https://jenkins.osmocom.org/jenkins/job/Osmocom-build-tags-against-master/lastBuild/console cd "$(dirname "$0")" . ./common.sh ERROR_LOGS="" PARALLEL_MAKE="${PARALLEL_MAKE:--j5}" REPOS_MASTER=" libosmocore libosmo-abis libosmo-netif libosmo-sccp libsmpp34 libasn1c osmo-ggsn osmo-iuh osmo-hlr osmo-mgw " REPOS_TAGS=" libosmo-abis libosmocore libosmo-netif libosmo-sccp openbsc osmo-bsc osmo-bts osmo-ggsn osmo-hlr osmo-iuh osmo-mgw osmo-msc osmo-pcu osmo-sgsn osmo-sip-connector osmo-trx " # Print tags, which should be built, but where errors are expected and should be ignored. # This function is part of the configuration, do not insert functions above. # $1: repository # output format: one tag per line tags_to_ignore() { case "$1" in openbsc) echo "1.0.0" # testsuite ;; osmo-bsc) # Depends on libosmo-legacy-mgcp, but missing LIBOSMOLEGACYMGCP_CFLAGS so we can't build it with # this script (we put that legacy lib into a different temp install dir). Fixed in 1.2.2. echo "1.2.1" echo "1.4.0" # testsuite ;; osmo-bts) echo "1.0.0" # missing gsm0808.h include, fixed in 1.0.1 ;; osmo-mgw) echo "1.3.0" # testsuite echo "1.4.0" # testsuite ;; osmo-msc) echo "1.3.0" # -Werror and deprecated gsm0480_create_ussd_release_complete(), fixed in 1.3.1 ;; osmo-pcu) echo "0.5.0" # testsuite ;; osmo-sgsn) echo "1.2.0" # sgsn_test.c: gtp.h: No such file or directory echo "1.3.0" # testsuite echo "1.4.0" # testsuite ;; esac } # Print which tags should be built for a specific repository. # This function is part of the configuration. # $1: repository # output format: one tag per line tags_to_build() { case "$1" in # Add repository specific tag listings here: # libosmocore) # echo "0.1.0" # osmo_git_last_tags "$1" 3 # ;; *) osmo_git_last_tags "$1" 3 ;; esac } # Delete existing temp dir and create a new one, output the path. prepare_temp_dir() { TEMP="$(cd ..; pwd)/_temp" if [ -n "$SKIP_MASTER" ] || [ -n "$SKIP_LEGACY" ]; then if ! [ -d "$TEMP" ]; then echo "ERROR: SKIP_MASTER or SKIP_LEGACY is set, but temp dir not found: $TEMP" exit 1 fi else if [ -d "$TEMP" ]; then rm -r "$TEMP" fi fi mkdir -p "$TEMP/log" echo "Temp dir: $TEMP" } # When builds have failed, print the last lines of each failing log and exit with 1. show_errors_exit() { local log if [ -z "$ERROR_LOGS" ]; then return 0 fi for log in $ERROR_LOGS; do echo "---" echo "BUILD FAILED: $(basename "$log")" echo "Showing last lines of build log below (full log in temp dir/jenkins artifacts):" echo "---" tail -n 20 "$log" done echo "---" exit 1 } # Build a repository either from master or from a specific tag against master. # The build output is redirected to a file, and partially shown on error. # $1: installation path (either $TEMP/inst_master or $TEMP/inst) # $2: repository # $3: branch, tag or commit # $4: run tests (set to 0 to disable tests, default is 1) # returns: 0 on sucessful build, 1 on error build_repo() { local inst="$1" local repo="$2" local branch="$3" local check="" if [ "$4" != "0" ]; then check="1" fi if ! PATH="$PWD:$PATH"\ PKG_CONFIG_PATH="$TEMP/inst_master/lib/pkgconfig:$TEMP/inst_legacy/lib/pkgconfig:$PKG_CONFIG_PATH" \ MAKE="make" \ PARALLEL_MAKE="$PARALLEL_MAKE" \ CHECK="$check" \ deps="../_deps" \ inst="$inst" \ ./osmo-build-dep.sh "$repo" "$branch" \ > "$TEMP/log/$repo-$branch.txt" 2>&1 then return 1 fi } # Build all configured repositories from master and install to $TEMP/inst_master. build_repos_master() { local repo_master echo "Building libraries from current master..." if [ -n "$SKIP_MASTER" ]; then echo "=> SKIPPED (SKIP_MASTER is set)" return fi for repo_master in $REPOS_MASTER; do local commit="$(osmo_git_head_commit "$repo_master")" if [ -z "$commit" ]; then echo "ERROR: failed to get head commit for repository: $repo_master" exit 1 fi printf "%-21s %s" " * $repo_master" "$commit" if ! build_repo "$TEMP/inst_master" "$repo_master" "$commit"; then printf "\n" ERROR_LOGS="$TEMP/log/$repo_master-$commit.txt" show_errors_exit fi printf "\n" done } # Build libosmo-legacy-mgcp and install to $TEMP/inst_legacy (osmo-bsc 1.2.1 depends on it). build_legacy_mgcp() { echo "Building legacy libraries..." if [ -n "$SKIP_LEGACY" ]; then echo "=> SKIPPED (SKIP_LEGACY is set)" return fi local repo="osmo-mgw" local tag="1.4.0" # Don't run "make check" here. The script tries it during build_repos_tags() instead. local check="0" printf "%-21s %10s %s" " * $repo" "$tag" "(provides libosmo-legacy-mgcp)" if ! build_repo "$TEMP/inst_legacy" "$repo" "$tag" "$check"; then printf "\n" ERROR_LOGS="$ERROR_LOGS $TEMP/log/$repo-$tag.txt" show_errors_exit fi printf "\n" } # $1: repository # $2: tag # returns: 0 when the error should be ignored, 1 otherwise ignore_error() { local tag for tag in $(tags_to_ignore "$1"); do if [ "$2" = "$tag" ]; then return 0 fi done return 1 } # Build all configured repositories on specific tags against master. The result is installed to $TEMP/inst, but deleted # after each build. build_repos_tags() { local repo echo "Building old tags against libraries from current master... (ERR: new error, err: known error)" for repo in $REPOS_TAGS; do local tags="$(tags_to_build "$repo" | sort -V | tr '\n' ' ')" if [ -z "$tags" ]; then printf "%-21s %s\n" " * $repo" "(no tags configured)" continue fi printf "%-21s" " * $repo" local tag for tag in $tags; do printf "%10s" " $tag" if [ -d "$TEMP/inst" ]; then rm -r "$TEMP/inst" fi if build_repo "$TEMP/inst" "$repo" "$tag"; then printf " " elif ignore_error "$repo" "$tag"; then printf " (err)" else printf " (ERR)" ERROR_LOGS="$ERROR_LOGS $TEMP/log/$repo-$tag.txt" fi done printf "\n" done } prepare_temp_dir build_repos_master build_legacy_mgcp build_repos_tags show_errors_exit