From ff42ee38906a46a45dc6347180c1570d21037b2d Mon Sep 17 00:00:00 2001 From: Shahidh K Muhammed Date: Thu, 28 Mar 2019 17:12:33 +0530 Subject: [PATCH 1/5] read version from env var at build time (close #1398) --- server/Makefile | 27 ++++++++++++++----------- server/src-lib/Hasura/Server/Utils.hs | 19 ++++++++--------- server/src-lib/Hasura/Server/Version.hs | 6 ++++-- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/server/Makefile b/server/Makefile index ebaeb44a982a0..eb32f30961119 100644 --- a/server/Makefile +++ b/server/Makefile @@ -1,6 +1,7 @@ project := graphql-engine registry := hasura -version := $(shell ../scripts/get-version.sh) +VERSION ?= $(shell ../scripts/get-version.sh) +nproc := $(shell nproc) # TODO: needs to be replaced with something like yq stack_resolver := $(shell awk '/^resolver:/ {print $$2;}' stack.yaml) @@ -10,12 +11,14 @@ build_dir := $(project_dir)/$(shell stack path --dist-dir)/build build_output := /build/_server_output -dev: src-lib src-exec src-rsr - stack build --fast - stack exec graphql-engine -- --database-url postgres://postgres:@localhost:5432/hge serve --enable-console +build: + stack build --fast --flag graphql-engine:local-console --ghc-options '-j$(nproc)' + +exec: + stack exec graphql-engine -- serve image: $(project).cabal - docker build -t "$(registry)/$(project):$(version)" \ + docker build -t "$(registry)/$(project):$(VERSION)" \ -f packaging/Dockerfile \ --build-arg build_flags=--fast \ --build-arg project=$(project) \ @@ -24,7 +27,7 @@ image: $(project).cabal . release-image: $(project).cabal - docker build -t "$(registry)/$(project):$(version)" \ + docker build -t "$(registry)/$(project):$(VERSION)" \ -f packaging/Dockerfile \ --build-arg project=$(project) \ --build-arg stack_resolver=$(stack_resolver) \ @@ -38,7 +41,7 @@ ci-binary: mkdir -p $(build_output) cp $(build_dir)/$(project)/$(project) $(build_output) # cp "$(build_dir)/$(project)-test/$(project)-test" $(build_output) - echo "$(version)" > $(build_output)/version.txt + echo "$(VERSION)" > $(build_output)/version.txt ci-test: $(build_output)/graphql-engine-test --database-url=$(DATABASE_URL) @@ -50,22 +53,22 @@ ci-image: docker run --rm --volumes-from dummy $(registry)/graphql-engine-packager:$(packager_ver) /build.sh $(project) | tar -x -C packaging/build/rootfs strip --strip-unneeded packaging/build/rootfs/bin/$(project) upx packaging/build/rootfs/bin/$(project) - docker build -t $(registry)/$(project):$(version) packaging/build/ + docker build -t $(registry)/$(project):$(VERSION) packaging/build/ ci-save-image: - docker save -o $(build_output)/image.tar $(registry)/$(project):$(version) + docker save -o $(build_output)/image.tar $(registry)/$(project):$(VERSION) ci-load-image: docker load -i $(build_output)/image.tar push: - docker push $(registry)/$(project):$(version) + docker push $(registry)/$(project):$(VERSION) push-latest: - docker tag $(registry)/$(project):$(version) $(registry)/$(project):latest + docker tag $(registry)/$(project):$(VERSION) $(registry)/$(project):latest docker push $(registry)/$(project):latest packager: packaging/packager.df docker build -t "$(registry)/graphql-engine-packager:$(packager_ver)" -f packaging/packager.df ./packaging/ -.PHONY: image release-image push packager ci-binary-and-test ci-image ci-save-image ci-load-image +.PHONY: image release-image push packager ci-binary-and-test ci-image ci-save-image ci-load-image build exec diff --git a/server/src-lib/Hasura/Server/Utils.hs b/server/src-lib/Hasura/Server/Utils.hs index 3030dd3f89347..b279b7db3a8ef 100644 --- a/server/src-lib/Hasura/Server/Utils.hs +++ b/server/src-lib/Hasura/Server/Utils.hs @@ -7,6 +7,7 @@ import Data.List.Split import Network.URI import System.Exit import System.Process +import System.Environment import qualified Data.ByteString as B import qualified Data.Text as T @@ -76,17 +77,13 @@ uriAuthParameters uriAuth = port . host . auth [u, p] -> \info -> info { Q.connUser = unEscapeString u, Q.connPassword = unEscapeString $ dropLast p } _ -> id --- Running shell script during compile time -runScript :: FilePath -> TH.Q TH.Exp -runScript fp = do - TH.addDependentFile fp - fileContent <- TH.runIO $ TI.readFile fp - (exitCode, stdOut, stdErr) <- TH.runIO $ - readProcessWithExitCode "/bin/sh" [] $ T.unpack fileContent - when (exitCode /= ExitSuccess) $ fail $ - "Running shell script " ++ fp ++ " failed with exit code : " - ++ show exitCode ++ " and with error : " ++ stdErr - TH.lift stdOut +-- Get an env var during compile time +getValFromEnv :: String -> TH.Q TH.Exp +getValFromEnv n = do + maybeVal <- TH.runIO $ lookupEnv n + case maybeVal of + Just val -> TH.lift val + Nothing -> fail $ "env var " ++ n ++ " is not set" -- Ginger Templating type GingerTmplt = TG.Template TG.SourcePos diff --git a/server/src-lib/Hasura/Server/Version.hs b/server/src-lib/Hasura/Server/Version.hs index f6c791d008a02..b85cf1acb897b 100644 --- a/server/src-lib/Hasura/Server/Version.hs +++ b/server/src-lib/Hasura/Server/Version.hs @@ -11,10 +11,12 @@ import qualified Data.SemVer as V import qualified Data.Text as T import Hasura.Prelude -import Hasura.Server.Utils (runScript) +import Hasura.Server.Utils (getValFromEnv) version :: T.Text -version = T.dropWhileEnd (== '\n') $(runScript "../scripts/get-version.sh") +version = $(getValFromEnv "VERSION") + + consoleVersion :: T.Text consoleVersion = case V.fromText $ T.dropWhile (== 'v') version of From 6f08de219ab1acdc999de8173c1a96edf9290416 Mon Sep 17 00:00:00 2001 From: Shahidh K Muhammed Date: Thu, 28 Mar 2019 17:31:04 +0530 Subject: [PATCH 2/5] remove un-used imports, edit makefile --- server/Makefile | 2 +- server/src-lib/Hasura/Server/Utils.hs | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/server/Makefile b/server/Makefile index eb32f30961119..1ea1890fd0fed 100644 --- a/server/Makefile +++ b/server/Makefile @@ -12,7 +12,7 @@ build_dir := $(project_dir)/$(shell stack path --dist-dir)/build build_output := /build/_server_output build: - stack build --fast --flag graphql-engine:local-console --ghc-options '-j$(nproc)' + VERSION=$(VERSION) stack build --fast --flag graphql-engine:local-console --ghc-options '-j$(nproc)' exec: stack exec graphql-engine -- serve diff --git a/server/src-lib/Hasura/Server/Utils.hs b/server/src-lib/Hasura/Server/Utils.hs index b279b7db3a8ef..ad19310d9c463 100644 --- a/server/src-lib/Hasura/Server/Utils.hs +++ b/server/src-lib/Hasura/Server/Utils.hs @@ -5,15 +5,12 @@ import qualified Database.PG.Query.Connection as Q import Data.Aeson import Data.List.Split import Network.URI -import System.Exit -import System.Process import System.Environment import qualified Data.ByteString as B import qualified Data.Text as T import qualified Data.Text.Encoding as TE import qualified Data.Text.Encoding.Error as TE -import qualified Data.Text.IO as TI import qualified Language.Haskell.TH.Syntax as TH import qualified Text.Ginger as TG import qualified Text.Regex.TDFA as TDFA From 407cdbc102b030456cd10393e267836698ef43fc Mon Sep 17 00:00:00 2001 From: Shahidh K Muhammed Date: Thu, 28 Mar 2019 17:50:45 +0530 Subject: [PATCH 3/5] edit makefile to add new targets and export variables --- server/Makefile | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/server/Makefile b/server/Makefile index 1ea1890fd0fed..9cbefb30ad718 100644 --- a/server/Makefile +++ b/server/Makefile @@ -1,3 +1,4 @@ +.EXPORT_ALL_VARIABLES: project := graphql-engine registry := hasura VERSION ?= $(shell ../scripts/get-version.sh) @@ -12,11 +13,17 @@ build_dir := $(project_dir)/$(shell stack path --dist-dir)/build build_output := /build/_server_output build: - VERSION=$(VERSION) stack build --fast --flag graphql-engine:local-console --ghc-options '-j$(nproc)' + stack build --fast --ghc-options '-j$(nproc)' -exec: +build-local-console: + stack build --fast --flag graphql-engine:local-console --ghc-options '-j$(nproc)' + +exec: build stack exec graphql-engine -- serve +exec-local-console: build-local-console + stack exec graphql-engine -- serve --enable-console + image: $(project).cabal docker build -t "$(registry)/$(project):$(VERSION)" \ -f packaging/Dockerfile \ @@ -71,4 +78,4 @@ push-latest: packager: packaging/packager.df docker build -t "$(registry)/graphql-engine-packager:$(packager_ver)" -f packaging/packager.df ./packaging/ -.PHONY: image release-image push packager ci-binary-and-test ci-image ci-save-image ci-load-image build exec +.PHONY: image release-image push packager ci-binary-and-test ci-image ci-save-image ci-load-image build exec build-local-console exec-local-console From 4eb05437835bdd27858ddc8503f62c3830748230 Mon Sep 17 00:00:00 2001 From: Shahidh K Muhammed Date: Thu, 28 Mar 2019 17:58:08 +0530 Subject: [PATCH 4/5] only export VERSION in makefile --- server/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/Makefile b/server/Makefile index 9cbefb30ad718..b1e3683ef4bfe 100644 --- a/server/Makefile +++ b/server/Makefile @@ -1,7 +1,7 @@ -.EXPORT_ALL_VARIABLES: project := graphql-engine registry := hasura VERSION ?= $(shell ../scripts/get-version.sh) +export VERSION nproc := $(shell nproc) # TODO: needs to be replaced with something like yq From 351427af3c4ba2dbd3f633602a636048bbd4baeb Mon Sep 17 00:00:00 2001 From: Shahidh K Muhammed Date: Mon, 8 Apr 2019 12:11:25 +0530 Subject: [PATCH 5/5] read version by executing the script if env var is absent --- server/src-lib/Hasura/Server/Utils.hs | 21 ++++++++++++++++++--- server/src-lib/Hasura/Server/Version.hs | 6 ++---- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/server/src-lib/Hasura/Server/Utils.hs b/server/src-lib/Hasura/Server/Utils.hs index ad19310d9c463..e3e642c0704eb 100644 --- a/server/src-lib/Hasura/Server/Utils.hs +++ b/server/src-lib/Hasura/Server/Utils.hs @@ -6,11 +6,14 @@ import Data.Aeson import Data.List.Split import Network.URI import System.Environment +import System.Exit +import System.Process import qualified Data.ByteString as B import qualified Data.Text as T import qualified Data.Text.Encoding as TE import qualified Data.Text.Encoding.Error as TE +import qualified Data.Text.IO as TI import qualified Language.Haskell.TH.Syntax as TH import qualified Text.Ginger as TG import qualified Text.Regex.TDFA as TDFA @@ -75,12 +78,24 @@ uriAuthParameters uriAuth = port . host . auth _ -> id -- Get an env var during compile time -getValFromEnv :: String -> TH.Q TH.Exp -getValFromEnv n = do +getValFromEnvOrScript :: String -> String -> TH.Q TH.Exp +getValFromEnvOrScript n s = do maybeVal <- TH.runIO $ lookupEnv n case maybeVal of Just val -> TH.lift val - Nothing -> fail $ "env var " ++ n ++ " is not set" + Nothing -> runScript s + +-- Run a shell script during compile time +runScript :: FilePath -> TH.Q TH.Exp +runScript fp = do + TH.addDependentFile fp + fileContent <- TH.runIO $ TI.readFile fp + (exitCode, stdOut, stdErr) <- TH.runIO $ + readProcessWithExitCode "/bin/sh" [] $ T.unpack fileContent + when (exitCode /= ExitSuccess) $ fail $ + "Running shell script " ++ fp ++ " failed with exit code : " + ++ show exitCode ++ " and with error : " ++ stdErr + TH.lift stdOut -- Ginger Templating type GingerTmplt = TG.Template TG.SourcePos diff --git a/server/src-lib/Hasura/Server/Version.hs b/server/src-lib/Hasura/Server/Version.hs index b85cf1acb897b..841b8dbba7dd4 100644 --- a/server/src-lib/Hasura/Server/Version.hs +++ b/server/src-lib/Hasura/Server/Version.hs @@ -11,12 +11,10 @@ import qualified Data.SemVer as V import qualified Data.Text as T import Hasura.Prelude -import Hasura.Server.Utils (getValFromEnv) +import Hasura.Server.Utils (getValFromEnvOrScript) version :: T.Text -version = $(getValFromEnv "VERSION") - - +version = T.dropWhileEnd (== '\n') $(getValFromEnvOrScript "VERSION" "../scripts/get-version.sh") consoleVersion :: T.Text consoleVersion = case V.fromText $ T.dropWhile (== 'v') version of