From 96ce7d938bb7ab2fc1520f703ceddc8e3355ce3f Mon Sep 17 00:00:00 2001 From: Miquel Sabaté Solà Date: Thu, 17 Jan 2019 08:56:48 +0100 Subject: Dockerized deployment method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Miquel Sabaté Solà --- Dockerfile | 27 +++++++++++++++++++++++++++ _config.yml | 1 + script/build.sh | 33 +++++++++++++++++++++++++++++---- script/docker-build.sh | 40 ++++++++++++++++++++++++++++++++++++++++ script/post-receive | 12 ++++++------ 5 files changed, 103 insertions(+), 10 deletions(-) create mode 100644 Dockerfile create mode 100755 script/docker-build.sh 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à +# +# 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 . + +FROM opensuse/leap:15.0 +MAINTAINER Miquel Sabaté Solà + +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 . +# 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à +# +# 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 . + +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 -- cgit v1.2.3