Update release script to build/distribute backend

This commit is contained in:
wpetit 2020-05-03 19:19:28 +02:00
parent a9c24051b0
commit 957912c9fc
8 changed files with 179 additions and 24 deletions

3
.gitignore vendored
View File

@ -4,4 +4,5 @@
/.vscode /.vscode
/server/bin /server/bin
/server/data /server/data
/server/vendor /server/vendor
/release

View File

@ -1,24 +1,37 @@
FROM alpine:3.11 AS build FROM golang:1.13 AS build
RUN apk add --no-cache nodejs npm git make ARG HTTP_PROXY=
ARG HTTPS_PROXY=
ARG http_proxy=
ARG https_proxy=
RUN apt-get update && apt-get install -y build-essential git bash curl
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - \
&& apt-get install -y nodejs
COPY . /src COPY . /src
WORKDIR /src WORKDIR /src
RUN make install-deps \ RUN ( cd client && npm install ) \
&& make build && ( cd server && go mod vendor ) \
&& make ARCH_TARGETS=amd64 release
FROM alpine:3.11 FROM busybox
COPY --from=build /src/client/dist /client COPY --from=build /src/release/server-linux-amd64 /app
WORKDIR /client WORKDIR /app
RUN apk add --no-cache caddy
COPY misc/dokku/Caddyfile /client/Caddyfile
COPY misc/dokku/CHECKS /client/CHECKS COPY misc/dokku/CHECKS /client/CHECKS
EXPOSE 80 EXPOSE 80
CMD ["caddy"] VOLUME /data
ENV GUESSTIMATE_HTTP_ADDRESS=:80
ENV GUESSTIMATE_HTTP_PUBLIC_DIR=/app/public
ENV GUESSTIMATE_DATA_PATH=/data/guesstimate.db
CMD ["/app/bin/server", "-config", "config.yml"]

View File

@ -15,7 +15,7 @@ build-server:
cd server && CGO_ENABLED=0 go build -mod=vendor -v -o bin/server ./cmd/server cd server && CGO_ENABLED=0 go build -mod=vendor -v -o bin/server ./cmd/server
clean: clean:
rm -rf dist rm -rf client/dist server/bin release
dokku-build: dokku-build:
docker build \ docker build \
@ -27,4 +27,8 @@ dokku-run:
dokku-deploy: dokku-deploy:
$(if $(shell git config remote.dokku.url),, git remote add dokku $(DOKKU_URL)) $(if $(shell git config remote.dokku.url),, git remote add dokku $(DOKKU_URL))
git push -f dokku $(shell git rev-parse HEAD):refs/heads/master git push -f dokku $(shell git rev-parse HEAD):refs/heads/master
.PHONY: release
release: clean
@misc/script/release.sh

View File

@ -1,6 +0,0 @@
*:80
gzip
log stderr
rewrite {
to {path} {path}/ /index.html
}

126
misc/script/release.sh Executable file
View File

