From 29857748592a601f6c96f0fa708e529959cf2441 Mon Sep 17 00:00:00 2001 From: Thomas Buckley-Houston Date: Sun, 28 Jan 2018 15:26:37 +0800 Subject: [PATCH] Automate releases --- .dockerignore | 1 + .gitignore | 1 + .travis.yml | 40 +++++++++++------------ Dockerfile | 17 ++++------ contrib/release_if_new_version.sh | 21 ++++++++++++ interfacer/.goreleaser.yml | 30 +++++++++++++++++ interfacer/contrib/setup_browsh.sh | 25 ++++++++++++++ interfacer/contrib/setup_firefox.sh | 11 +++++++ interfacer/contrib/setup_go.sh | 11 ++++--- interfacer/contrib/upx_compress_binary.sh | 10 ++++++ webext/contrib/setup_node.sh | 8 +++++ 11 files changed, 139 insertions(+), 36 deletions(-) create mode 100644 .dockerignore create mode 100755 contrib/release_if_new_version.sh create mode 100644 interfacer/.goreleaser.yml create mode 100755 interfacer/contrib/setup_browsh.sh create mode 100755 interfacer/contrib/setup_firefox.sh create mode 100755 interfacer/contrib/upx_compress_binary.sh create mode 100755 webext/contrib/setup_node.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..9414382 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +Dockerfile diff --git a/.gitignore b/.gitignore index db8b8a2..e965189 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ build/ node_modules interfacer/target interfacer/vendor +interfacer/dist interfacer/interfacer interfacer/browsh interfacer/webextension.go diff --git a/.travis.yml b/.travis.yml index 7745644..b9eff91 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,19 +1,24 @@ +if: tag IS blank # Don't trigger builds if language: node_js -addons: - firefox: '58.0' env: global: - - GOLANG_VERSION=1.9 - GOPATH=$HOME/gopath - - REPO_ROOT=$GOPATH/src - PATH=$PATH:/$HOME/bin:$GOPATH/bin - - MDN_USER=user:13243312:78 - - secure: sKZ1/oBLKNWA0v16d4Yg8V500zIwZwEUpcnW7SMRpeqJMbzlR7GKLpJ/VX6ZAYexokBEEbU+JnI3/aHOmJaO9h2/+b1qwrQqje6totC6/rPhxkdxGxI9jETzPdL0V0XErK4rK2URATEANRnJUFLVuFGaXh6dUZDrbtn8NxDSfZEQGmHlqex5TcqPxmK2v0Lb3l2FcVF2kxGYpKMmjKFQbGBHdjFN5qOrS3jmkHjC6Ie8CaM9ezy55e3sOIrNr/u4kWJAOGE2cT3rjqcmPYaCRRzkiy7q3sYEI6jC9vfOZeyFI6E0e3VPDv+OGq+lnUBbgVjGhiG9LxIJ9Z3JEY9z5OspeczpLiQT2rhstqwDolyhx2liiI9cZe0d+uiLo2YyYKe1RELlClB6cQi9p/J8vJpyVEutIoq8Sdv13vbnJMAmPQi1OD9qtOgBR9cngy5yWIPyizgpcAr6kCYxztwIX4y1wrlHPUdTApDnfJNkNOSBwYBTigmlFZf8BkGXB4JOhcQ8KZM3H2OdOP2rANZIOd1ficgyHgKNt4iomIC/i5d7qnV6OZfzirQgx7yzWqjwoGrPg+OvL9MeY9dMltGsfFL80FLudIzN8sqj3BUYioXWX8GCyVML/XoMPbLpcSLBRMxskUhNSYbaTQ2qML7H5Kv/wce71BXMknzyT0s/mNs= + - REPO_ROOT=$GOPATH/src + - MDN_USER="user:13243312:78" + # MDN_TOKEN + - secure: "sKZ1/oBLKNWA0v16d4Yg8V500zIwZwEUpcnW7SMRpeqJMbzlR7GKLpJ/VX6ZAYexokBEEbU+JnI3/aHOmJaO9h2/+b1qwrQqje6totC6/rPhxkdxGxI9jETzPdL0V0XErK4rK2URATEANRnJUFLVuFGaXh6dUZDrbtn8NxDSfZEQGmHlqex5TcqPxmK2v0Lb3l2FcVF2kxGYpKMmjKFQbGBHdjFN5qOrS3jmkHjC6Ie8CaM9ezy55e3sOIrNr/u4kWJAOGE2cT3rjqcmPYaCRRzkiy7q3sYEI6jC9vfOZeyFI6E0e3VPDv+OGq+lnUBbgVjGhiG9LxIJ9Z3JEY9z5OspeczpLiQT2rhstqwDolyhx2liiI9cZe0d+uiLo2YyYKe1RELlClB6cQi9p/J8vJpyVEutIoq8Sdv13vbnJMAmPQi1OD9qtOgBR9cngy5yWIPyizgpcAr6kCYxztwIX4y1wrlHPUdTApDnfJNkNOSBwYBTigmlFZf8BkGXB4JOhcQ8KZM3H2OdOP2rANZIOd1ficgyHgKNt4iomIC/i5d7qnV6OZfzirQgx7yzWqjwoGrPg+OvL9MeY9dMltGsfFL80FLudIzN8sqj3BUYioXWX8GCyVML/XoMPbLpcSLBRMxskUhNSYbaTQ2qML7H5Kv/wce71BXMknzyT0s/mNs=" + # GITHUB_TOKEN + - secure: "boYctu4EQI2og3YWpD54yo1LzibgBNrYN3exbfwxaNNbJuQscprAlOOG5Y1O7MBgzG9AP1DeON3X0al7g/IYMrsMsrSGhJLq9w2/ntwMiUIyKfTAP8rB5fASRSYxA5mqhpjXK4iIzqG2xiOr1SmCbpT9ew0AXP/HgxQprsppBbH+H4HyrP4cejIbfk8ajU/XvrDmhOY4s/IZIy+vfEfZH5xheJnG3iWFICwWUF5CIjjr6fQpq9ZbL2sDMvzruYPMAQ3iDfBrUr+ZhN4PPjrzvCRUNpoUoPsXCsFDPMcZpBjSHH5ZELPRBzHSdJignIjHaV0UtLtFApZl49lzq749r2Sno2ba4JCd0RIgMERjNluXynkJiHrL2tMR8HYhOmoeLMdX0zrguv+136+Jn04gQde3S+FI1/sN0/Xa14xD7SGMUT1MgFnwKgFXOFeUd3VpvbpFg6RWVgpCnaDd2/AKL+mQDEgL4yRg9q95a6Q5ub/c6nla8/E4asEvYGlJPj0OG/MKvJMi0gnKuP4+nil0jgGeKki3k1UxwvldlS+n7HUhQ7c4B9c61KS19i+z5SxBiXjilL+zGlAVVgRcalIoKQrTRDSRKnKZkR5Ant0CLjt44pncHLwlYXD/aPuLNihCa4AqUlpYPYru0pQawXNkVnk6E/cg2DAsp7oDcpcg540=" before_install: - - "./interfacer/contrib/setup_go.sh" - - cd $REPO_ROOT/webext + - ./interfacer/contrib/setup_firefox.sh + - ./interfacer/contrib/setup_go.sh + - cp -rfp $TRAVIS_BUILD_DIR -T $REPO_ROOT install: + - cd $REPO_ROOT/interfacer + - dep ensure + - cd $REPO_ROOT/webext - npm run get-gobindata - npm install - npm run build @@ -22,19 +27,12 @@ script: after_failure: - cat $REPO_ROOT/interfacer/debug.log - cat $REPO_ROOT/interfacer/spec.log -before_deploy: - - echo "Do I run depending on the condition in `deploy:` ?" +after_success: - BROWSH_ENV=RELEASE npm run build + - rvm install 2.5.0 + - gem install --no-ri --no-rdoc fpm + - apt-get install rpm + - go get github.com/goreleaser/goreleaser - cd $REPO_ROOT/interfacer - - go build -o browsh *.go -deploy: - provider: releases - api_key: - secure: anJIaL3KQnKjctldcZGK1m+GJ2uut9ErqsEneb0gWlnwg8EjKRxeKhn4Im1ZfFGgw0G+CIFVH0XD7b5oFQzaNrfU759RuqzpsEibfO/DfTKYJmxExiyR5Xng6WEOa0LHP4DVYEnttjL6aDbcefmVUfCwQ1L+gNx8jPocf+3eorM/GSMXg+wCpaDiVRW5NP63GG+dWwVfNVaDf8XxPcSFc1hVUaLMTOXj7Lxscp6S5703qCetNOPDlUDjfIx6Q/sZ8ce1XxA6iJoJL9BbX0X07cvtyz9ThwBHwjXVtkVdI8jwPkS/f9m1u7bE891wfQuXnPxmsMaF5HeQYTGCgPh22NSTgmIyQLzAFyPIz+8ilkTLsFoK3tglJDkMXTRjDXEH3/M8pvfZCj1wIwOypQMDVMLXf0ZU65+YOaiIRNpl6Qw6uVtUjVVWEf4su1yrv5dnAfIIj5kgjlJuCcUmwAaY+cG4D/qVWZQfekxGlt/u0tvyaPJl6sr3HnRj1beDXl/nHdW+n1UblAzZEveET2XwdITNh0N84fRhUzhkxNO6G8RfktUOzoEWNEG5aewOrQekrSt2CcvCxOSNVZXbR2+bcAAQQNYOtpG5cXFdXacSchi7XSMUzLM6E4+JwLxbLd8Ogm8qXc0NA5r7ssGxTYnkVCw7R39r10/Jw5keZ1ak/d8= - file: - - interfacer/browsh - skip_cleanup: true - on: - repo: browsh/browsh - tags: true + - goreleaser diff --git a/Dockerfile b/Dockerfile index a4057cc..92bd818 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,14 @@ -FROM phusion/baseimage - -RUN apt-get update -RUN apt-get -y install xvfb libgtk-3-0 - +FROM bitnami/minideb:stretch +RUN install_packages xvfb libgtk-3-0 RUN useradd user RUN su user WORKDIR /home/user -RUN curl -L -o firefox.tar.bz2 https://ftp.mozilla.org/pub/firefox/releases/58.0b16/linux-x86_64/en-US/firefox-58.0b16.tar.bz2 -RUN apt-get -y install bzip2 -RUN bzip2 -d firefox.tar.bz2 -RUN tar xf firefox.tar +ADD ./interfacer/contrib/setup_firefox.sh . +RUN ./setup_firefox.sh +RUN rm ./setup_firefox.sh ENV PATH="/home/user/firefox:${PATH}" -ADD interfacer/browsh . +ADD ./interfacer/contrib/setup_browsh.sh . +RUN ./setup_browsh.sh CMD ["/home/user/browsh"] diff --git a/contrib/release_if_new_version.sh b/contrib/release_if_new_version.sh new file mode 100755 index 0000000..eece72a --- /dev/null +++ b/contrib/release_if_new_version.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +set -e + +PROJECT_ROOT=$(git rev-parse --show-toplevel) +manifest=$PROJECT_ROOT/webext/manifest.json +line=$(cat $manifest | grep '"version"') +manifest_version=$(echo $line | grep -o '".*"' | cut -d " " -f 2 | sed 's/"//g') + +latest_tagged_version=$(git tag --list 'v*.*.*' | head -n1 | sed -e "s/^v//") + +if [[ "$manifest_version" != "$latest_tagged_version" ]]; then + cd $PROJECT_ROOT/interfacer + goreleaser + git config --global user.email "builds@travis-ci.com" + git config --global user.name "Travis CI" + # `/dev/null` needed to prevent Github token appearing in logs + git push --tags --quiet https://$GITHUB_TOKEN@github.com/tombh/texttop > /dev/null 2>&1 +fi + + diff --git a/interfacer/.goreleaser.yml b/interfacer/.goreleaser.yml new file mode 100644 index 0000000..7131540 --- /dev/null +++ b/interfacer/.goreleaser.yml @@ -0,0 +1,30 @@ +project_name: browsh +builds: + - main: . + binary: browsh + goos: + - windows + - darwin + - linux + goarch: + - amd64 + ldflags: -s -w + hooks: + post: ./contrib/upx_compress_binary.sh + +archive: + format: binary + +fpm: + vendor: Browsh + homepage: https://brow.sh + maintainer: Thomas Buckley-Houston + description: A fully interactive, realtime and modern browser rendered to TTY + license: GPL v3 + formats: + - deb + - rpm + - pacman + + dependencies: + - firefox diff --git a/interfacer/contrib/setup_browsh.sh b/interfacer/contrib/setup_browsh.sh new file mode 100755 index 0000000..966471f --- /dev/null +++ b/interfacer/contrib/setup_browsh.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# I suspect this will be mostly used by automated CI. +# For example; in creating the Browsh Docker image. We don't actually build +# Browsh in the Dockerfile because that would require signing the webextension +# again, which can't be done as only one canonical release of a webextension is +# allowed by MDN per semantic version. It's actually quite good to not have to +# repeat the build process (after having done so in Travis after successfully +# passing tests). So we simply just download the already built binary :) + +PROJECT_ROOT=$(git rev-parse --show-toplevel) +if [ $? -eq 0 ]; then + manifest=$PROJECT_ROOT/webext/manifest.json +else + manifest=./manifest.json +fi + +line=$(cat $manifest | grep '"version"') +version=$(echo $line | grep -o '".*"' | cut -d " " -f 2 | sed 's/"//g') + +base='https://github.com/browsh-org/browsh/releases/download' +release_url="$base/browsh-$version/browsh-linux-amd64-$version" + +curl -L -o browsh $release_url +chmod a+x browsh diff --git a/interfacer/contrib/setup_firefox.sh b/interfacer/contrib/setup_firefox.sh new file mode 100755 index 0000000..5a9b826 --- /dev/null +++ b/interfacer/contrib/setup_firefox.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +FIREFOX_VERSION=58.0b16 + +mkdir -p $HOME/bin +pushd $HOME/bin +curl -L -o firefox.tar.bz2 https://ftp.mozilla.org/pub/firefox/releases/$FIREFOX_VERSION/linux-x86_64/en-US/firefox-$FIREFOX_VERSION.tar.bz2 +apt-get -y install bzip2 +bzip2 -d firefox.tar.bz2 +tar xf firefox.tar +popd diff --git a/interfacer/contrib/setup_go.sh b/interfacer/contrib/setup_go.sh index c97af43..382d43e 100755 --- a/interfacer/contrib/setup_go.sh +++ b/interfacer/contrib/setup_go.sh @@ -1,5 +1,11 @@ #!/bin/bash +set -e + +GOLANG_VERSION=1.9.3 GOLANG_DEP_VERSION=0.3.2 + +export GOPATH=$HOME/gopath +export PATH=$PATH:/$HOME/bin:$GOPATH/bin dep_url=https://github.com/golang/dep/releases/download/v$GOLANG_DEP_VERSION/dep-linux-amd64 golang_archive=go$GOLANG_VERSION.linux-amd64.tar.gz golang_url=https://dl.google.com/go/$golang_archive @@ -15,8 +21,3 @@ tar -C $HOME/bin -xzf $golang_archive curl -L -o $GOPATH/bin/dep $dep_url chmod +x $GOPATH/bin/dep -cp -rfp $TRAVIS_BUILD_DIR -T $REPO_ROOT - -cd $REPO_ROOT/interfacer -dep ensure - diff --git a/interfacer/contrib/upx_compress_binary.sh b/interfacer/contrib/upx_compress_binary.sh new file mode 100755 index 0000000..1555d82 --- /dev/null +++ b/interfacer/contrib/upx_compress_binary.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set -ex + +pushd dist +curl -sL -o upx.txz https://github.com/upx/upx/releases/download/v3.94/upx-3.94-amd64_linux.tar.xz +tar -xvf upx.txz +cp upx-3.94-amd64_linux/upx . +rm -rf upx-3.94-amd64_linux +./upx */* +popd diff --git a/webext/contrib/setup_node.sh b/webext/contrib/setup_node.sh new file mode 100755 index 0000000..c303cf1 --- /dev/null +++ b/webext/contrib/setup_node.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# See `/.nvmrc` for current Node version +NVM_VERSION=0.33.8 +curl -o- https://raw.githubusercontent.com/creationix/nvm/v$NVM_VERSION/install.sh | bash +source $HOME/.nvm/nvm.sh +nvm install +