From 988d2f702d9835e1dae71359aca72d37d0193c78 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Mon, 31 Dec 2018 18:28:58 +0000 Subject: [PATCH] feat: merge everything into a shell script License: MIT Signed-off-by: Henrique Dias feat: make sure wizard is executable License: MIT Signed-off-by: Henrique Dias fix: some stuff License: MIT Signed-off-by: Henrique Dias --- {build => .ci}/deploy_key.enc | Bin .gitignore | 1 + .travis.yml | 11 +- build/build.sh | 20 --- build/build_all.sh | 49 ------ build/build_assets.sh | 23 --- build/docker_login.sh | 27 --- build/push_images.sh | 14 -- build/push_ricebox.sh | 38 ----- build/release.sh | 57 ------- build/run_gometalinter.sh | 18 -- wizard.sh | 299 ++++++++++++++++++++++++++++++++++ 12 files changed, 304 insertions(+), 253 deletions(-) rename {build => .ci}/deploy_key.enc (100%) delete mode 100755 build/build.sh delete mode 100755 build/build_all.sh delete mode 100755 build/build_assets.sh delete mode 100755 build/docker_login.sh delete mode 100755 build/push_images.sh delete mode 100755 build/push_ricebox.sh delete mode 100755 build/release.sh delete mode 100755 build/run_gometalinter.sh create mode 100755 wizard.sh diff --git a/build/deploy_key.enc b/.ci/deploy_key.enc similarity index 100% rename from build/deploy_key.enc rename to .ci/deploy_key.enc diff --git a/.gitignore b/.gitignore index 570316d6..c65e8a5a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.db *.lock +*.bak _old rice-box.go diff --git a/.travis.yml b/.travis.yml index 263c4ae7..2dcefc89 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,22 +20,19 @@ cache: jobs: include: - stage: lint - script: ./build/run_gometalinter.sh + script: ./wizard.sh -l - stage: build - script: ./build/build_all.sh + script: ./wizard.sh -b deploy: provider: script skip_cleanup: true - script: docker build -t filebrowser/filebrowser . && ./build/docker_login.sh && docker push filebrowser/filebrowser && docker logout + script: ./wizard.sh -p on: tags: false repo: filebrowser/filebrowser branch: master - stage: release - script: - - docker run --rm -itv $(pwd):/go/src/github.com/filebrowser/filebrowser -v /var/run/docker.sock:/var/run/docker.sock filebrowser/dev goreleaser - - ./build/push_images.sh - - ./build/push_ricebox.sh + script: ./wizard.sh -r if: tag IS present deploy: provider: releases diff --git a/build/build.sh b/build/build.sh deleted file mode 100755 index 63dfadd1..00000000 --- a/build/build.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -set -e - -cd $(dirname $0)/.. - -go get -v ./... - -if [ "$COMMIT_SHA" != "" ]; then - echo "Set version to ($COMMIT_SHA)" - sed -i.bak "s|(untracked)|($COMMIT_SHA)|g" ../filebrowser.go -fi - -echo "Build CLI" -go build -a -o filebrowser - -if [ "$COMMIT_SHA" != "" ]; then - echo "Reset version to (untracked)" - sed -i "s|($COMMIT_SHA)|(untracked)|g" ../filebrowser.go -fi diff --git a/build/build_all.sh b/build/build_all.sh deleted file mode 100755 index 647f819e..00000000 --- a/build/build_all.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/sh - -cd $(dirname $0)/.. - -if [ -d http/"rice-box.go" ]; then - rm -rf http/rice-box.go -fi - -if [ "$USE_DOCKER" != "" ]; then - if [ -d "frontend/dist" ]; then - rm -rf frontend/dist - fi; - - if [ "$(command -v git)" != "" ]; then - COMMIT_SHA="$(git rev-parse HEAD | cut -c1-8)" - else - COMMIT_SHA="untracked" - fi - - $(command -v winpty) docker run -it \ - --name filebrowser-tmp \ - -v /$(pwd):/src:z \ - -w //src \ - -e COMMIT_SHA=$COMMIT_SHA \ - filebrowser/dev \ - sh -c "\ - cd build && \ - dos2unix build_assets.sh && \ - dos2unix build.sh && \ - ./build_assets.sh && \ - ./build.sh \ - " - exitcode=$? - - if [ $exitcode -eq 0 ]; then - for d in "dist/" "node_modules/"; do - docker cp filebrowser-tmp://src/frontend/$d frontend - done - docker cp filebrowser-tmp://src/filebrowser ./filebrowser - docker cp filebrowser-tmp://src/http/rice-box.go ./http/rice-box.go - else - echo "BUILD FAILED!" - fi - docker rm -f filebrowser-tmp -else - set -e - ./build/build_assets.sh - ./build/build.sh -fi diff --git a/build/build_assets.sh b/build/build_assets.sh deleted file mode 100755 index d3ae2170..00000000 --- a/build/build_assets.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -set -e - -cd $(dirname $0)/.. - -# Clean the dist folder and build the assets -cd frontend -if [ -d "dist" ]; then - rm -rf dist/* -fi; -yarn install -yarn build -cd .. - -# Install rice tool if not present -if ! [ -x "$(command -v rice)" ]; then - go get github.com/GeertJohan/go.rice/rice -fi - -# Embed the assets using rice -cd http -rice embed-go diff --git a/build/docker_login.sh b/build/docker_login.sh deleted file mode 100755 index fedeaf5a..00000000 --- a/build/docker_login.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -set -e - -# init key for pass -gpg --batch --gen-key <<-EOF -%echo Generating a standard key -Key-Type: DSA -Key-Length: 1024 -Subkey-Type: ELG-E -Subkey-Length: 1024 -Name-Real: Meshuggah Rocks -Name-Email: meshuggah@example.com -Expire-Date: 0 -# Do a commit here, so that we can later print "done" :-) -%commit -%echo done -EOF - -key=$(gpg --no-auto-check-trustdb --list-secret-keys | grep ^sec | cut -d/ -f2 | cut -d" " -f1) -pass init $key - -if [ "$(command -v docker-credential-pass)" = "" ]; then - docker run --rm -itv /usr/local/bin:/src filebrowser/dev sh -c "cp /go/bin/docker-credential-pass /src" -fi - -echo "$DOCKER_PASS" | docker login -u "$DOCKER_USER" --password-stdin diff --git a/build/push_images.sh b/build/push_images.sh deleted file mode 100755 index a6e45d61..00000000 --- a/build/push_images.sh +++ /dev/null @@ -1,14 +0,0 @@ -#! /bin/sh - -set -e - -cd $(dirname $0) - -./docker_login.sh - -for tag in `echo $(docker images filebrowser/filebrowser* | awk -F ' ' '{print $1 ":" $2}') | cut -d ' ' -f2-`; do - if [ "$tag" = "REPOSITORY:TAG" ]; then break; fi - docker push $tag -done - -docker logout diff --git a/build/push_ricebox.sh b/build/push_ricebox.sh deleted file mode 100755 index 5f3c634a..00000000 --- a/build/push_ricebox.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh - -set -e - -cd $(dirname $0) - -COMMIT_SHA="$(git rev-parse --verify HEAD | cut -c1-8)" - -eval `ssh-agent -s` -openssl aes-256-cbc -K $encrypted_9ca81b5594f5_key -iv $encrypted_9ca81b5594f5_iv -in ./deploy_key.enc -d | ssh-add - - -git clone git@github.com:filebrowser/caddy caddy -cd caddy -cp ../../lib/rice-box.go assets/ -sed -i 's/package lib/package assets/g' assets/rice-box.go -git checkout -b update-rice-box origin/master -git config --local user.name "Filebrowser Bot" -git config --local user.email "FilebrowserBot@users.noreply.github.com" -git commit -am "update rice-box $COMMIT_SHA" - -if [ $(git tag | grep "$TRAVIS_TAG" | wc -l) -ne 0 ]; then - git tag -d "$TRAVIS_TAG" -fi - -git tag "$TRAVIS_TAG" - -if [ "$(git ls-remote --heads origin update-rice-box)" != "" ]; then - git push -u origin update-rice-box -else - git push origin +update-rice-box -fi - -if [ "$(git ls-remote --heads origin update-rice-box)" != "" ]; then - git push origin "$TRAVIS_TAG" -else - git push origin :"$TRAVIS_TAG" - git push origin "$TRAVIS_TAG" -fi diff --git a/build/release.sh b/build/release.sh deleted file mode 100755 index 08903bfa..00000000 --- a/build/release.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -set -e - -echo $0 - -cd $(dirname $0)/.. - -echo "> Checking semver format" - -if [ $# -ne 1 ]; then - echo "This release script requires a single argument corresponding to the semver to be released. See semver.org" - exit 1 -fi - -semver=$(grep -P '^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)' <<< "$1") - -if [ $? -ne 0 ]; then - echo "Not valid semver format. See semver.org" - exit 1 -fi - -echo "> Checking matching $semver in frontend submodule" - -cd frontend -git fetch --all - -if [ $(git tag | grep "$semver" | wc -l) -eq 0 ]; then - echo "Tag $semver does not exist in submodule 'frontend'. Tag it and run this script again." - exit 1 -fi - -git rev-parse --verify --quiet release -if [ $? -ne 0 ]; then - git checkout -b release "$semver" -else - git checkout release - git reset --hard "$semver" -fi - -cd .. - -echo "> Updating submodule ref to $semver" - -sed -i "s|(untracked)|$1|g" filebrowser.go -git commit -am "chore: version $semver" -git tag "$1" -git push -git push --tags - -echo "> Commiting untracked version notice..." - -sed -i "s|$1|(untracked)|g" filebrowser.go -git commit -am "chore: setting untracked version [ci skip]" -git push - -echo "> Done!" diff --git a/build/run_gometalinter.sh b/build/run_gometalinter.sh deleted file mode 100755 index 8ed2fdc0..00000000 --- a/build/run_gometalinter.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -set -e - -cd $(dirname $0)/.. - -dolint='gometalinter --exclude="rice-box.go" --exclude="vendor" --deadline=300s ./...' - -WDIR="/go/src/github.com/filebrowser/filebrowser" - -if [ "$USE_DOCKER" != "" ]; then - $(command -v winpty) docker run --rm -itv "/$(pwd):/$WDIR" -w "/$WDIR" filebrowser/dev sh -c "\ - GO111MODULE=on go get -v ./... && \ - GO111MODULE=on go mod vendor && \ - GO111MODULE=off $dolint" -else - $dolint -fi diff --git a/wizard.sh b/wizard.sh new file mode 100755 index 00000000..f7c1781f --- /dev/null +++ b/wizard.sh @@ -0,0 +1,299 @@ +#!/bin/bash + +set -e + +untracked="(untracked)" +REPO=$(cd $(dirname $0); pwd) +LINT="false" +BUILD="false" +PUSH_LATEST="false" +RELEASE="" + +debugInfo () { + echo "Repo: $REPO" + echo "Will lint: $LINT" + echo "Will build: $BUILD" + echo "Will release: $RELEASE" + echo "Will push latest docker: $PUSH_LATEST" + echo "Use Docker: $USE_DOCKER" + echo "Is CI: $CI" +} + +dockerLogin () { + gpg --batch --gen-key <<-EOF +%echo Generating a standard key +Key-Type: DSA +Key-Length: 1024 +Subkey-Type: ELG-E +Subkey-Length: 1024 +Name-Real: Meshuggah Rocks +Name-Email: meshuggah@example.com +Expire-Date: 0 +# Do a commit here, so that we can later print "done" :-) +%commit +%echo done +EOF + + key=$(gpg --no-auto-check-trustdb --list-secret-keys | grep ^sec | cut -d/ -f2 | cut -d" " -f1) + pass init $key + + if [ "$(command -v docker-credential-pass)" = "" ]; then + docker run --rm -itv /usr/local/bin:/src filebrowser/dev sh -c "cp /go/bin/docker-credential-pass /src" + fi + + echo "$DOCKER_PASS" | docker login -u "$DOCKER_USER" --password-stdin +} + +dockerPushLatest () { + docker build -t filebrowser/filebrowser . + dockerLogin + docker push filebrowser/filebrowser + docker logout +} + +installRice () { + if ! [ -x "$(command -v rice)" ]; then + go get github.com/GeertJohan/go.rice/rice + fi +} + +buildAssets () { + installRice + cd $REPO/frontend + + if [ -d "dist" ]; then + rm -rf dist/* + fi; + + yarn install + yarn build + + cd $REPO/http + rice embed-go +} + +updateVersion () { + from=$1 + to=$2 + + echo "Updating version from \"$from\" to \"$to\"" + sed -i.bak "s|$from|$to|g" $REPO/types/version.go +} + +buildBinary () { + cd $REPO + go get -v ./... + updateVersion $untracked "($COMMIT_SHA)" + echo "Build CLI" + go build -a -o filebrowser + updateVersion "($COMMIT_SHA)" $untracked +} + +lint () { + dolint='gometalinter --exclude="rice-box.go" --exclude="vendor" --deadline=300s ./...' + wdir="/go/src/github.com/filebrowser/filebrowser" + + if [ "$USE_DOCKER" != "" ]; then + $(command -v winpty) docker run --rm -itv "/$(base):/$wdir" -w "/$wdir" filebrowser/dev sh -c "\ + GO111MODULE=on go get -v ./... && \ + GO111MODULE=on go mod vendor && \ + GO111MODULE=off $dolint" + else + $dolint + fi +} + +pushRicebox () { + COMMIT_SHA="$(git rev-parse --verify HEAD | cut -c1-8)" + + cd $REPO + + eval `ssh-agent -s` + openssl aes-256-cbc -K $encrypted_9ca81b5594f5_key -iv $encrypted_9ca81b5594f5_iv -in ./.ci/deploy_key.enc -d | ssh-add - + + git clone git@github.com:filebrowser/caddy caddy + cd caddy + cp $base/http/rice-box.go assets/ + sed -i 's/package lib/package assets/g' assets/rice-box.go + git checkout -b update-rice-box origin/master + git config --local user.name "Filebrowser Bot" + git config --local user.email "FilebrowserBot@users.noreply.github.com" + git commit -am "update rice-box $COMMIT_SHA" + + if [ $(git tag | grep "$TRAVIS_TAG" | wc -l) -ne 0 ]; then + git tag -d "$TRAVIS_TAG" + fi + + git tag "$TRAVIS_TAG" + + if [ "$(git ls-remote --heads origin update-rice-box)" != "" ]; then + git push -u origin update-rice-box + else + git push origin +update-rice-box + fi + + if [ "$(git ls-remote --heads origin update-rice-box)" != "" ]; then + git push origin "$TRAVIS_TAG" + else + git push origin :"$TRAVIS_TAG" + git push origin "$TRAVIS_TAG" + fi +} + +ciRelease () { + docker run --rm -itv $(pwd):/go/src/github.com/filebrowser/filebrowser \ + -v /var/run/docker.sock:/var/run/docker.sock filebrowser/dev goreleaser + + dockerPushTag + pushRicebox +} + +build () { + cd $REPO + + if [ -d http/"rice-box.go" ]; then + rm -rf http/rice-box.go + fi + + if [ "$USE_DOCKER" != "" ]; then + if [ -d "frontend/dist" ]; then + rm -rf frontend/dist + fi; + + if [ "$(command -v git)" != "" ]; then + COMMIT_SHA="$(git rev-parse HEAD | cut -c1-8)" + else + COMMIT_SHA="untracked" + fi + + $(command -v winpty) docker run -it \ + --name filebrowser-tmp \ + -v /$(pwd):/src:z \ + -w //src \ + -e COMMIT_SHA=$COMMIT_SHA \ + filebrowser/dev \ + sh -c "dos2unix wizard.sh && ./wizard.sh -b" + exitcode=$? + + if [ $exitcode -eq 0 ]; then + for d in "dist/" "node_modules/"; do + docker cp filebrowser-tmp://src/frontend/$d frontend + done + docker cp filebrowser-tmp://src/filebrowser ./filebrowser + docker cp filebrowser-tmp://src/http/rice-box.go ./http/rice-box.go + else + echo "BUILD FAILED!" + fi + docker rm -f filebrowser-tmp + else + buildAssets + buildBinary + fi +} + +release () { + cd $REPO + + echo "> Checking semver format" + + if [ $# -ne 1 ]; then + echo "This release script requires a single argument corresponding to the semver to be released. See semver.org" + exit 1 + fi + + semver=$(grep -P '^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)' <<< "$1") + + if [ $? -ne 0 ]; then + echo "Not valid semver format. See semver.org" + exit 1 + fi + + echo "> Checking matching $semver in frontend submodule" + + cd frontend + git fetch --all + + if [ $(git tag | grep "$semver" | wc -l) -eq 0 ]; then + echo "Tag $semver does not exist in submodule 'frontend'. Tag it and run this script again." + exit 1 + fi + + git rev-parse --verify --quiet release + if [ $? -ne 0 ]; then + git checkout -b release "$semver" + else + git checkout release + git reset --hard "$semver" + fi + + cd .. + + echo "> Updating submodule ref to $semver" + updateVersion $untracked $1 + git commit -am "chore: version $semver" + git tag "$1" + git push + git push --tags + + echo "> Commiting untracked version notice..." + updateVersion $1 $untracked + git commit -am "chore: setting untracked version [ci skip]" + git push + + echo "> Done!" +} + +usage() { + echo "Usage: $0 [-l] [-b] [-p] [-r ]" 1>&2; + exit 1; +} + +DEBUG="false" + +while getopts "pdlbr:" o; do + case "${o}" in + l) + LINT="true" + ;; + b) + BUILD="true" + ;; + r) + RELEASE=${OPTARG} + ;; + p) + PUSH_LATEST="true" + ;; + d) + DEBUG="true" + ;; + *) + usage + ;; + esac +done +shift $((OPTIND-1)) + +if [ "$DEBUG" == "true" ]; then + debugInfo +fi + +if [ "$LINT" == "true" ]; then + lint +fi + +if [ "$BUILD" == "true" ]; then + build +fi + +if [ "$PUSH_LATEST" == "true" ]; then + dockerPushLatest +fi + +if [ "$RELEASE" != "" ]; then + if [ "$CI" == "true" ]; then + ciRelease + else + release $RELEASE + fi +fi