Update release script to build/distribute backend
This commit is contained in:
parent
a9c24051b0
commit
957912c9fc
|
@ -5,3 +5,4 @@
|
||||||
/server/bin
|
/server/bin
|
||||||
/server/data
|
/server/data
|
||||||
/server/vendor
|
/server/vendor
|
||||||
|
/release
|
35
Dockerfile
35
Dockerfile
|
@ -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"]
|
6
Makefile
6
Makefile
|
@ -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 \
|
||||||
|
@ -28,3 +28,7 @@ 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
|
|
@ -1,6 +0,0 @@
|
||||||
*:80
|
|
||||||
gzip
|
|
||||||
log stderr
|
|
||||||
rewrite {
|
|
||||||
to {path} {path}/ /index.html
|
|
||||||
}
|
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -17,6 +17,7 @@ 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 {
|
||||||
|
@ -56,6 +57,7 @@ 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",
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue