aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Dockerfile27
-rw-r--r--_config.yml1
-rwxr-xr-xscript/build.sh33
-rwxr-xr-xscript/docker-build.sh40
-rw-r--r--script/post-receive12
5 files changed, 103 insertions, 10 deletions
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..9acbaaa
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,27 @@
+# Copyright (C) 2019 Miquel Sabaté Solà <mikisabate@gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+FROM opensuse/leap:15.0
+MAINTAINER Miquel Sabaté Solà <mikisabate@gmail.com>
+
+RUN useradd --no-create-home --shell /dev/null --system nobody && \
+ zypper ar -f -G obs://home:/mssola/openSUSE_Leap_42.3/ home:mssola && \
+ zypper ar -f -G obs://devel:/languages:/nodejs/openSUSE_Leap_15.0/ devel:languages:nodejs && \
+ zypper ref && \
+ zypper -n in -t pattern devel_basis && \
+ zypper -n in nodejs10 npm10 ruby2.5-devel ruby2.5-rubygem-bundler libxslt-devel gcc-c++ glibc-locale && \
+ zypper -n in --from home:mssola yarn && \
+ npm install -g webpack webpack-cli && \
+ zypper clean -a
diff --git a/_config.yml b/_config.yml
index 133ef42..e887feb 100644
--- a/_config.yml
+++ b/_config.yml
@@ -11,6 +11,7 @@ node_modules, vendor, templates, yarn-error.log, package.json, javascripts/main.
timezone: "Europe/Berlin"
markdown: kramdown
highlighter: rouge
+encoding: UTF-8
baseurl: "" # the subpath of your site, e.g. /blog
diff --git a/script/build.sh b/script/build.sh
index 006a4b4..f4d190e 100755
--- a/script/build.sh
+++ b/script/build.sh
@@ -14,25 +14,35 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
+# You may want to set the following environment variables for this script:
+#
+# - BUILD_SOURCE: the directory where the source code is located.
+# - BUILD_DEST: the directory where the built files should go.
+# - USER: the user who should own the files.
+# - GROUP: the group who should own the files.
+
set -ex
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )"
pushd $DIR
+# Set UTF-8 for the build (Jekyll needs this).
+export LANG=en_US.UTF-8
+export LANGUAGE=en_US:en
+export LC_ALL=en_US.UTF-8
+
# The build source and destination directories. This is done this way so we
# can re-use this script when deploying.
: ${BUILD_SOURCE:=.}
: ${BUILD_DEST:=./_site}
-# Clean up previous build.
-rm -rf $BUILD_DEST
-
# JS dependencies.
-yarn
+yarn --force
yarn run webpack-single-shot
# Build && test.
bundle
+rm -rf $BUILD_DEST/*
bundle exec jekyll build -s $BUILD_SOURCE -d $BUILD_DEST
mkdir $BUILD_DEST/about $BUILD_DEST/en/about
@@ -43,5 +53,20 @@ cp $BUILD_DEST/en/about.html $BUILD_DEST/en/about/index.html
bundle exec rubocop
bundle exec rake
+# Fix ownership of files if a given user was provided.
+if [ ! -z "$USER" ]; then
+ chown -R $USER:$GROUP $BUILD_DEST
+fi
+
+# Nuke the source if specified (useful when the source was a temporary one).
+if [ "$NUKE" = "true" ]; then
+ pushd $BUILD_SOURCE
+ # See: https://unix.stackexchange.com/a/77313. We cannot remove the
+ # directory directly, because then Docker might scream "Device busy", since
+ # it's a shared volume.
+ rm -Rf ..?* .[!.]* *
+ popd
+fi
+
set +x
echo "Jekyll has built your application in '$BUILD_DEST'"
diff --git a/script/docker-build.sh b/script/docker-build.sh
new file mode 100755
index 0000000..8aa1590
--- /dev/null
+++ b/script/docker-build.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env bash
+# Copyright (C) 2019 Miquel Sabaté Solà <mikisabate@gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+set -ex
+
+# If the image does not exist, build it.
+IMGTAG=mssola/jo:latest
+[ ! -z $(docker images -q $IMGTAG) ] || docker build -t $IMGTAG .
+
+# The user which should own the produced files.
+user=$(id -u `whoami`)
+group=$(id -g `whoami`)
+
+# The -it flag should not be set on the post-receive hook because there's no TTY
+# there.
+IT="-it"
+if [ "$POST_RECEIVE" = "true" ]; then
+ IT=
+fi
+
+# And now the call...
+docker run --rm $IT \
+ -e BUILD_SOURCE=/src -e BUILD_DEST=/dest \
+ -e BUNDLE_GEMFILE=/src/Gemfile -e USER=$user -e GROUP=$group \
+ -e NODE_ENV=development -e NUKE=$NUKE \
+ -v $BUILD_SOURCE:/src -v $BUILD_DEST:/dest \
+ $IMGTAG /src/script/build.sh
diff --git a/script/post-receive b/script/post-receive
index 3f4f8ee..debe3dd 100644
--- a/script/post-receive
+++ b/script/post-receive
@@ -22,7 +22,7 @@ NAME=jo
GIT_REPO=$HOME/$NAME.git
TARGET_BRANCH=master
-# Exported so it's picked by the `script/build.sh` script.
+# Exported so it's picked by the `script/docker-build.sh` script.
export BUILD_SOURCE=$HOME/tmp/$NAME
export BUILD_DEST=/srv/$NAME/www
@@ -30,14 +30,14 @@ while read oldrev newrev refname
do
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
if [ -n "$branch" ] && [ "$TARGET_BRANCH" == "$branch" ]; then
+ set -x
+
# Re-generate git repository in a temporary directory.
- rm -Rf $TMP_GIT_CLONE
+ rm -Rf $BUILD_SOURCE
git clone $GIT_REPO $BUILD_SOURCE
# Build site
- chmod +x $BUILD_SOURCE/script/build.sh
- BUNDLE_GEMFILE=$BUILD_SOURCE/Gemfile bundle install
- BUNDLE_GEMFILE=$BUILD_SOURCE/Gemfile $BUILD_SOURCE/script/build.sh
- rm -Rf $BUILD_SOURCE
+ chmod +x $BUILD_SOURCE/script/docker-build.sh
+ POST_RECEIVE=true NUKE=true $BUILD_SOURCE/script/docker-build.sh
fi
done