@ -0,0 +1,126 @@
#!/bin/bash
set -eo pipefail
OS_TARGETS=( linux )
ARCH_TARGETS=${ARCH_TARGETS:-amd64 arm 386}
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
PROJECT_DIR="$DIR/../.."
function build {
local name=$1
local srcdir=$2
local os=$3
local arch=$4
local dirname="$name-$os-$arch"
local destdir="$PROJECT_DIR/release/$dirname"
rm -rf "$destdir"
mkdir -p "$destdir"
echo "building $dirname..."
CGO_ENABLED=0 GOOS="$os" GOARCH="$arch" go build \
-mod=vendor \
-ldflags="-s -w -X 'main.GitRef=$(current_commit_ref)' -X 'main.ProjectVersion=$(current_version)' -X 'main.BuildDate=$(current_date)'" \
-gcflags=-trimpath="${PWD}" \
-asmflags=-trimpath="${PWD}" \
-o "$destdir/bin/$name" \
"$srcdir"
}
function current_date {
date '+%Y-%m-%d %H:%M'
}
function current_commit_ref {
git log -n 1 --pretty="format:%h"
}
function current_version {
local latest_tag=$(git describe --abbrev=0 2>/dev/null)
echo ${latest_tag:-0.0.0}
}
function copy {
local name=$1
local os=$2
local arch=$3
local src=$4
local dest=$5
local dirname="$name-$os-$arch"
local destdir="$PROJECT_DIR/release/$dirname"
echo "copying '$src' to '$destdir/$dest'..."
mkdir -p "$(dirname $destdir/$dest)"
cp -rfL $src "$destdir/$dest"
}
function dump_default_conf {
# Generate and copy configuration file
local command=$1
local os=$2
local arch=$3
local tmp_conf=$(mktemp)
go run "$PROJECT_DIR/server/cmd/$command" -dump-config > "$tmp_conf"
copy "$command" $os $arch "$tmp_conf" "config.yml"
rm -f "$tmp_conf" "$patched_conf"
}
function compress {
local name=$1
local os=$2
local arch=$3
local dirname="$name-$os-$arch"
local destdir="$PROJECT_DIR/release/$dirname"
echo "compressing $dirname..."
tar -czf "$destdir.tar.gz" -C "$destdir/../" "$dirname"
}
function build_guesstimate_client {
(
cd client
npm run build
)
}
function release_guesstimate {
local os=$1
local arch=$2
# Build and copy server files
(
cd server
build 'server' "$PROJECT_DIR/server/cmd/server" $os $arch
dump_default_conf 'server' $os $arch
)
copy 'server' $os $arch "$PROJECT_DIR/client/dist" "public"
copy 'server' $os $arch "$PROJECT_DIR/README.md" "README.md"
compress 'server' $os $arch
}
function main {
build_guesstimate_client
for os in ${OS_TARGETS[@]}; do
for arch in ${ARCH_TARGETS[@]}; do
release_guesstimate $os $arch
done
done
}
main

View File

@ -5,9 +5,9 @@ go 1.14
require ( require (
github.com/asdine/storm/v3 v3.1.1 github.com/asdine/storm/v3 v3.1.1
github.com/caarlos0/env/v6 v6.2.1 github.com/caarlos0/env/v6 v6.2.1
github.com/davecgh/go-spew v1.1.1 github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-chi/chi v4.1.1+incompatible github.com/go-chi/chi v4.1.1+incompatible
github.com/gorilla/websocket v1.4.2 github.com/gorilla/websocket v1.4.2 // indirect
github.com/pkg/errors v0.9.1 github.com/pkg/errors v0.9.1
gitlab.com/wpetit/goweb v0.0.0-20200418152305-76dea96a46ce gitlab.com/wpetit/goweb v0.0.0-20200418152305-76dea96a46ce
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect

View File

@ -16,7 +16,8 @@ type Config struct {
} }
type HTTPConfig struct { type HTTPConfig struct {
Address string `yaml:"address" env:"GUESSTIMATE_HTTP_ADDRESS"` Address string `yaml:"address" env:"GUESSTIMATE_HTTP_ADDRESS"`
PublicDir string `yaml:"publicDir" env:"GUESSTIMATE_PUBLIC_DIR"`
} }
type DataConfig struct { type DataConfig struct {
@ -55,7 +56,8 @@ func NewDumpDefault() *Config {
func NewDefault() *Config { func NewDefault() *Config {
return &Config{ return &Config{
HTTP: HTTPConfig{ HTTP: HTTPConfig{
Address: ":8081", Address: ":8081",
PublicDir: "public",
}, },
Data: DataConfig{ Data: DataConfig{
Path: "guesstimate.db", Path: "guesstimate.db",

View File

@ -1,8 +1,12 @@
package route package route
import ( import (
"net/http"
"path"
"forge.cadoles.com/wpetit/guesstimate/internal/config" "forge.cadoles.com/wpetit/guesstimate/internal/config"
"github.com/go-chi/chi" "github.com/go-chi/chi"
"gitlab.com/wpetit/goweb/static"
) )
func Mount(r *chi.Mux, config *config.Config) error { func Mount(r *chi.Mux, config *config.Config) error {
@ -13,5 +17,16 @@ func Mount(r *chi.Mux, config *config.Config) error {
r.Delete("/projects/{projectID}", handleDeleteProject) r.Delete("/projects/{projectID}", handleDeleteProject)
}) })
clientIndex := path.Join(config.HTTP.PublicDir, "index.html")
serveClientIndex := func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, clientIndex)
}
r.Get("/p/*", serveClientIndex)
notFoundHandler := r.NotFoundHandler()
r.Get("/*", static.Dir(config.HTTP.PublicDir, "", notFoundHandler))
return nil return nil
} }