diff --git a/.travis.yml b/.travis.yml index 922c9f50..66ae8ce5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,13 +7,8 @@ go: go_import_path: github.com/root-gg/plik -before_install: - # Update node_js version : https://github.com/travis-ci/travis-ci/issues/7108 - - rm -rf ~/.nvm && git clone https://github.com/creationix/nvm.git ~/.nvm && (cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`) && source ~/.nvm/nvm.sh && nvm install stable - - npm install -g bower - before_script: - - go get -u golang.org/x/lint/golint + - GO111MODULE=off go get -u golang.org/x/lint/golint script: - - make && make lint && make test && make test-backends && make docker \ No newline at end of file + - make lint && make test && make test-backends && make release \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 93a6e9df..28b1e262 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,5 @@ ################################################################################## -# Builder 1: make frontend -FROM node:12.15-alpine AS builder-frontend +FROM node:12.15-alpine AS plik-frontend-builder # Install needed binaries RUN apk add --no-cache git make bash @@ -9,14 +8,16 @@ RUN apk add --no-cache git make bash ADD Makefile . ADD webapp /webapp -RUN make frontend +################################################################################## +FROM plik-frontend-builder AS plik-frontend + +RUN make clean-frontend frontend ################################################################################## -# Builder 2: make server and clients -FROM golang:1.15.2-alpine AS builder-go +FROM golang:1.15.2-buster AS plik-builder # Install needed binaries -RUN apk add --no-cache git make bash gcc g++ +RUN apt-get update && apt-get install -y build-essential crossbuild-essential-armhf crossbuild-essential-armel crossbuild-essential-arm64 crossbuild-essential-i386 # Prepare the source location RUN mkdir -p /go/src/github.com/root-gg/plik @@ -25,23 +26,23 @@ WORKDIR /go/src/github.com/root-gg/plik # Add the source code ( see .dockerignore ) ADD . . -# Build clients ( all arch ) -RUN make clients +# Copy webapp build from previous stage +COPY --from=plik-frontend /webapp/dist webapp/dist + +################################################################################## +FROM plik-builder AS plik-releases + +ARG CLIENT_TARGETS="" +ENV CLIENT_TARGETS=$CLIENT_TARGETS -# Set server target arch -ARG GOOS="" -ARG GOARCH="" -ENV GOOS=${GOOS} -ENV GOARCH=${GOARCH} +ARG TARGETS="" +ENV TARGETS=$TARGETS -# Build server -RUN make server +RUN releaser/releaser.sh ################################################################################## -# Builder 3: we need ca-certificates in the final container -FROM alpine:3.11 AS builder-env +FROM alpine:3.12 AS plik-base -# Install needed binaries RUN apk add --no-cache ca-certificates # Create plik user @@ -57,14 +58,27 @@ RUN adduser \ --uid "${UID}" \ "${USER}" -COPY --from=builder-frontend --chown=1000:1000 /webapp/dist /home/plik/webapp/dist - -COPY --from=builder-go --chown=1000:1000 /go/src/github.com/root-gg/plik/server/plikd /home/plik/server/plikd -COPY --from=builder-go --chown=1000:1000 /go/src/github.com/root-gg/plik/server/plikd.cfg /home/plik/server/plikd.cfg -COPY --from=builder-go --chown=1000:1000 /go/src/github.com/root-gg/plik/clients /home/plik/clients -COPY --from=builder-go --chown=1000:1000 /go/src/github.com/root-gg/plik/changelog /home/plik/changelog - EXPOSE 8080 USER plik WORKDIR /home/plik/server -CMD ./plikd \ No newline at end of file +CMD ./plikd + +################################################################################## +FROM plik-base AS plik-amd64 + +COPY --from=plik-releases --chown=1000:1000 /go/src/github.com/root-gg/plik/releases/plik-*-linux-amd64 /home/plik/ + +################################################################################## +FROM plik-base AS plik-386 + +COPY --from=plik-releases --chown=1000:1000 /go/src/github.com/root-gg/plik/releases/plik-*-linux-386 /home/plik/ + +################################################################################## +FROM plik-base AS plik-arm + +COPY --from=plik-releases --chown=1000:1000 /go/src/github.com/root-gg/plik/releases/plik-*-linux-arm /home/plik/ + +################################################################################## +FROM plik-base AS plik-arm64 + +COPY --from=plik-releases --chown=1000:1000 /go/src/github.com/root-gg/plik/releases/plik-*-linux-arm64 /home/plik/ \ No newline at end of file diff --git a/Makefile b/Makefile index b252be5e..f692566f 100644 --- a/Makefile +++ b/Makefile @@ -1,22 +1,11 @@ SHELL = /bin/bash -RELEASE_VERSION = $(shell version/version.sh) -RELEASE_DIR = "release/plik-$(RELEASE_VERSION)" -RELEASE_TARGETS = darwin-amd64 freebsd-386 \ -freebsd-amd64 linux-386 linux-amd64 linux-arm openbsd-386 \ -openbsd-amd64 windows-amd64 windows-386 +BUILD_INFO = $(shell server/gen_build_info.sh base64) +BUILD_FLAG = -ldflags="-X github.com/root-gg/plik/server/common.buildInfoString=$(BUILD_INFO) -w -s -extldflags=-static" +BUILD_TAGS = -tags osusergo,netgo,sqlite_omit_load_extension -GOHOSTOS = $(if $(GOOS),$(GOOS),$(shell go env GOHOSTOS)) -GOHOSTARCH = $(if $(GOARCH),$(GOARCH),$(shell go env GOHOSTARCH)) - -DEBROOT_SERVER = debs/server -DEBROOT_CLIENT = debs/client - -BUILD_INFO = $(shell server/gen_build_info.sh $(RELEASE_VERSION) base64) -BUILD_FLAG = -ldflags="-X github.com/root-gg/plik/server/common.buildInfoString=$(BUILD_INFO)" - -GO_BUILD = go build $(BUILD_FLAG) -GO_TEST = GORACE="halt_on_error=1" go test $(BUILD_FLAG) -race -cover -p 1 +GO_BUILD = go build $(BUILD_FLAG) $(BUILD_TAGS) +GO_TEST = GORACE="halt_on_error=1" go test $(BUILD_FLAG) $(BUILD_TAGS) -race -cover -p 1 ifdef ENABLE_RACE_DETECTOR GO_BUILD := GORACE="halt_on_error=1" $(GO_BUILD) -race @@ -36,158 +25,36 @@ frontend: # Build plik server for the current architecture ### server: - @server/gen_build_info.sh $(RELEASE_VERSION) info + @server/gen_build_info.sh info @echo "Building Plik server" @cd server && $(GO_BUILD) -o plikd -### -# Build plik server for all architectures -### -servers: frontend - @server/gen_build_info.sh $(RELEASE_VERSION) info - @cd server && for target in $(RELEASE_TARGETS) ; do \ - SERVER_DIR=../servers/$$target; \ - SERVER_PATH=$$SERVER_DIR/plikd; \ - export GOOS=`echo $$target | cut -d "-" -f 1`; \ - export GOARCH=`echo $$target | cut -d "-" -f 2`; \ - mkdir -p ../servers/$$target; \ - if [ $$GOOS = "windows" ] ; then SERVER_PATH=$$SERVER_DIR/plikd.exe ; fi ; \ - if [ -e $$SERVER_PATH ] ; then continue ; fi ; \ - echo "Building Plik server for $$target to $$SERVER_PATH"; \ - $(GO_BUILD) -o $$SERVER_PATH ; \ - done - ### # Build plik client for the current architecture ### client: - @server/gen_build_info.sh $(RELEASE_VERSION) info + @server/gen_build_info.sh info @echo "Building Plik client" @cd client && $(GO_BUILD) -o plik ./ - ### -# Build plik client for all architectures +# Build clients for all architectures ### clients: - @server/gen_build_info.sh $(RELEASE_VERSION) info - @cd client && for target in $(RELEASE_TARGETS) ; do \ - CLIENT_DIR=../clients/$$target; \ - CLIENT_PATH=$$CLIENT_DIR/plik; \ - CLIENT_MD5=$$CLIENT_DIR/MD5SUM; \ - export GOOS=`echo $$target | cut -d "-" -f 1`; \ - export GOARCH=`echo $$target | cut -d "-" -f 2`; \ - mkdir -p $$CLIENT_DIR; \ - if [ $$GOOS = "windows" ] ; then CLIENT_PATH=$$CLIENT_DIR/plik.exe ; fi ; \ - if [ -e $$CLIENT_PATH ] ; then continue ; fi ; \ - echo "Building Plik client for $$target to $$CLIENT_PATH"; \ - $(GO_BUILD) -o $$CLIENT_PATH ; \ - md5sum $$CLIENT_PATH | awk '{print $$1}' > $$CLIENT_MD5; \ - done - @mkdir -p clients/bash && cp client/plik.sh clients/bash - -### -# Make server and clients Debian packages -### -debs: debs-client debs-server + # Only build clients + @TARGETS="skip" releaser/releaser.sh ### -# Make server Debian packages -### -debs-server: servers clients - @mkdir -p $(DEBROOT_SERVER)/usr/local/plikd/server - @mkdir -p $(DEBROOT_SERVER)/etc/init.d - @cp -R server/build/deb/DEBIAN $(DEBROOT_SERVER) - @cp -R clients/ $(DEBROOT_SERVER)/usr/local/plikd/clients - @cp -R server/public/ $(DEBROOT_SERVER)/usr/local/plikd/server/public - @cp -R server/plikd.cfg $(DEBROOT_SERVER)/etc/plikd.cfg - @cp -R server/plikd.init $(DEBROOT_SERVER)/etc/init.d/plikd && chmod +x $(DEBROOT_SERVER)/etc/init.d/plikd - @for arch in amd64 i386 armhf ; do \ - cp -R server/build/deb/DEBIAN/control $(DEBROOT_SERVER)/DEBIAN/control ; \ - sed -i -e "s/##ARCH##/$$arch/g" $(DEBROOT_SERVER)/DEBIAN/control ; \ - sed -i -e "s/##VERSION##/$(RELEASE_VERSION)/g" $(DEBROOT_SERVER)/DEBIAN/control ; \ - if [ $$arch = 'i386' ]; then \ - cp servers/linux-386/plikd $(DEBROOT_SERVER)/usr/local/plikd/server/ ; \ - elif [ $$arch = 'armhf' ]; then \ - cp servers/linux-arm/plikd $(DEBROOT_SERVER)/usr/local/plikd/server/ ; \ - else \ - cp servers/linux-$$arch/plikd $(DEBROOT_SERVER)/usr/local/plikd/server/ ; \ - fi ; \ - dpkg-deb --build $(DEBROOT_SERVER) debs/plikd-$(RELEASE_VERSION)-$$arch.deb ; \ - done - +# Display build info ### -# Make client Debian packages -### -debs-client: clients - @mkdir -p $(DEBROOT_CLIENT)/usr/local/bin - @cp -R client/build/deb/DEBIAN $(DEBROOT_CLIENT) - @for arch in amd64 i386 armhf ; do \ - cp -R client/build/deb/DEBIAN/control $(DEBROOT_CLIENT)/DEBIAN/control ; \ - sed -i -e "s/##ARCH##/$$arch/g" $(DEBROOT_CLIENT)/DEBIAN/control ; \ - sed -i -e "s/##VERSION##/$(RELEASE_VERSION)/g" $(DEBROOT_CLIENT)/DEBIAN/control ; \ - if [ $$arch = 'i386' ]; then \ - cp clients/linux-386/plik $(DEBROOT_CLIENT)/usr/local/bin ; \ - elif [ $$arch = 'armhf' ]; then \ - cp clients/linux-arm/plik $(DEBROOT_CLIENT)/usr/local/bin ; \ - else \ - cp clients/linux-$$arch/plik $(DEBROOT_CLIENT)/usr/local/bin ; \ - fi ; \ - dpkg-deb --build $(DEBROOT_CLIENT) debs/plik-$(RELEASE_VERSION)-$$arch.deb ; \ - done - -### -# Prepare the release base (css, js, ...) -### -release-template: clean frontend clients - @mkdir -p $(RELEASE_DIR)/webapp - @mkdir -p $(RELEASE_DIR)/server - @cp -r clients $(RELEASE_DIR) - @cp -r changelog $(RELEASE_DIR) - @cp -r webapp/dist $(RELEASE_DIR)/webapp/dist - @cp -r server/plikd.cfg $(RELEASE_DIR)/server - -### -# Build release archive -### -release: release-template server - @cp -R server/plikd $(RELEASE_DIR)/server/plikd - @cd release && tar czvf plik-$(RELEASE_VERSION)-$(GOHOSTOS)-$(GOHOSTARCH).tar.gz plik-$(RELEASE_VERSION) - -### -# Build release archives for all architectures -### -releases: release-template servers - - @mkdir -p releases - - @cd release && for target in $(RELEASE_TARGETS) ; do \ - SERVER_PATH=../servers/$$target/plikd; \ - OS=`echo $$target | cut -d "-" -f 1`; \ - ARCH=`echo $$target | cut -d "-" -f 2`; \ - if [ $$OS = "darwin" ] ; then OS="macos" ; fi ; \ - if [ $$OS = "windows" ] ; then SERVER_PATH=../servers/$$target/plikd.exe ; fi ; \ - if [ $$ARCH = "386" ] ; then ARCH="32bits" ; fi ; \ - if [ $$ARCH = "amd64" ] ; then ARCH="64bits" ; fi ; \ - cp -R $$SERVER_PATH plik-$(RELEASE_VERSION)/server; \ - if [ $$OS = "windows" ] ; then \ - TARBALL_NAME=plik-$(RELEASE_VERSION)-$$OS-$$ARCH.zip; \ - echo "Packaging plik release for $$target to $$TARBALL_NAME"; \ - zip -r ../releases/$$TARBALL_NAME plik-$(RELEASE_VERSION); \ - else \ - TARBALL_NAME=plik-$(RELEASE_VERSION)-$$OS-$$ARCH.tar.gz; \ - echo "Packaging plik release for $$target to $$TARBALL_NAME"; \ - tar czvf ../releases/$$TARBALL_NAME plik-$(RELEASE_VERSION); \ - fi \ - done - - @md5sum releases/* > releases/md5sum.txt +build-info: + @server/gen_build_info.sh info ### -# Generate build info +# Display version ### -build-info: - @server/gen_build_info.sh $(RELEASE_VERSION) info +version: + @server/gen_build_info.sh version ### # Run linters @@ -222,21 +89,16 @@ test-backends: @testing/test_backends.sh ### -# Build docker +# release ### -docker: - docker build --build-arg "GOOS=$$GOOS" --build-arg "GOARCH=$$GOARCH" -t rootgg/plik-$(GOHOSTOS)-$(GOHOSTARCH):$(RELEASE_VERSION) . +release: + @releaser/release.sh ### -# Build dockers +# docker ### -dockers: - @for target in $(RELEASE_TARGETS) ; do \ - GOOS=`echo $$target | cut -d "-" -f 1`; \ - GOARCH=`echo $$target | cut -d "-" -f 2`; \ - docker build --build-arg "GOOS=$$GOOS" --build-arg "GOARCH=$$GOARCH" -t rootgg/plik-$$target:$(RELEASE_VERSION) . ; \ - done - +docker: + @docker build -t rootgg/plik:dev --build-arg "TARGETS=amd64" --target="plik-amd64" . ### # Remove server build files @@ -246,7 +108,6 @@ clean: @rm -rf client/plik @rm -rf clients @rm -rf servers - @rm -rf debs @rm -rf release @rm -rf releases @@ -268,4 +129,4 @@ clean-all: clean clean-frontend # by make, we must declare these targets as phony to avoid : # "make: `client' is up to date" cases at compile time ### -.PHONY: client server \ No newline at end of file +.PHONY: client clients server release \ No newline at end of file diff --git a/README.md b/README.md index 7073c55f..41ee6dd9 100644 --- a/README.md +++ b/README.md @@ -354,14 +354,25 @@ Please be sure to also run/update the test suite : * Cross compilation -To target a specific architecture : +All binary are now statically linked +Clients can be safely cross-compiled for all os/architectures as they do not rely on GCO (sqlite) ``` - GOOS=linux GOARCH=arm make server - GOOS=linux GOARCH=arm make client - GOOS=linux GOARCH=arm make docker + GOOS=windows GOARCH=amd64 make client ``` -The `make releases` target build a release package for each architecture specified in Makefile -The `make dockers` target build a docker image for each architecture specified in Makefile -The `make clients` target build the plik clients for each architecture specified in Makefile -The `make servers` target build the plik servers for each architecture specified in Makefile +Servers rely on CGO/sqlite so we cross-compile it for Linux only using Docker. +The `make release` target will build a release package and Docker images for `amd64,i386,arm,arm64` + +If you want a more specific ARMv7 for hardware floating point build for example +See : https://github.com/golang/go/wiki/GoArm +``` + make release + docker run -it rootgg/plik-builder:latest /bin/bash + + GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=1 CC=arm-linux-gnueabihf-gcc make server + + file server/plikd + server/plikd: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, Go ... + + Then either copy the binary from the docker or play with releaser/releaser.sh to generate a release archive +``` \ No newline at end of file diff --git a/client/build/deb/DEBIAN/control b/client/build/deb/DEBIAN/control deleted file mode 100644 index 71dda136..00000000 --- a/client/build/deb/DEBIAN/control +++ /dev/null @@ -1,8 +0,0 @@ -Package: plik -Version: ##VERSION## -Section: base -Priority: optional -Architecture: ##ARCH## -Homepage: https://github.com/root-gg/plik -Maintainer: Mathieu Bodjikian , Charles-Antoine Mathieu -Description: Plik is the cli client for plik project (a multi-backend uploading file system) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..96bb5290 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,84 @@ +version: '3.4' + +x-plik-frontend-builder: + &build-plik-frontend-builder + build: + context: . + target: plik-frontend-builder + image: rootgg/plik-frontend-builder:latest + +x-plik-builder: + &build-plik-builder + build: + context: . + target: plik-builder + image: rootgg/plik-builder:latest + +x-plik-releases: + &build-plik-release + build: + context: . + target: plik-releases + image: rootgg/plik-release:latest + +x-plik-amd64: + &build-plik-amd64 + build: + context: . + target: plik-amd64 + image: rootgg/plik-linux-amd64:latest + +x-plik-386: + &build-plik-386 + build: + context: . + target: plik-386 + image: rootgg/plik-linux-386:latest + +x-plik-arm: + &build-plik-arm + build: + context: . + target: plik-arm + image: rootgg/plik-linux-arm:latest + +x-plik-arm64: + &build-plik-arm64 + build: + context: . + target: plik-arm64 + image: rootgg/plik-linux-arm64:latest + +services: + plik-frontend-builder: + *build-plik-frontend-builder + plik-builder: + *build-plik-builder + plik-releases: + *build-plik-release + plik-linux-amd64-latest: + *build-plik-amd64 + plik-linux-amd64-version: + <<: *build-plik-amd64 + image: rootgg/plik-linux-amd64:${plik_release_version} + plik-linux-amd64-latest-short: + <<: *build-plik-amd64 + image: rootgg/plik:latest + plik-linux-amd64-latest-short-version: + <<: *build-plik-amd64 + image: rootgg/plik:${plik_release_version} + plik-linux-386-latest: + *build-plik-386 + plik-linux-386-version: + <<: *build-plik-386 + image: rootgg/plik-linux-386:${plik_release_version} + plik-linux-arm-latest: + *build-plik-arm + plik-linux-arm-version: + <<: *build-plik-arm + image: rootgg/plik-linux-arm:${plik_release_version} + plik-linux-arm64-latest: + *build-plik-arm64 + plik-linux-arm64-version: + <<: *build-plik-arm64 + image: rootgg/plik-linux-arm64:${plik_release_version} \ No newline at end of file diff --git a/plik/client.go b/plik/client.go index 283207fc..67fabe08 100644 --- a/plik/client.go +++ b/plik/client.go @@ -9,7 +9,6 @@ import ( "runtime" "github.com/root-gg/plik/server/common" - "github.com/root-gg/plik/version" ) // Client manage the process of communicating with a Plik server via the HTTP API @@ -35,7 +34,7 @@ func NewClient(url string) (c *Client) { // Default values for X-ClientApp and X-ClientVersion HTTP Headers c.ClientName = "plik_client" - c.ClientVersion = runtime.GOOS + "-" + runtime.GOARCH + "-" + version.Get() + c.ClientVersion = runtime.GOOS + "-" + runtime.GOARCH + "-" + common.GetVersion() // Create a new default HTTP client. Override it if may you have more specific requirements transport := &http.Transport{ diff --git a/releaser/release.sh b/releaser/release.sh new file mode 100755 index 00000000..59cfd4a2 --- /dev/null +++ b/releaser/release.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +set -e + +plik_release_version=$(server/gen_build_info.sh version) +export plik_release_version + +echo "" +echo " Releasing Plik $plik_release_version" +echo "" + +if ! make build-info | grep "mint=true" >/dev/null ; then + echo "!!! Release is not mint !!!" + echo "Here is the local diff" + git status +fi + +if ! make build-info | grep "release=true" >/dev/null ; then + echo "!!! Release is not tagged !!!" +fi + +docker-compose build + +echo " Extracting release archives" + +rm -rf releases || true +dir="/go/src/github.com/root-gg/plik/releases/archives" +container_id=$(docker create rootgg/plik-release:latest) +docker cp "$container_id":$dir releases +docker rm -v "$container_id" +md5sum releases/* > releases/md5sum.txt + +echo "" +echo " Done. Release archives are available in the releases directory" +echo "" +ls -l releases + +echo "" +echo " Available Docker images" +echo "" +docker images | grep ^rootgg/plik \ No newline at end of file diff --git a/releaser/releaser.sh b/releaser/releaser.sh new file mode 100755 index 00000000..cb68feed --- /dev/null +++ b/releaser/releaser.sh @@ -0,0 +1,123 @@ +#!/bin/bash + +set -e + +### +# This needs to be called inside a cross-compillation capable environement ( see Dockerfile ) +### + +make clean + +# Default server/release targets +if [[ -z "$TARGETS" ]];then + TARGETS="amd64,386,arm,arm64" + #TARGETS="amd64" +fi + +# Default client targets +if [[ -z "$CLIENT_TARGETS" ]];then + CLIENT_TARGETS="darwin-amd64,freebsd-386,freebsd-amd64,linux-386,linux-amd64,linux-arm,openbsd-386,openbsd-amd64,windows-amd64,windows-386" + #CLIENT_TARGETS="linux-amd64" +fi + +RELEASE_VERSION=$(server/gen_build_info.sh version) + +echo "" +echo "Building clients" +echo "" + +rm -rf clients || true +mkdir -p clients/bash +cp client/plik.sh clients/bash + +for TARGET in $(echo "$CLIENT_TARGETS" | awk -F, '{for (i=1;i<=NF;i++)print $i}') +do + GOOS=$(echo "$TARGET" | cut -d "-" -f 1); + export GOOS + GOARCH=$(echo "$TARGET" | cut -d "-" -f 2); + export GOARCH + + CLIENT_DIR="clients/$TARGET" + CLIENT_MD5="$CLIENT_DIR/MD5SUM" + + if [[ "$GOOS" == "windows" ]] ; then + CLIENT_PATH="$CLIENT_DIR/plik.exe" + else + CLIENT_PATH="$CLIENT_DIR/plik" + fi + + echo "################################################" + echo "Building Plik client for $TARGET to $CLIENT_PATH" + make client + + mkdir -p "$CLIENT_DIR" + cp client/plik "$CLIENT_PATH" + md5sum "$CLIENT_PATH" | awk '{print $1}' > "$CLIENT_MD5" +done + +if [[ "$TARGETS" == "skip" ]]; then + exit 0 +fi + +# Assert frontend has been built already ( copied from previous docker stage ) +if [[ ! -d "webapp/dist" ]]; then + echo "Missing webapp distribution build" + exit 1 +fi + +echo "" +echo "Building servers and release archives" +echo "" + +rm -rf releases || true +mkdir -p releases/archives +function build_release { + echo "#################################" + echo "Building server for $GOOS $GOARCH" + make server + + RELEASE="plik-$RELEASE_VERSION-$GOOS-$GOARCH" + RELEASE_DIR="releases/$RELEASE" + RELEASE_ARCHIVE="archives/$RELEASE.tar.gz" + + mkdir $RELEASE_DIR + mkdir $RELEASE_DIR/webapp + mkdir $RELEASE_DIR/server + + # Copy release artifacts + cp -r clients $RELEASE_DIR + cp -r changelog $RELEASE_DIR + cp -r webapp/dist $RELEASE_DIR/webapp/dist + cp server/plikd.cfg $RELEASE_DIR/server + cp server/plikd $RELEASE_DIR/server/plikd + + echo "Building release archive for $GOOS $GOARCH to $RELEASE_ARCHIVE" + ( cd releases && tar czf $RELEASE_ARCHIVE $RELEASE ) +} + +# We build the server only for linux +export GOOS=linux +export CGO_ENABLED=1 + +for TARGET in $(echo "$TARGETS" | awk -F, '{for (i=1;i<=NF;i++)print $i}') +do + export GOARCH=$TARGET + + # set cross compiler + case "$TARGET" in + "amd64") + unset CC + ;; + "386") + export CC=i686-linux-gnu-gcc + ;; + "arm") + export CC=arm-linux-gnueabi-gcc + ;; + "arm64") + export CC=aarch64-linux-gnu-gcc + ;; + esac + + build_release +done \ No newline at end of file diff --git a/server/common/version.go b/server/common/version.go index e8107316..155bc3d7 100644 --- a/server/common/version.go +++ b/server/common/version.go @@ -8,13 +8,16 @@ import ( "time" "github.com/jinzhu/copier" - - "github.com/root-gg/plik/version" ) +const version = "1.3" + +// GetVersion return the current package version +func GetVersion() string { + return version +} + // This variable content is meant to be passed the output of the gen_build_info.sh script at compile time using -ldflags -// BUILD_INFO=$(shell server/gen_build_info.sh $(RELEASE_VERSION) base64) -// BUILD_FLAG=-ldflags="-X github.com/root-gg/plik/server/common.buildInfoString=$(BUILD_INFO)" var buildInfoString string var buildInfo *BuildInfo @@ -34,7 +37,7 @@ func init() { } } - buildInfo.Version = version.Get() + buildInfo.Version = GetVersion() } // BuildInfo export build related variables diff --git a/server/common/version_test.go b/server/common/version_test.go index 0e79f972..f20f827c 100644 --- a/server/common/version_test.go +++ b/server/common/version_test.go @@ -2,14 +2,42 @@ package common import ( "fmt" + "regexp" "strings" "testing" - "github.com/root-gg/plik/version" - "github.com/stretchr/testify/require" ) +func getVersionRegex() string { + return `^\d+\.\d+((\.\d+)?|(\-RC\d+))$` +} + +func validateVersion(t *testing.T, version string, ok bool) { + matched, err := regexp.Match(getVersionRegex(), []byte(version)) + require.NoError(t, err, "invalid version regex") + + if ok { + require.True(t, matched, "invalid version regex match") + } else { + require.False(t, matched, "invalid version regex match") + } +} + +func TestValidateVersionRegex(t *testing.T) { + validateVersion(t, "1.1", true) + validateVersion(t, "1.1.1", true) + validateVersion(t, "1.1-RC1", true) + validateVersion(t, "1.1.1-RC1", false) + validateVersion(t, "1.1-rc1", false) +} + +func TestGetVersion(t *testing.T) { + version := GetVersion() + require.NotZero(t, version, "missing version") + validateVersion(t, version, true) +} + func TestGetBuildInfo(t *testing.T) { buildInfo := GetBuildInfo() require.NotNil(t, buildInfo, "missing build info") @@ -28,5 +56,5 @@ func TestGetBuildInfoStringSanitize(t *testing.T) { buildInfo := GetBuildInfo() buildInfo.Sanitize() v := buildInfo.String() - require.Equal(t, fmt.Sprintf("v%s", version.Get()), v, "invalid build string") + require.Equal(t, fmt.Sprintf("v%s", GetVersion()), v, "invalid build string") } diff --git a/server/gen_build_info.sh b/server/gen_build_info.sh index c2ab65d1..583c9498 100755 --- a/server/gen_build_info.sh +++ b/server/gen_build_info.sh @@ -3,8 +3,24 @@ set -e # arguments -version=$1 -output=$2 +output=$1 + +FILE="$(dirname "$0")/common/version.go" +if [[ ! -f "$FILE" ]]; then + echo "$FILE not found" + exit 1 +fi + +version=$(cat "$FILE" | sed -n 's/^const version = "\(.*\)"/\1/p') +if [[ -z "$version" ]]; then + echo "version not found" + exit 1 +fi + +if [[ "$output" == "version" ]]; then + echo "$version" + exit 0 +fi # some variables user=$(whoami) diff --git a/version/version.go b/version/version.go deleted file mode 100644 index df12a849..00000000 --- a/version/version.go +++ /dev/null @@ -1,8 +0,0 @@ -package version - -const version = "1.3" - -// Get return the current package version -func Get() string { - return version -} diff --git a/version/version.sh b/version/version.sh deleted file mode 100755 index 9e46ec4b..00000000 --- a/version/version.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -e - -FILE=$(dirname $0)/version.go -if [[ ! -f "$FILE" ]]; then - echo "$FILE not found" - exit 1 -fi - -cat $FILE | sed -n 's/.*version = "\(.*\)"/\1/p' \ No newline at end of file diff --git a/version/version_test.go b/version/version_test.go deleted file mode 100644 index bdb683c1..00000000 --- a/version/version_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package version - -import ( - "regexp" - "testing" - - "github.com/stretchr/testify/require" -) - -func getVersionRegex() string { - return `^\d+\.\d+((\.\d+)?|(\-RC\d+))$` -} - -func validateVersion(t *testing.T, version string, ok bool) { - matched, err := regexp.Match(getVersionRegex(), []byte(version)) - require.NoError(t, err, "invalid version regex") - - if ok { - require.True(t, matched, "invalid version regex match") - } else { - require.False(t, matched, "invalid version regex match") - } -} - -func TestValidateVersionRegex(t *testing.T) { - validateVersion(t, "1.1", true) - validateVersion(t, "1.1.1", true) - validateVersion(t, "1.1-RC1", true) - validateVersion(t, "1.1.1-RC1", false) - validateVersion(t, "1.1-rc1", false) -} - -func TestGet(t *testing.T) { - version := Get() - require.NotZero(t, version, "missing version") - validateVersion(t, version, true) -}