From 6aaec5423eaa5e8da44a78614e47626f8b97fffd Mon Sep 17 00:00:00 2001 From: garethgeorge Date: Fri, 16 Feb 2024 01:13:38 -0800 Subject: [PATCH] chore: add build test for windows --- .github/workflows/build-and-test.yml | 30 ++++++++-- .github/workflows/release-please.yml | 2 +- .github/workflows/release.yml | 2 +- internal/api/backresthandler_test.go | 8 +++ scripts/build-all.sh | 18 ------ scripts/build.sh | 7 --- scripts/install-deps.sh | 4 -- scripts/run.sh | 4 -- webui/package-lock.json | 84 ++++++++++++++++++++++++++++ webui/package.json | 6 +- webui/webui.go | 12 ---- webui/webui_test.go | 40 +++++++++++++ webui/webuinix.go | 4 +- webui/webuiwin.go | 3 +- 14 files changed, 169 insertions(+), 55 deletions(-) delete mode 100755 scripts/build-all.sh delete mode 100755 scripts/build.sh delete mode 100755 scripts/install-deps.sh delete mode 100755 scripts/run.sh create mode 100644 webui/webui_test.go diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 01651c3d..2928e2bc 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -11,7 +11,7 @@ on: workflow_dispatch: jobs: - build: + build-nix: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -26,9 +26,6 @@ jobs: with: node-version: "20" - - name: Install Deps - run: ./scripts/install-deps.sh - - name: Build uses: goreleaser/goreleaser-action@v5 with: @@ -38,3 +35,28 @@ jobs: - name: Test run: PATH=$(pwd):$PATH go test ./... + + build-win: + runs-on: windows-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: "1.21" + + - name: Setup NodeJS + uses: actions/setup-node@v4 + with: + node-version: "20" + + - name: Generate + run: cd webui && npm install && npm run build-windows-devel + + - name: Build + run: go build ./... + + - name: Targeted Test + run: | + go test ./internal/api diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index b945d689..5d93e887 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -7,7 +7,7 @@ permissions: contents: write pull-requests: write -name: release-please +name: Release Please jobs: release-please: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2b8293dc..0e731d15 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: "tagged-release" +name: Tagged Release on: push: diff --git a/internal/api/backresthandler_test.go b/internal/api/backresthandler_test.go index e47deee1..3cc70618 100644 --- a/internal/api/backresthandler_test.go +++ b/internal/api/backresthandler_test.go @@ -6,6 +6,7 @@ import ( "fmt" "os" "path" + "runtime" "slices" "testing" "time" @@ -221,6 +222,10 @@ func TestMultipleBackup(t *testing.T) { } func TestHookExecution(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("skipping test on windows") + } + dir := t.TempDir() hookOutputBefore := path.Join(dir, "before.txt") @@ -410,6 +415,9 @@ func createSystemUnderTest(t *testing.T, config config.ConfigStore) systemUnderT if err != nil { t.Fatalf("Failed to create oplog: %v", err) } + t.Cleanup(func() { + oplog.Close() + }) logStore := rotatinglog.NewRotatingLog(dir+"/log", 10) orch, err := orchestrator.NewOrchestrator( resticBin, cfg, oplog, logStore, diff --git a/scripts/build-all.sh b/scripts/build-all.sh deleted file mode 100755 index e617bd08..00000000 --- a/scripts/build-all.sh +++ /dev/null @@ -1,18 +0,0 @@ -#! /bin/sh - -(cd webui && npm i && npm run build) - -for bin in backrest-*; do - rm -f $bin -done - -find webui/dist -name '*.map' -exec rm ./{} \; - -GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o backrest-linux-amd64 -GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o backrest-linux-arm64 -GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -o backrest-darwin-amd64 -GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w" -o backrest-darwin-arm64 - -for bin in backrest-*; do - rice append --exec $bin -done diff --git a/scripts/build.sh b/scripts/build.sh deleted file mode 100755 index 1cd6e776..00000000 --- a/scripts/build.sh +++ /dev/null @@ -1,7 +0,0 @@ -#! /bin/sh -set -x - -(cd webui && npm i && npm run build) -rm -f backrest -go build . -rice append --exec backrest diff --git a/scripts/install-deps.sh b/scripts/install-deps.sh deleted file mode 100755 index 69bb4727..00000000 --- a/scripts/install-deps.sh +++ /dev/null @@ -1,4 +0,0 @@ -#! /bin/sh -set -x - -go install github.com/GeertJohan/go.rice/rice@latest diff --git a/scripts/run.sh b/scripts/run.sh deleted file mode 100755 index 66127fee..00000000 --- a/scripts/run.sh +++ /dev/null @@ -1,4 +0,0 @@ -#! /bin/sh -set -x - -DEBUG=1 go run . diff --git a/webui/package-lock.json b/webui/package-lock.json index bc8b7821..aa6e71b7 100644 --- a/webui/package-lock.json +++ b/webui/package-lock.json @@ -29,6 +29,7 @@ }, "devDependencies": { "@parcel/transformer-sass": "^2.10.3", + "cross-env": "^7.0.3", "events": "^3.3.0", "stream-browserify": "^3.0.0" } @@ -2692,6 +2693,38 @@ } } }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/css-select": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", @@ -3210,6 +3243,12 @@ "node": ">=0.12.0" } }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3690,6 +3729,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -4500,6 +4548,27 @@ "node": ">=10" } }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -4745,6 +4814,21 @@ "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==" }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/webui/package.json b/webui/package.json index a6f4ebf9..b005d0c4 100644 --- a/webui/package.json +++ b/webui/package.json @@ -4,8 +4,9 @@ "description": "", "scripts": { "start": "parcel serve src/index.html", - "build": "BACKREST_BUILD_VERSION=$(git describe --tags --abbrev=0) UI_OS=unix parcel build src/index.html", - "build-windows": "BACKREST_BUILD_VERSION=$(git describe --tags --abbrev=0) UI_OS=windows parcel build src/index.html --dist-dir dist-windows", + "build": "cross-env BACKREST_BUILD_VERSION=$(git describe --tags --abbrev=0) UI_OS=unix parcel build src/index.html", + "build-windows": "cross-env BACKREST_BUILD_VERSION=$(git describe --tags --abbrev=0) UI_OS=windows parcel build src/index.html --dist-dir dist-windows", + "build-windows-devel": "cross-env BACKREST_BUILD_VERSION=dev UI_OS=windows parcel build src/index.html --dist-dir dist-windows", "test": "echo \"Error: no test specified\" && exit 1", "check": "tsc --noEmit" }, @@ -32,6 +33,7 @@ }, "devDependencies": { "@parcel/transformer-sass": "^2.10.3", + "cross-env": "^7.0.3", "events": "^3.3.0", "stream-browserify": "^3.0.0" } diff --git a/webui/webui.go b/webui/webui.go index e37638aa..bebf962c 100644 --- a/webui/webui.go +++ b/webui/webui.go @@ -2,7 +2,6 @@ package webui import ( "bytes" - "fmt" "io" "io/fs" "net/http" @@ -49,14 +48,3 @@ func serveFile(f fs.File, w http.ResponseWriter, r *http.Request, path string) { http.ServeContent(w, r, path, stat.ModTime(), bytes.NewReader(data)) } - -func init() { - files, err := fs.ReadDir(content, contentPrefix) - if err != nil { - panic("expected embedded files for WebUI") - } - - if len(files) == 0 { - panic(fmt.Sprintf("expected >0 embedded files for WebUI, got %d", len(files))) - } -} diff --git a/webui/webui_test.go b/webui/webui_test.go new file mode 100644 index 00000000..1626e91d --- /dev/null +++ b/webui/webui_test.go @@ -0,0 +1,40 @@ +package webui + +import ( + "net/http" + "net/http/httptest" + "testing" +) + +func TestEmbedNotEmpty(t *testing.T) { + files, err := content.ReadDir(contentPrefix) + if err != nil { + t.Fatalf("expected embedded files for WebUI, got error: %v", err) + } + + if len(files) == 0 { + t.Fatalf("expected >0 embedded files for WebUI, got %d", len(files)) + } +} + +func TestServeIndex(t *testing.T) { + handler := Handler() + + req, err := http.NewRequest("GET", "/", nil) + if err != nil { + t.Fatal(err) + } + + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + if status := rr.Code; status != http.StatusOK { + t.Errorf("handler returned wrong status code: got %v want %v", + status, http.StatusOK) + } + + if rr.Header().Get("Content-Encoding") != "gzip" { + t.Errorf("handler returned wrong content encoding: got %v want %v", + rr.Header().Get("Content-Encoding"), "gzip") + } +} diff --git a/webui/webuinix.go b/webui/webuinix.go index 5d2c4529..92061f6d 100644 --- a/webui/webuinix.go +++ b/webui/webuinix.go @@ -1,7 +1,9 @@ //go:build linux || darwin // +build linux darwin -//go:generate sh -c "rm -rf ./dist && UI_OS=unix npm run build && gzip ./dist/*" +//go:generate npm install +//go:generate npm run build +//go:generate gzip -r -k dist package webui diff --git a/webui/webuiwin.go b/webui/webuiwin.go index 0d4aac76..08589cef 100644 --- a/webui/webuiwin.go +++ b/webui/webuiwin.go @@ -1,7 +1,8 @@ //go:build windows // +build windows -//go:generate sh -c "rm -rf ./dist-windows && UI_OS=unix npm run build-windows && gzip ./dist-windows/*" +//go:generate npm install +//go:generate npm run build-windows package webui