diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3aff928c2..c9e919e9a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,21 +31,62 @@ jobs: path: ui/v2.5/node_modules key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('ui/v2.5/yarn.lock') }} + - name: Cache UI build + uses: actions/cache@v2 + id: cache-ui + env: + cache-name: cache-ui + with: + path: ui/v2.5/build + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('ui/v2.5/yarn.lock', 'ui/v2.5/public/**', 'ui/v2.5/src/**', 'graphql/**/*.graphql') }} + + - name: Cache go build + uses: actions/cache@v2 + env: + cache-name: cache-go-cache + with: + path: .go-cache + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/go.sum') }} + + - name: Start build container + run: | + mkdir -p .go-cache + docker run -d --name build --mount type=bind,source="$(pwd)",target=/stash,consistency=delegated --mount type=bind,source="$(pwd)/.go-cache",target=/root/.cache/go-build,consistency=delegated -w /stash $COMPILER_IMAGE tail -f /dev/null + - name: Pre-install - run: docker run --rm --mount type=bind,source="$(pwd)",target=/stash,consistency=delegated -w /stash $COMPILER_IMAGE /bin/bash -c "make pre-ui" + run: docker exec -t build /bin/bash -c "make pre-ui" - name: Generate - run: docker run --rm --mount type=bind,source="$(pwd)",target=/stash,consistency=delegated -w /stash $COMPILER_IMAGE /bin/bash -c "make generate" + run: docker exec -t build /bin/bash -c "make generate" + - name: Validate UI + # skip UI validation for pull requests if UI is unchanged + if: ${{ github.event_name != 'pull_request' || steps.cache-ui.outputs.cache-hit != 'true' }} + run: docker exec -t build /bin/bash -c "make ui-validate" + # TODO: Replace with `make validate` once `revive` is bundled in COMPILER_IMAGE - name: Validate - run: docker run --rm --mount type=bind,source="$(pwd)",target=/stash,consistency=delegated -w /stash $COMPILER_IMAGE /bin/bash -c "make ui-validate fmt-check vet it" + run: docker exec -t build /bin/bash -c "make fmt-check vet it" - name: Build UI - run: docker run --rm --mount type=bind,source="$(pwd)",target=/stash,consistency=delegated -w /stash $COMPILER_IMAGE /bin/bash -c "make ui-only" + # skip UI build for pull requests if UI is unchanged (UI was cached) + # this means that the build version/time may be incorrect if the UI is + # not changed in a pull request + if: ${{ github.event_name != 'pull_request' || steps.cache-ui.outputs.cache-hit != 'true' }} + run: docker exec -t build /bin/bash -c "make ui-only" - name: Compile for all supported platforms - run: ./scripts/cross-compile.sh + run: | + docker exec -t build /bin/bash -c "make packr" + docker exec -t build /bin/bash -c "make cross-compile-windows" + docker exec -t build /bin/bash -c "make cross-compile-osx" + docker exec -t build /bin/bash -c "make cross-compile-linux" + docker exec -t build /bin/bash -c "make cross-compile-linux-arm64v8" + docker exec -t build /bin/bash -c "make cross-compile-linux-arm32v7" + docker exec -t build /bin/bash -c "make cross-compile-pi" + + - name: Cleanup build container + run: docker rm -f -v build - name: Generate checksums run: | diff --git a/Makefile b/Makefile index 03d86daeb..fae4673b7 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,9 @@ ifdef OUTPUT OUTPUT := -o $(OUTPUT) endif +export CGO_ENABLED = 1 +export GO111MODULE = on + .PHONY: release pre-build install clean release: generate ui build-release @@ -41,7 +44,7 @@ endif build: pre-build $(eval LDFLAGS := $(LDFLAGS) -X 'github.com/stashapp/stash/pkg/api.version=$(STASH_VERSION)' -X 'github.com/stashapp/stash/pkg/api.buildstamp=$(BUILD_DATE)' -X 'github.com/stashapp/stash/pkg/api.githash=$(GITHASH)') - $(SET) CGO_ENABLED=1 $(SEPARATOR) go build $(OUTPUT) -mod=vendor -v -tags "sqlite_omit_load_extension osusergo netgo" -ldflags "$(LDFLAGS) $(EXTRA_LDFLAGS)" + go build $(OUTPUT) -mod=vendor -v -tags "sqlite_omit_load_extension osusergo netgo" -ldflags "$(LDFLAGS) $(EXTRA_LDFLAGS)" # strips debug symbols from the release build # consider -trimpath in go build if we move to go 1.13+ @@ -51,6 +54,49 @@ build-release: build build-release-static: EXTRA_LDFLAGS := -extldflags=-static -s -w build-release-static: build +# cross-compile- targets should be run within the compiler docker container +cross-compile-windows: export GOOS := windows +cross-compile-windows: export GOARCH := amd64 +cross-compile-windows: export CC := x86_64-w64-mingw32-gcc +cross-compile-windows: export CXX := x86_64-w64-mingw32-g++ +cross-compile-windows: OUTPUT := -o dist/stash-win.exe +cross-compile-windows: build-release-static + +cross-compile-osx: export GOOS := darwin +cross-compile-osx: export GOARCH := amd64 +cross-compile-osx: export CC := o64-clang +cross-compile-osx: export CXX := o64-clang++ +cross-compile-osx: OUTPUT := -o dist/stash-osx +# can't use static build for OSX +cross-compile-osx: build-release + +cross-compile-linux: export GOOS := linux +cross-compile-linux: export GOARCH := amd64 +cross-compile-linux: OUTPUT := -o dist/stash-linux +cross-compile-linux: build-release-static + +cross-compile-linux-arm64v8: export GOOS := linux +cross-compile-linux-arm64v8: export GOARCH := arm64 +cross-compile-linux-arm64v8: export CC := aarch64-linux-gnu-gcc +cross-compile-linux-arm64v8: OUTPUT := -o dist/stash-linux-arm64v8 +cross-compile-linux-arm64v8: build-release-static + +cross-compile-linux-arm32v7: export GOOS := linux +cross-compile-linux-arm32v7: export GOARCH := arm +cross-compile-linux-arm32v7: export GOARM := 7 +cross-compile-linux-arm32v7: export CC := arm-linux-gnueabihf-gcc +cross-compile-linux-arm32v7: OUTPUT := -o dist/stash-linux-arm32v7 +cross-compile-linux-arm32v7: build-release-static + +cross-compile-pi: export GOOS := linux +cross-compile-pi: export GOARCH := arm +cross-compile-pi: export GOARM := 6 +cross-compile-pi: export CC := arm-linux-gnueabi-gcc +cross-compile-pi: OUTPUT := -o dist/stash-pi +cross-compile-pi: build-release-static + +cross-compile-all: cross-compile-windows cross-compile-osx cross-compile-linux cross-compile-linux-arm64v8 cross-compile-linux-arm32v7 cross-compile-pi + install: packr2 install diff --git a/scripts/cross-compile.sh b/scripts/cross-compile.sh index 5e6d302d4..e46abed28 100755 --- a/scripts/cross-compile.sh +++ b/scripts/cross-compile.sh @@ -10,12 +10,12 @@ STASH_VERSION=`git describe --tags --exclude latest_develop` SETENV="BUILD_DATE=\"$BUILD_DATE\" GITHASH=$GITHASH STASH_VERSION=\"$STASH_VERSION\"" SETUP="export GO111MODULE=on; export CGO_ENABLED=1; set -e; echo '=== Running packr ==='; make packr;" SETUP_FAST="export GO111MODULE=on; export CGO_ENABLED=1;" -WINDOWS="echo '=== Building Windows binary ==='; $SETENV GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ LDFLAGS=\"-extldflags '-static' \" OUTPUT=\"dist/stash-win.exe\" make build-release;" -DARWIN="echo '=== Building OSX binary ==='; $SETENV GOOS=darwin GOARCH=amd64 CC=o64-clang CXX=o64-clang++ OUTPUT=\"dist/stash-osx\" make build-release;" -LINUX_AMD64="echo '=== Building Linux (amd64) binary ==='; $SETENV GOOS=linux GOARCH=amd64 OUTPUT=\"dist/stash-linux\" make build-release-static;" -LINUX_ARM64v8="echo '=== Building Linux (armv8/arm64) binary ==='; $SETENV GOOS=linux GOARCH=arm64 CC=aarch64-linux-gnu-gcc OUTPUT=\"dist/stash-linux-arm64v8\" make build-release-static;" -LINUX_ARM32v7="echo '=== Building Linux (armv7/armhf) binary ==='; $SETENV GOOS=linux GOARCH=arm GOARM=7 CC=arm-linux-gnueabihf-gcc OUTPUT=\"dist/stash-linux-arm32v7\" make build-release-static;" -LINUX_ARM32v6="echo '=== Building Linux (armv6 | Raspberry Pi 1) binary ==='; $SETENV GOOS=linux GOARCH=arm GOARM=6 CC=arm-linux-gnueabi-gcc OUTPUT=\"dist/stash-pi\" make build-release-static;" +WINDOWS="echo '=== Building Windows binary ==='; $SETENV make cross-compile-windows;" +DARWIN="echo '=== Building OSX binary ==='; $SETENV make cross-compile-osx;" +LINUX_AMD64="echo '=== Building Linux (amd64) binary ==='; $SETENV make cross-compile-linux;" +LINUX_ARM64v8="echo '=== Building Linux (armv8/arm64) binary ==='; $SETENV make cross-compile-linux-arm64v8;" +LINUX_ARM32v7="echo '=== Building Linux (armv7/armhf) binary ==='; $SETENV make cross-compile-linux-arm32v7;" +LINUX_ARM32v6="echo '=== Building Linux (armv6 | Raspberry Pi 1) binary ==='; $SETENV make cross-compile-pi;" BUILD_COMPLETE="echo '=== Build complete ==='" # if build target ends with -fast then use prebuilt packr2. eg amd64-fast or all-fast