From 093617e6bd4e64f3c9a5df740af286623473e301 Mon Sep 17 00:00:00 2001 From: Andrey Meshkov Date: Wed, 22 Apr 2020 15:07:17 +0300 Subject: [PATCH] *: update build_snap.sh --- build_snap.sh | 228 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 190 insertions(+), 38 deletions(-) diff --git a/build_snap.sh b/build_snap.sh index 89da6fbe..49e05071 100755 --- a/build_snap.sh +++ b/build_snap.sh @@ -7,6 +7,7 @@ set -x BUILDER_IMAGE="adguard/snapcraft:1.0" SNAPCRAFT_TMPL="packaging/snap/snapcraft.yaml" SNAP_NAME="adguardhometest" +LAUNCHPAD_CREDENTIALS_DIR=".local/share/snapcraft/provider/launchpad" VERSION=`git describe --abbrev=4 --dirty --always --tags` if [[ "${TRAVIS_BRANCH}" == "master" ]] @@ -22,40 +23,127 @@ if [ -t 0 ] ; then INTERACTIVE="-it" fi -# Launchpad oauth tokens data is necessary to run snapcraft remote-build -# -# Here's an instruction on how to generate launchpad OAuth tokens: -# https://uci.readthedocs.io/en/latest/oauth.html -# -# Launchpad credentials are necessary to run snapcraft remote-build command -echo "[1] -consumer_key = ${LAUNCHPAD_KEY} -consumer_secret = -access_token = ${LAUNCHPAD_ACCESS_TOKEN} -access_secret = ${LAUNCHPAD_ACCESS_SECRET} -" > launchpad_credentials +function usage() { + cat < snapcraft_login + Please note that in order for the builds to work properly, you need to setup some env variables. -# Prepare the snap configuration -cp ${SNAPCRAFT_TMPL} ./snapcraft.yaml -sed -i.bak 's/dev_version/'"${VERSION}"'/g' ./snapcraft.yaml + These are necessary for "remote-build' command. + Read this doc on how to generate them: https://uci.readthedocs.io/en/latest/oauth.html + + * LAUNCHPAD_KEY -- launchpad CI key + * LAUNCHPAD_ACCESS_TOKEN -- launchpad access token + * LAUNCHPAD_ACCESS_SECRET -- launchpad access secret + + These are necessary for snapcraft publish command to work. + They can be exported using "snapcraft export-login" + + * SNAPCRAFT_MACAROON + * SNAPCRAFT_UBUNTU_DISCHARGE + * SNAPCRAFT_EMAIL + + Examples: + ${0##*/} build-docker - builds snaps using remote-build inside a Docker environment + ${0##*/} build - builds snaps using remote-build + ${0##*/} publish-docker-beta - publishes snaps to the beta channel using Docker environment + ${0##*/} publish-docker-release - publishes snaps to the release channel using Docker environment + ${0##*/} publish-beta - publishes snaps to the beta channel + ${0##*/} publish-release - publishes snaps to the release channel + ${0##*/} cleanup - clean up temporary files that were created by the builds +EOF + exit 1 +} + +####################################### +# helper functions +####################################### + +function prepare() { + # Launchpad oauth tokens data is necessary to run snapcraft remote-build + # + # Here's an instruction on how to generate launchpad OAuth tokens: + # https://uci.readthedocs.io/en/latest/oauth.html + # + # Launchpad credentials are necessary to run snapcraft remote-build command + echo "[1] + consumer_key = ${LAUNCHPAD_KEY} + consumer_secret = + access_token = ${LAUNCHPAD_ACCESS_TOKEN} + access_secret = ${LAUNCHPAD_ACCESS_SECRET} + " > launchpad_credentials + + # Snapcraft login data + # It can be exported using snapcraft export-login command + echo "[login.ubuntu.com] + macaroon = ${SNAPCRAFT_MACAROON} + unbound_discharge = ${SNAPCRAFT_UBUNTU_DISCHARGE} + email = ${SNAPCRAFT_EMAIL}" > snapcraft_login + + # Prepare the snap configuration + cp ${SNAPCRAFT_TMPL} ./snapcraft.yaml + sed -i.bak 's/dev_version/'"${VERSION}"'/g' ./snapcraft.yaml + rm -f snapcraft.yaml.bak +} build_snap() { - # Run the build + # prepare credentials + prepare + + # copy them to the directory where snapcraft will be able to read them + mkdir -p ~/${LAUNCHPAD_CREDENTIALS_DIR} + cp -f snapcraft_login ~/${LAUNCHPAD_CREDENTIALS_DIR}/credentials + chmod 600 ~/${LAUNCHPAD_CREDENTIALS_DIR}/credentials + + # run the build + snapcraft remote-build --build-on=${ARCH} --launchpad-accept-public-upload + + # remove the credentials - we don't need them anymore + rm -rf ~/${LAUNCHPAD_CREDENTIALS_DIR} + + # cleanup credentials + cleanup +} + +build_snap_docker() { + # prepare credentials + prepare + docker run ${INTERACTIVE} --rm \ -v $(pwd):/build \ - -v $(pwd)/launchpad_credentials:/root/.local/share/snapcraft/provider/launchpad/credentials:ro \ + -v $(pwd)/launchpad_credentials:/root/${LAUNCHPAD_CREDENTIALS_DIR}/credentials:ro \ ${BUILDER_IMAGE} \ snapcraft remote-build --build-on=${ARCH} --launchpad-accept-public-upload + + # cleanup credentials + cleanup } publish_snap() { + # prepare credentials + prepare + + # Check that the snap file exists + snapFile="${SNAP_NAME}_${VERSION}_${ARCH}.snap" + if [ ! -f ${snapFile} ]; then + echo "Snap file ${snapFile} not found!" + exit 1 + fi + + # Login if necessary + snapcraft login --with=snapcraft_login + + # Push to the channel + snapcraft push --release=${CHANNEL} ${snapFile} + + # cleanup credentials + cleanup +} + +publish_snap_docker() { + # prepare credentials + prepare + # Check that the snap file exists snapFile="${SNAP_NAME}_${VERSION}_${ARCH}.snap" if [ ! -f ${snapFile} ]; then @@ -68,22 +156,86 @@ publish_snap() { -v $(pwd):/build \ ${BUILDER_IMAGE} \ sh -c "snapcraft login --with=/build/snapcraft_login && snapcraft push --release=${CHANNEL} /build/${snapFile}" + + # cleanup credentials + cleanup } -# Build snaps -ARCH=i386 build_snap -ARCH=arm64 build_snap -ARCH=armhf build_snap -ARCH=amd64 build_snap +####################################### +# main functions +####################################### -# Publish snaps -ARCH=i386 publish_snap -ARCH=arm64 publish_snap -ARCH=armhf publish_snap -ARCH=amd64 publish_snap +build() { + ARCH=i386 build_snap + ARCH=arm64 build_snap + ARCH=armhf build_snap + ARCH=amd64 build_snap +} -# Clean up -rm launchpad_credentials -rm snapcraft.yaml -rm snapcraft.yaml.bak -rm snapcraft_login \ No newline at end of file +build_docker() { + ARCH=i386 build_snap_docker + ARCH=arm64 build_snap_docker + ARCH=armhf build_snap_docker + ARCH=amd64 build_snap_docker +} + +publish_docker() { + if [[ -z $1 ]]; then + echo "No channel specified" + exit 1 + fi + CHANNEL="${1}" + if [ "$CHANNEL" != "release" ] && [ "$CHANNEL" != "beta" ]; then + echo "$CHANNEL is an invalid value for the update channel!" + exit 1 + fi + + ARCH=i386 publish_snap_docker + ARCH=arm64 publish_snap_docker + ARCH=armhf publish_snap_docker + ARCH=amd64 publish_snap_docker +} + +publish() { + if [[ -z $1 ]]; then + echo "No channel specified" + exit 1 + fi + CHANNEL="${1}" + if [ "$CHANNEL" != "release" ] && [ "$CHANNEL" != "beta" ]; then + echo "$CHANNEL is an invalid value for the update channel!" + exit 1 + fi + + ARCH=i386 publish_snap + ARCH=arm64 publish_snap + ARCH=armhf publish_snap + ARCH=amd64 publish_snap +} + +cleanup() { + rm -f launchpad_credentials + rm -f snapcraft.yaml + rm -f snapcraft.yaml.bak + rm -f snapcraft_login +} + +####################################### +# main +####################################### +if [[ -z $1 || $1 == "--help" || $1 == "-h" ]]; then + usage +fi + +case "$1" in +"build-docker") build_docker ;; +"build") build ;; +"publish-docker-beta") publish_docker beta ;; +"publish-docker-release") publish_docker release ;; +"publish-beta") publish beta ;; +"publish-release") publish release ;; +"cleanup") cleanup ;; +*) usage ;; +esac + +exit 0 \ No newline at end of file