Update release script to build/distribute backend
This commit is contained in:
parent
a9c24051b0
commit
957912c9fc
|
@ -4,4 +4,5 @@
|
|||
/.vscode
|
||||
/server/bin
|
||||
/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
|
||||
|
||||
WORKDIR /src
|
||||
|
||||
RUN make install-deps \
|
||||
&& make build
|
||||
RUN ( cd client && npm install ) \
|
||||
&& ( 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
|
||||
|
||||
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"]
|
8
Makefile
8
Makefile
|
@ -15,7 +15,7 @@ build-server:
|
|||
cd server && CGO_ENABLED=0 go build -mod=vendor -v -o bin/server ./cmd/server
|
||||
|
||||
clean:
|
||||
rm -rf dist
|
||||
rm -rf client/dist server/bin release
|
||||
|
||||
dokku-build:
|
||||
docker build \
|
||||
|
@ -27,4 +27,8 @@ dokku-run:
|
|||
|
||||
dokku-deploy:
|
||||
$(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 (
|
||||
github.com/asdine/storm/v3 v3.1.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/gorilla/websocket v1.4.2
|
||||
github.com/gorilla/websocket v1.4.2 // indirect
|
||||
github.com/pkg/errors v0.9.1
|
||||
gitlab.com/wpetit/goweb v0.0.0-20200418152305-76dea96a46ce
|
||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect
|
||||
|
|
|
@ -16,7 +16,8 @@ type Config 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 {
|
||||
|
@ -55,7 +56,8 @@ func NewDumpDefault() *Config {
|
|||
func NewDefault() *Config {
|
||||
return &Config{
|
||||
HTTP: HTTPConfig{
|
||||
Address: ":8081",
|
||||
Address: ":8081",
|
||||
PublicDir: "public",
|
||||
},
|
||||
Data: DataConfig{
|
||||
Path: "guesstimate.db",
|
||||
|
|
|
@ -1,8 +1,12 @@
|
|||
package route
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"path"
|
||||
|
||||
"forge.cadoles.com/wpetit/guesstimate/internal/config"
|
||||
"github.com/go-chi/chi"
|
||||
"gitlab.com/wpetit/goweb/static"
|
||||
)
|
||||
|
||||
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)
|
||||
})
|
||||
|
||||
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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue