From 221e3783cc0051110ded21ff72d955968b6c6faf Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Tue, 4 Feb 2020 09:39:56 +1100 Subject: [PATCH 1/7] Tag develop builds as latest. Version in makefile --- .travis.yml | 9 +++------ Makefile | 3 ++- docker/production/x86_64/Dockerfile | 2 +- scripts/cross-compile.sh | 3 +-- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1e15916f910..e90829fb9db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,15 +18,12 @@ script: #- make vet - make it after_success: -- if [ "$TRAVIS_BRANCH" = "develop" ]; then export TAG_SUFFIX="_dev"; elif [ "$TRAVIS_BRANCH" != "master" ]; then export TAG_SUFFIX="_$TRAVIS_BRANCH"; fi -- export STASH_VERSION="v0.0.0-alpha${TAG_SUFFIX}" - docker pull stashapp/compiler:develop -- sh ./scripts/cross-compile.sh ${STASH_VERSION} +- sh ./scripts/cross-compile.sh - 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then sh ./scripts/upload-pull-request.sh; fi' before_deploy: -- if [ "$TRAVIS_BRANCH" = "develop" ]; then export TAG_SUFFIX="_dev"; fi -- git tag -f ${STASH_VERSION} -- git push -f --tags +# push the latest tag when on the develop branch +- if [ "$TRAVIS_BRANCH" = "develop" ]; then git tag -f latest; git push -f --tags; fi - export RELEASE_DATE=$(date +'%Y-%m-%d %H:%M:%S %Z') deploy: provider: releases diff --git a/Makefile b/Makefile index a0194001a1c..df2ad8e003e 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,8 @@ release: generate ui build build: $(eval DATE := $(shell go run scripts/getDate.go)) $(eval GITHASH := $(shell git rev-parse --short HEAD)) - $(SET) CGO_ENABLED=1 $(SEPARATOR) go build -mod=vendor -v -ldflags "-X 'github.com/stashapp/stash/pkg/api.buildstamp=$(DATE)' -X 'github.com/stashapp/stash/pkg/api.githash=$(GITHASH)'" + $(eval STASH_VERSION := $(shell git describe --tags --exclude latest)) + $(SET) CGO_ENABLED=1 $(SEPARATOR) go build -mod=vendor -v -ldflags "-X 'github.com/stashapp/stash/pkg/api.version=$(STASH_VERSION)' -X 'github.com/stashapp/stash/pkg/api.buildstamp=$(DATE)' -X 'github.com/stashapp/stash/pkg/api.githash=$(GITHASH)'" install: packr2 install diff --git a/docker/production/x86_64/Dockerfile b/docker/production/x86_64/Dockerfile index d70a0883a2f..0f4633bbfb7 100644 --- a/docker/production/x86_64/Dockerfile +++ b/docker/production/x86_64/Dockerfile @@ -7,7 +7,7 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* WORKDIR / SHELL ["/bin/bash", "-o", "pipefail", "-c"] -RUN curl -L -o /stash $(curl -s https://api.github.com/repos/stashapp/stash/releases | grep -F 'stash-linux' | grep download | head -n 1 | cut -d'"' -f4) && \ +RUN curl -L -o /stash $(curl -s https://api.github.com/repos/stashapp/stash/releases | grep -F 'latest/stash-linux' | grep download | head -n 1 | cut -d'"' -f4) && \ chmod +x /stash && \ curl -o /ffmpeg.tar.xz https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz && \ tar xf /ffmpeg.tar.xz && \ diff --git a/scripts/cross-compile.sh b/scripts/cross-compile.sh index f563d867e64..a22eee863db 100755 --- a/scripts/cross-compile.sh +++ b/scripts/cross-compile.sh @@ -1,9 +1,8 @@ #!/bin/sh -STASH_VERSION="$1" - DATE=`go run -mod=vendor scripts/getDate.go` GITHASH=`git rev-parse --short HEAD` +STASH_VERSION=`git describe --tags --exclude latest` VERSION_FLAGS="-X 'github.com/stashapp/stash/pkg/api.version=$STASH_VERSION' -X 'github.com/stashapp/stash/pkg/api.buildstamp=$DATE' -X 'github.com/stashapp/stash/pkg/api.githash=$GITHASH'" SETUP="export GO111MODULE=on; export CGO_ENABLED=1;" WINDOWS="GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ packr2 build -o dist/stash-win.exe -ldflags \"-extldflags '-static' $VERSION_FLAGS\" -tags extended -v -mod=vendor;" From fb290bb39e1cccc4f3845558250361b705945a89 Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Tue, 4 Feb 2020 11:38:32 +1100 Subject: [PATCH 2/7] Rename latest to latest_develop --- .travis.yml | 2 +- Makefile | 2 +- docker/production/x86_64/Dockerfile | 2 +- scripts/cross-compile.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index e90829fb9db..71850ad4ee5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,7 +23,7 @@ after_success: - 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then sh ./scripts/upload-pull-request.sh; fi' before_deploy: # push the latest tag when on the develop branch -- if [ "$TRAVIS_BRANCH" = "develop" ]; then git tag -f latest; git push -f --tags; fi +- if [ "$TRAVIS_BRANCH" = "develop" ]; then git tag -f latest_develop; git push -f --tags; fi - export RELEASE_DATE=$(date +'%Y-%m-%d %H:%M:%S %Z') deploy: provider: releases diff --git a/Makefile b/Makefile index df2ad8e003e..2cb51b4afbb 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ release: generate ui build build: $(eval DATE := $(shell go run scripts/getDate.go)) $(eval GITHASH := $(shell git rev-parse --short HEAD)) - $(eval STASH_VERSION := $(shell git describe --tags --exclude latest)) + $(eval STASH_VERSION := $(shell git describe --tags --exclude latest_develop)) $(SET) CGO_ENABLED=1 $(SEPARATOR) go build -mod=vendor -v -ldflags "-X 'github.com/stashapp/stash/pkg/api.version=$(STASH_VERSION)' -X 'github.com/stashapp/stash/pkg/api.buildstamp=$(DATE)' -X 'github.com/stashapp/stash/pkg/api.githash=$(GITHASH)'" install: diff --git a/docker/production/x86_64/Dockerfile b/docker/production/x86_64/Dockerfile index 0f4633bbfb7..1955bb51e11 100644 --- a/docker/production/x86_64/Dockerfile +++ b/docker/production/x86_64/Dockerfile @@ -7,7 +7,7 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* WORKDIR / SHELL ["/bin/bash", "-o", "pipefail", "-c"] -RUN curl -L -o /stash $(curl -s https://api.github.com/repos/stashapp/stash/releases | grep -F 'latest/stash-linux' | grep download | head -n 1 | cut -d'"' -f4) && \ +RUN curl -L -o /stash $(curl -s https://api.github.com/repos/stashapp/stash/releases | grep -F 'latest_develop/stash-linux' | grep download | head -n 1 | cut -d'"' -f4) && \ chmod +x /stash && \ curl -o /ffmpeg.tar.xz https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz && \ tar xf /ffmpeg.tar.xz && \ diff --git a/scripts/cross-compile.sh b/scripts/cross-compile.sh index a22eee863db..daf9930ef90 100755 --- a/scripts/cross-compile.sh +++ b/scripts/cross-compile.sh @@ -2,7 +2,7 @@ DATE=`go run -mod=vendor scripts/getDate.go` GITHASH=`git rev-parse --short HEAD` -STASH_VERSION=`git describe --tags --exclude latest` +STASH_VERSION=`git describe --tags --exclude latest_develop` VERSION_FLAGS="-X 'github.com/stashapp/stash/pkg/api.version=$STASH_VERSION' -X 'github.com/stashapp/stash/pkg/api.buildstamp=$DATE' -X 'github.com/stashapp/stash/pkg/api.githash=$GITHASH'" SETUP="export GO111MODULE=on; export CGO_ENABLED=1;" WINDOWS="GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ packr2 build -o dist/stash-win.exe -ldflags \"-extldflags '-static' $VERSION_FLAGS\" -tags extended -v -mod=vendor;" From 9ad698876ed690951bc347a33a9ee9eee23c5a74 Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Tue, 4 Feb 2020 11:53:54 +1100 Subject: [PATCH 3/7] Update GetLatestVersion --- pkg/api/check_version.go | 99 +++++++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 43 deletions(-) diff --git a/pkg/api/check_version.go b/pkg/api/check_version.go index c29fd6b23f5..c7608047439 100644 --- a/pkg/api/check_version.go +++ b/pkg/api/check_version.go @@ -3,17 +3,20 @@ package api import ( "encoding/json" "fmt" - "github.com/stashapp/stash/pkg/logger" "io/ioutil" "net/http" + "regexp" "runtime" "time" + + "github.com/stashapp/stash/pkg/logger" ) //we use the github REST V3 API as no login is required const apiURL string = "https://api.github.com/repos/stashapp/stash/tags" const apiReleases string = "https://api.github.com/repos/stashapp/stash/releases" const apiAcceptHeader string = "application/vnd.github.v3+json" +const developmentTag string = "latest_develop" var stashReleases = func() map[string]string { return map[string]string{ @@ -93,74 +96,85 @@ type githubAsset struct { Browser_download_url string } -//gets latest version (git commit hash) from github API -//the repo's tags are used to find the latest version -//of the "master" or "develop" branch +// GetLatestVersion gets latest version (git commit hash) from github API +// If running a build from the "master" branch, then the latest full release +// is used, otherwise it uses the release that is tagged with "latest_develop" +// which is the latest pre-release build. func GetLatestVersion(shortHash bool) (latestVersion string, latestRelease string, err error) { platform := fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH) wantedRelease := stashReleases()[platform] - branch, _, _ := GetVersion() - if branch == "" { + version, _, _ := GetVersion() + if version == "" { return "", "", fmt.Errorf("Stash doesn't have a version. Version check not supported.") } + // if the version is suffixed with -x-xxxx, then we are running a development build + usePreRelease := false + re := regexp.MustCompile(`-\d+-g\w+$`) + if re.MatchString(version) { + usePreRelease = true + } + client := &http.Client{ Timeout: 3 * time.Second, } - req, _ := http.NewRequest("GET", apiReleases, nil) + url := apiReleases + if !usePreRelease { + // just get the latest full release + url += "/latest" + } else { + // get the release tagged with the development tag + url += "/tags/" + developmentTag + } + req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", apiAcceptHeader) // gh api recommendation , send header with api version response, err := client.Do(req) - input := make([]githubReleasesResponse, 0) + release := githubReleasesResponse{} + + if response.StatusCode != http.StatusOK { + return "", "", fmt.Errorf("Github API request failed: %s", response.Status) + } if err != nil { return "", "", fmt.Errorf("Github API request failed: %s", err) - } else { + } - defer response.Body.Close() + defer response.Body.Close() - data, err := ioutil.ReadAll(response.Body) - if err != nil { - return "", "", fmt.Errorf("Github API read response failed: %s", err) + data, err := ioutil.ReadAll(response.Body) + if err != nil { + return "", "", fmt.Errorf("Github API read response failed: %s", err) + } + err = json.Unmarshal(data, &release) + if err != nil { + return "", "", fmt.Errorf("Unmarshalling Github API response failed: %s", err) + } + + if release.Prerelease == usePreRelease { + if shortHash { + latestVersion = release.Target_commitish[0:7] //shorthash is first 7 digits of git commit hash } else { - err = json.Unmarshal(data, &input) - if err != nil { - return "", "", fmt.Errorf("Unmarshalling Github API response failed: %s", err) - } else { - - for _, ghApi := range input { - if ghApi.Tag_name == branch { - - if shortHash { - latestVersion = ghApi.Target_commitish[0:7] //shorthash is first 7 digits of git commit hash - } else { - latestVersion = ghApi.Target_commitish - } - if wantedRelease != "" { - for _, asset := range ghApi.Assets { - if asset.Name == wantedRelease { - latestRelease = asset.Browser_download_url - break - } - - } - } - break - } + latestVersion = release.Target_commitish + } + if wantedRelease != "" { + for _, asset := range release.Assets { + if asset.Name == wantedRelease { + latestRelease = asset.Browser_download_url + break } - } } - if latestVersion == "" { - return "", "", fmt.Errorf("No version found for \"%s\"", branch) - } } - return latestVersion, latestRelease, nil + if latestVersion == "" { + return "", "", fmt.Errorf("No version found for \"%s\"", version) + } + return latestVersion, latestRelease, nil } func printLatestVersion() { @@ -175,5 +189,4 @@ func printLatestVersion() { logger.Infof("New version: (%s) available.", latest) } } - } From 7f754880d6a5ad969d55e4387900dc11518bec19 Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Tue, 4 Feb 2020 13:37:41 +1100 Subject: [PATCH 4/7] Separate master and develop releases --- .travis.yml | 58 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/.travis.yml b/.travis.yml index 71850ad4ee5..02f48526637 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,22 +25,50 @@ before_deploy: # push the latest tag when on the develop branch - if [ "$TRAVIS_BRANCH" = "develop" ]; then git tag -f latest_develop; git push -f --tags; fi - export RELEASE_DATE=$(date +'%Y-%m-%d %H:%M:%S %Z') +- export STASH_VERSION=$(git describe --tags --exclude latest_develop) +# set TRAVIS_TAG explcitly to the version so that it doesn't pick up latest_develop +- if [ "$TRAVIS_BRANCH" = "master"]; then export TRAVIS_TAG=${STASH_VERSION}; fi deploy: - provider: releases - api_key: - secure: tGJ2q62CfPdayid2qEtW2aGRhMgCl3lBXYYQqp3eH0vFgIIf6cs7IDX7YC/x3XKMEQ/iMLZmtCXZvSTqNrD6Sk7MSnt30GIs+4uxIZDnnd8mV5X3K4n4gjD+NAORc4DrQBvUGrYMKJsR5gtkH0nu6diWb1o1If7OiJEuCPRhrmQYcza7NUdABnA9Z2wn2RNUV9Ga33WUCqLMEU5GtNBlfQPiP/khCQrqn/ocR6wUjYut3J6YagzqH4wsfJi3glHyWtowcNIw1LZi5zFxHD/bRBT4Tln7yypkjWNq9eQILA6i6kRUGf7ggyTx26/k8n4tnu+QD0vVh4EcjlThpU/LGyUXzKrrxjRwaDZnM0oYxg5AfHcBuAiAdo0eWnV3lEWRfTJMIVb9MPf4qDmzR4RREfB5OXOxwq3ODeCcJE8sTIMD/wBPZrlqS/QrRpND2gn2X4snkVukN9t9F4CMTFMtVSzFV7TDJW5E5Lq6VEExulteQhs6kcK9NRPNAaLgRQAw7X9kVWfDtiGUP+fE2i8F9Bo8bm7sOT5O5VPMPykx3EgeNg1IqIgMTCsMlhMJT4xBJoQUgmd2wWyf3Ryw+P+sFgdb5Sd7+lFgJBjMUUoOxMxAOiEgdFvCXcr+/Udyz2RdtetU1/6VzXzLPcKOw0wubZeBkISqu7o9gpfdMP9Eq00= - file: - - dist/stash-osx - - dist/stash-win.exe - - dist/stash-linux - - dist/stash-pi - skip_cleanup: true - overwrite: true - body: ${RELEASE_DATE} - on: - repo: stashapp/stash - all_branches: true - condition: $TRAVIS_BRANCH =~ ^(master|develop)$ + # latest develop release + - provider: releases + api_key: + secure: tGJ2q62CfPdayid2qEtW2aGRhMgCl3lBXYYQqp3eH0vFgIIf6cs7IDX7YC/x3XKMEQ/iMLZmtCXZvSTqNrD6Sk7MSnt30GIs+4uxIZDnnd8mV5X3K4n4gjD+NAORc4DrQBvUGrYMKJsR5gtkH0nu6diWb1o1If7OiJEuCPRhrmQYcza7NUdABnA9Z2wn2RNUV9Ga33WUCqLMEU5GtNBlfQPiP/khCQrqn/ocR6wUjYut3J6YagzqH4wsfJi3glHyWtowcNIw1LZi5zFxHD/bRBT4Tln7yypkjWNq9eQILA6i6kRUGf7ggyTx26/k8n4tnu+QD0vVh4EcjlThpU/LGyUXzKrrxjRwaDZnM0oYxg5AfHcBuAiAdo0eWnV3lEWRfTJMIVb9MPf4qDmzR4RREfB5OXOxwq3ODeCcJE8sTIMD/wBPZrlqS/QrRpND2gn2X4snkVukN9t9F4CMTFMtVSzFV7TDJW5E5Lq6VEExulteQhs6kcK9NRPNAaLgRQAw7X9kVWfDtiGUP+fE2i8F9Bo8bm7sOT5O5VPMPykx3EgeNg1IqIgMTCsMlhMJT4xBJoQUgmd2wWyf3Ryw+P+sFgdb5Sd7+lFgJBjMUUoOxMxAOiEgdFvCXcr+/Udyz2RdtetU1/6VzXzLPcKOw0wubZeBkISqu7o9gpfdMP9Eq00= + file: + - dist/stash-osx + - dist/stash-win.exe + - dist/stash-linux + - dist/stash-pi + skip_cleanup: true + overwrite: true + name: "${STASH_VERSION}: Latest development build" + body: This is always the latest committed version on the develop branch. Use as your own risk! + prerelease: true + on: + repo: stashapp/stash + branches: develop + # official master release - only build when tagged + - provider: releases + api_key: + secure: tGJ2q62CfPdayid2qEtW2aGRhMgCl3lBXYYQqp3eH0vFgIIf6cs7IDX7YC/x3XKMEQ/iMLZmtCXZvSTqNrD6Sk7MSnt30GIs+4uxIZDnnd8mV5X3K4n4gjD+NAORc4DrQBvUGrYMKJsR5gtkH0nu6diWb1o1If7OiJEuCPRhrmQYcza7NUdABnA9Z2wn2RNUV9Ga33WUCqLMEU5GtNBlfQPiP/khCQrqn/ocR6wUjYut3J6YagzqH4wsfJi3glHyWtowcNIw1LZi5zFxHD/bRBT4Tln7yypkjWNq9eQILA6i6kRUGf7ggyTx26/k8n4tnu+QD0vVh4EcjlThpU/LGyUXzKrrxjRwaDZnM0oYxg5AfHcBuAiAdo0eWnV3lEWRfTJMIVb9MPf4qDmzR4RREfB5OXOxwq3ODeCcJE8sTIMD/wBPZrlqS/QrRpND2gn2X4snkVukN9t9F4CMTFMtVSzFV7TDJW5E5Lq6VEExulteQhs6kcK9NRPNAaLgRQAw7X9kVWfDtiGUP+fE2i8F9Bo8bm7sOT5O5VPMPykx3EgeNg1IqIgMTCsMlhMJT4xBJoQUgmd2wWyf3Ryw+P+sFgdb5Sd7+lFgJBjMUUoOxMxAOiEgdFvCXcr+/Udyz2RdtetU1/6VzXzLPcKOw0wubZeBkISqu7o9gpfdMP9Eq00= + file: + - dist/stash-osx + - dist/stash-win.exe + - dist/stash-linux + - dist/stash-pi + # make the release a draft so the maintainers can confirm before releasing + draft: true + skip_cleanup: true + overwrite: true + # don't write the body. To be done manually for now. In future we might + # want to generate the changelog or get it from a file + name: ${STASH_VERSION} + on: + repo: stashapp/stash + branches: master + tags: true + # make sure we don't release using the latest_develop tag + condition: $TRAVIS_TAG != latest_develop + branches: only: - master From b123de5fe0e07490a97e6a72d475b64576d6fbff Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Tue, 4 Feb 2020 13:40:28 +1100 Subject: [PATCH 5/7] Add release date back into development version --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 02f48526637..3d5a94008d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,7 +41,7 @@ deploy: skip_cleanup: true overwrite: true name: "${STASH_VERSION}: Latest development build" - body: This is always the latest committed version on the develop branch. Use as your own risk! + body: ${RELEASE_DATE}\n This is always the latest committed version on the develop branch. Use as your own risk! prerelease: true on: repo: stashapp/stash From 9ea13958c199b3e7b6eb95bb059114429536a506 Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Tue, 4 Feb 2020 14:09:18 +1100 Subject: [PATCH 6/7] Remove unused code --- pkg/api/check_version.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/pkg/api/check_version.go b/pkg/api/check_version.go index c7608047439..c0eb7370e6f 100644 --- a/pkg/api/check_version.go +++ b/pkg/api/check_version.go @@ -13,7 +13,6 @@ import ( ) //we use the github REST V3 API as no login is required -const apiURL string = "https://api.github.com/repos/stashapp/stash/tags" const apiReleases string = "https://api.github.com/repos/stashapp/stash/releases" const apiAcceptHeader string = "application/vnd.github.v3+json" const developmentTag string = "latest_develop" @@ -27,17 +26,6 @@ var stashReleases = func() map[string]string { } } -type githubTagResponse struct { - Name string - Zipball_url string - Tarball_url string - Commit struct { - Sha string - Url string - } - Node_id string -} - type githubReleasesResponse struct { Url string Assets_url string From bbd66393a6807f1fc55a687724bbb014fc737b5a Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Tue, 4 Feb 2020 14:49:17 +1100 Subject: [PATCH 7/7] Two minute limit per file to upload to transfer.sh --- scripts/upload-pull-request.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/upload-pull-request.sh b/scripts/upload-pull-request.sh index e469ae6898d..54807b6d71d 100644 --- a/scripts/upload-pull-request.sh +++ b/scripts/upload-pull-request.sh @@ -5,10 +5,11 @@ uploadFile() { FILE=$1 BASENAME="$(basename "${FILE}")" - uploadedTo=`curl --upload-file $FILE "https://transfer.sh/$BASENAME"` + # abort if it takes more than two minutes to upload + uploadedTo=`curl -m 120 --upload-file $FILE "https://transfer.sh/$BASENAME"` echo "$BASENAME uploaded to url: $uploadedTo" } uploadFile "dist/stash-osx" uploadFile "dist/stash-win.exe" -uploadFile "dist/stash-linux" \ No newline at end of file +uploadFile "dist/stash-linux"