1
0
mirror of https://git.fsfe.org/FSFE/fsfe-local-build.git synced 2026-04-20 19:33:05 +02:00

12 Commits

14 changed files with 400 additions and 90 deletions

10
.gitignore vendored
View File

@@ -1,3 +1,13 @@
config.cfg config.cfg
lighttpd-fsfe.conf lighttpd-fsfe.conf
pywebserver-fsfe.log pywebserver-fsfe.log
fsfe.org
fsfe-website
lighttpd-fsfe*.log
# ignore everything in fsfe.org/ and status/ but keep the folders
fsfe.org/*
!fsfe.org/.gitkeep
status/*
!status/.gitkeep

26
Dockerfile Normal file
View File

@@ -0,0 +1,26 @@
FROM alpine:3.9
RUN apk add --no-cache \
bash \
bash-completion \
coreutils \
diffutils \
findutils \
inotify-tools \
libxml2-utils \
libxslt \
make \
nodejs \
nodejs-npm \
procps \
python3 \
rsync
RUN npm install -g less
RUN mkdir -p /fsfe-local-build/fsfe.org
EXPOSE 8000
CMD sh /fsfe-local-build/docker-cmd.sh

View File

@@ -1,5 +1,49 @@
# FSFE Local Build # FSFE Website Local Build
This is a collection of scripts and configuration files necessary to build fsfe.org websites locally. This is a collection of scripts, tools and configuration files necessary to build fsfe.org websites locally.
Full instructions can be found in FSFE's wiki: https://wiki.fsfe.org/TechDocs/Mainpage/BuildLocally Full instructions can be found in FSFE's wiki: https://wiki.fsfe.org/TechDocs/Mainpage/BuildLocally
## Docker based development environment
For convenience local development you may want to use the docker contaienr provided by this repo.
The container contains everything you need to work on the website including serving a preview, building the static pages and the CSS files.
### Requirements
* Docker https://docs.docker.com/install/
* Docker Compose https://docs.docker.com/compose/install/
* Patience (for the website build)
### Website Dev Instructions
#### Initial set up
Just run the following command for the initial setup:
```
./docker-setup.sh
```
⚠ The command may run some hours, since it does the initial full build of the website.
#### Development
Spin up the container (⚠ takes some minutes):
docker-compose up
The website should now be available on your machine under http://127.0.0.1:8000/.
Build a single page after changes (e.g. `index.de.xhtml`):
```
docker exec \
--workdir /fsfe-local-build/fsfe.org \
fsfe-local-build \
bash ../fsfe-preview.sh ../fsfe-website/index.de.xhtml
```
Style modifications in `fsfe-website/look` trigger a re build of the styles.
After modifications a page reload shoud show the changes.

32
config.cfg.docker Normal file
View File

@@ -0,0 +1,32 @@
### BUILD DIRECTORIES ###
# Cloned Git directory (repository with XHTML source files)
LOC_trunk=/fsfe-local-build/fsfe-website
# Directory in which the result of the build process (html files) will be saved
LOC_out=/fsfe-local-build/fsfe.org
### LOCAL WEBSERVER ###
# Choose your local webserver.
# Default is "python" which is python3's built-in http.server module (SimpleHTTP) that is available on most distributions
# Use "lighttpd" if you want to use the Lighttpd webserver. This has to be configured manually (see guide)
HTTPD=lighttpd
### ADVANCED ###
# Directory of the secondary Git directory with which you made a first full build.
# Avoids having some generated files in your clean trunk.
# Default: Leave empty if you just want to use one Git source directory (recommended)
LOC_trunk_dev=
# Choose on which port the webserver runs. This has no effect for "lighttpd".
HTTPD_port=5080
# If you use other webservers like "lighttpd", this is the path to its config file
# Default: points to a lighttpd config file in the same directory as the script
# Has no effect if you use the "python" webserver
HTTPD_conf=$ROOT/lighttpd-fsfe.conf

View File

@@ -1,15 +1,10 @@
### BUILD DIRECTORIES ### ### BUILD DIRECTORIES ###
# SVN trunk directory (repository with XHTML source files) # Cloned Git directory (repository with XHTML source files)
LOC_trunk=~/subversion/fsfe/fsfe-web/trunk LOC_trunk=~/Web/FSFE/fsfe-website
# Directory in which the result of the build process (html files) will be saved # Directory in which the result of the build process (html files) will be saved
LOC_out=~/subversion/fsfe/local-build/fsfe.org LOC_out=~/Web/FSFE/fsfe-local-build/fsfe.org
# Directory of the secondary SVN directory with which you made a first full build.
# Avoids having some generated files in your clean trunk.
# Default: Leave empty if you just want to use one SVN source directory (recommended)
LOC_trunk_dev=
### LOCAL WEBSERVER ### ### LOCAL WEBSERVER ###
@@ -19,6 +14,14 @@ LOC_trunk_dev=
# Use "lighttpd" if you want to use the Lighttpd webserver. This has to be configured manually (see guide) # Use "lighttpd" if you want to use the Lighttpd webserver. This has to be configured manually (see guide)
HTTPD=python HTTPD=python
### ADVANCED ###
# Directory of the secondary Git directory with which you made a first full build.
# Avoids having some generated files in your clean trunk.
# Default: Leave empty if you just want to use one Git source directory (recommended)
LOC_trunk_dev=
# Choose on which port the webserver runs. This has no effect for "lighttpd". # Choose on which port the webserver runs. This has no effect for "lighttpd".
HTTPD_port=5080 HTTPD_port=5080

32
docker-cmd.sh Executable file
View File

@@ -0,0 +1,32 @@
#!/bin/bash
########################################################################
# Copyright (C) 2019 Michael Weimann <mweimann@fsfe.org>
########################################################################
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
########################################################################
#
# This script is executed in docker CMD.
#
#######################################################################
# Set up the less watcher
cd /fsfe-local-build
sh less-watch.sh &
# Run the preview server
cd /fsfe-local-build/fsfe.org
python3 -m http.server

12
docker-compose.yml Normal file
View File

@@ -0,0 +1,12 @@
version: '3'
services:
fsfe-local-build:
build: .
image: fsfe/local-build:1.0
container_name: fsfe-local-build
ports:
- 8000:8000
volumes:
- .:/fsfe-local-build

53
docker-setup.sh Executable file
View File

@@ -0,0 +1,53 @@
#!/bin/bash
########################################################################
# Copyright (C) 2019 Michael Weimann <mweimann@fsfe.org>
########################################################################
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
########################################################################
#
# This script runs the docker dev setup.
#
#######################################################################
echo -e "\e[96m→ Cloning the website repo\e[0m"
git clone git@git.fsfe.org:FSFE/fsfe-website.git
echo ""
echo -e "\e[96m→ Setting up the config file\e[0m"
cp config.cfg.docker config.cfg
echo ""
echo -e "\e[96m→ Linking the look directory\e[0m"
ln -s ../fsfe-website/look fsfe.org/look
echo ""
echo -e "\e[96m→ Starting the container\e[0m"
docker-compose up --build -d
echo ""
echo -e "\e[96m→ Initial full build\e[0m"
echo -e "\e[33m⚠ This may take some hours\e[0m"
docker exec fsfe-local-build \
bash /fsfe-local-build/fsfe-website/build/build_main.sh \
build_into /fsfe-local-build/fsfe.org/ \
--statusdir /fsfe-local-build/status/ \
|| true
echo ""
echo -e "\e[96m→ Stopping the container\e[0m"
docker-compose stop
echo ""

View File

@@ -25,6 +25,38 @@
# #
####################################################################### #######################################################################
# Coloured and tagged output
function echo_ERR {
echo -e '\033[0;31m'"[ERROR] $1"'\033[0m'
}
function echo_SUC {
echo -e '\033[0;32m'"[SUCCESS] $1"'\033[0m'
}
function echo_WARN {
echo -e '\033[0;33m'"[WARNING] $1"'\033[0m'
}
function echo_INFO {
echo -e '\033[0;37m'"[INFO] $1"'\033[0m'
}
# Check dependencies (stolen from build_main.sh)
deperrors=''
for depend in realpath rsync xsltproc xmllint sed find egrep grep wc make tee date iconv; do
if ! which "$depend" >/dev/null 2>&1; then
deperrors="$depend $deperrors"
fi
done
if [ -n "$deperrors" ]; then
printf '\033[1;31m'
cat <<-EOF
The build script depends on some other programs to function.
Not all of those programs could be located on your system.
Please use your package manager to install the following programs:
EOF
printf '\n\033[0;31m%s\n' "$deperrors"
exit 1
fi >>/dev/stderr
ROOT=$(dirname "$(readlink -f "$0")") ROOT=$(dirname "$(readlink -f "$0")")
if [ ! -e "$ROOT"/config.cfg ]; then echo "Missing config.cfg file. Edit and rename config.cfg.sample"; exit 1; fi if [ ! -e "$ROOT"/config.cfg ]; then echo "Missing config.cfg file. Edit and rename config.cfg.sample"; exit 1; fi
source "$ROOT"/config.cfg source "$ROOT"/config.cfg
@@ -32,17 +64,20 @@ source "$ROOT"/config.cfg
# Help listing # Help listing
if [ "$1" = "" ]; then if [ "$1" = "" ]; then
self=$(basename $0) self=$(basename $0)
echo "No parameters or variables given!" echo_WARN "No parameters or variables given!"
echo echo
echo "Usage: " echo "Usage: "
echo echo
echo "$self file.en.xhtml" echo "$self file.en.xhtml"
echo " -- build single XHTML file from your source to the local web directory" echo " -- build single XHTML file from your source to the local web "
echo " the destination will be on the same relative level of the selected XHTML file" echo " directory"
echo " The destination will be on the same relative level of the "
echo " selected XHTML file"
echo " If not a XHTML file, it will be copied to the web directory" echo " If not a XHTML file, it will be copied to the web directory"
echo echo
echo "$self --copy picture.png look/style.css" echo "$self --copy picture.png look/style.css"
echo " -- Just copies several files to the local web directory without even trying to build them" echo " -- Just copies several files to the local web directory without "
echo " even trying to build them"
exit 0 exit 0
fi fi
@@ -54,84 +89,115 @@ LOC_trunk_dev=$(echo $LOC_trunk_dev | sed 's|/$||')
# Pure copy # Pure copy
if [ "$1" = "--copy" ]; then if [ "$1" = "--copy" ]; then
numargs=$(($# - 1)) numargs=$(($# - 1))
echo "[INFO] Starting a plain mass copy with $numargs files..." echo_INFO "Starting a plain mass copy with $numargs file(s)..."
for ((i=1; i <= $numargs; i++)); do for ((i=1; i <= $numargs; i++)); do
SRC_full=$(realpath $2) SRC_full=$(realpath $2)
DST_full=$(echo $SRC_full | sed -E "s|$LOC_trunk|$LOC_out|") DST_full=$(echo $SRC_full | sed -E "s|$LOC_trunk|$LOC_out|")
echo "[INFO] Copying $SRC_full to $DST_full..." echo_INFO "Copying $SRC_full to $DST_full..."
if [ -d "$SRC_full" ] && [ -e "$DST_full" ]; then
rm -rf "$DST_full"
cp -R $SRC_full $DST_full cp -R $SRC_full $DST_full
else
cp -R $SRC_full $DST_full
fi
shift shift
done done
echo "[SUCCESS] Copying finished. Files should be visible via the local webserver now." echo_SUC "Copying finished. Files should be visible via the local webserver now."
exit 0 exit 0
fi fi
SRC_rel=$1 # e.g. index.en.xhtml # Run through number of files given as arguments
SRC_full=$(realpath $SRC_rel) # Full path to source file numargs=$#
echo_INFO "Building $numargs file(s)"
# CHECK whether the source file is located in LOC_trunk if [ $numargs -gt 1 ]; then
if [ ! $(echo $SRC_full | grep "$LOC_trunk") ]; then echo
echo "[ERROR] Given source file is not part of \$LOC_trunk (currently set to \"$LOC_trunk\"). Please only build files which reside in or below this directory. Aborting now."
exit 1
fi fi
for ((i=1; i <= $numargs; i++)); do
SRC_rel=$1 # e.g. index.en.xhtml
SRC_full=$(realpath $SRC_rel) # Full path to source file
# TEST if a DEV SVN directory is used. If yes, copy clean file to this Dir # CHECK whether the source file is located in LOC_trunk
if [ "$LOC_trunk_dev" != "" ]; then if [ ! $(echo $SRC_full | grep "$LOC_trunk") ]; then
echo_ERR "Given source file is not part of \$LOC_trunk (currently set to \"$LOC_trunk\"). Please only build files which reside in or below this directory. Aborting now."
exit 1
fi
# CHECK whether the source file is a directory (only --copy allowed)
if [ -d "$SRC_full" ]; then
echo_ERR "The given file \"$SRC_full\" is a directory. Those can only be copied by using --copy as a parameter."
echo_ERR "NOTE: Using --copy won't build potential .xhtml files inside a directory. If you have this case, please first copy an empty directory and then build the .xhtml files inside them."
exit 1
fi
# TEST if a DEV SVN directory is used. If yes, copy clean file to this Dir
if [ "$LOC_trunk_dev" != "" ]; then
SRC_full_dev=$(echo $SRC_full | sed -E "s|$LOC_trunk|$LOC_trunk_dev|") SRC_full_dev=$(echo $SRC_full | sed -E "s|$LOC_trunk|$LOC_trunk_dev|")
echo "[INFO] A \"dirty\" Development SVN directory ($LOC_trunk_dev) is being used. Copy file from clean SVN directory ($LOC_trunk) to Development directory..." echo_INFO "A \"dirty\" Development SVN directory ($LOC_trunk_dev) is being used. Copy file from clean SVN directory ($LOC_trunk) to Development directory..."
cp $SRC_full $SRC_full_dev # copy file from clean SVN to dev/dirty SVN cp $SRC_full $SRC_full_dev # copy file from clean SVN to dev/dirty SVN
SRC_full=$SRC_full_dev SRC_full=$SRC_full_dev
LOC_trunk=$LOC_trunk_dev LOC_trunk=$LOC_trunk_dev
fi fi
echo "[INFO] Using file $SRC_full as source..." echo_INFO "Using file $SRC_full as source..."
### TRANSFORM XHTML file path ### TRANSFORM XHTML file path
DST_full=$(echo $SRC_full | sed -E "s|$LOC_trunk|$LOC_out|") # replace SVN directory by build/HTTP destination DST_full=$(echo $SRC_full | sed -E "s|$LOC_trunk|$LOC_out|") # replace SVN directory by build/HTTP destination
### BUILD/COPY FILE depending on file extension ### BUILD/COPY FILE depending on file extension
ftype=${SRC_full##*.} # get extension of file ftype=${SRC_full##*.} # get extension of file
ftype=$(echo "$ftype" | tr '[:upper:]' '[:lower:]') ftype=$(echo "$ftype" | tr '[:upper:]' '[:lower:]')
ftype_build="xhtml" # file types which have to be built ftype_build="xhtml" # file types which have to be built
if [[ "$ftype" == @($ftype_build) ]]; then # XHTML file if [[ "$ftype" == @($ftype_build) ]]; then # XHTML file
DST_full=$(echo $DST_full | sed -E "s/$ftype_build/html/") # Replace xhtml by html DST_full=$(echo $DST_full | sed -E "s/$ftype_build/html/") # Replace xhtml by html
echo "[INFO] XHTML file detected. Going to build into $DST_full ..." echo_INFO "XHTML file detected. Going to build into $DST_full ..."
xmllint --noout "$SRC_full" || (echo; echo "[ERROR] Syntax error in $SRC_full. Error message above. Please fix!"; exit 1) xmllint --noout "$SRC_full" || (echo; echo "Syntax error in $SRC_full. Error message above. Please fix!"; exit 1)
if [[ "$?" != "0" ]]; then exit 1; fi if [[ "$?" != "0" ]]; then exit 1; fi
$LOC_trunk/build/build_main.sh process_file $SRC_full > $DST_full $LOC_trunk/build/build_main.sh process_file $SRC_full > $DST_full
else # just copy file else # just copy file
echo "[INFO] File type ($ftype) is detected as not to be built. Just copying it to $DST_full ..." echo_INFO "File type ($ftype) is detected as not to be built. Just copying it to $DST_full ..."
cp $SRC_full $DST_full cp $SRC_full $DST_full
fi fi
### START WEBSERVER if necessary ### START WEBSERVER if necessary
if [ "$HTTPD" == "python" ]; then # python if [ "$HTTPD" == "python" ]; then # python
if [ ! $(pgrep -f "pywebserver-fsfe.py $LOC_out") ]; then if [ ! $(pgrep -f "pywebserver-fsfe.py $LOC_out") ]; then
echo "[INFO] Starting $HTTPD webserver" echo_INFO "Starting $HTTPD webserver"
nohup "$ROOT/pywebserver-fsfe.py" "$LOC_out" "$HTTPD_port" > "$ROOT"/pywebserver-fsfe.log 2>&1 & nohup "$ROOT/pywebserver-fsfe.py" "$LOC_out" "$HTTPD_port" > "$ROOT"/pywebserver-fsfe.log 2>&1 &
else else
echo "[INFO] $HTTPD webserver already seems to be running." echo_INFO "$HTTPD webserver already seems to be running."
fi fi
elif [ "$HTTPD" == "lighttpd" ]; then elif [ "$HTTPD" == "lighttpd" ]; then
if [ ! $(pgrep lighttpd) ]; then # lighttpd if [ ! $(pgrep lighttpd) ]; then # lighttpd
echo "[INFO] Starting $HTTPD webserver" echo_INFO "Starting $HTTPD webserver"
/usr/sbin/lighttpd -f "$HTTPD_conf" /usr/sbin/lighttpd -f "$HTTPD_conf"
else else
echo "[INFO] $HTTPD webserver already seems to be running." echo_INFO "$HTTPD webserver already seems to be running."
fi fi
elif [ "$HTTPD" == "" ]; then # empty variable elif [ "$HTTPD" == "" ]; then # empty variable
echo "[ERROR] No webserver specified. Please define variable HTTPD in config.cfg. Aborting now." echo_ERR "No webserver specified. Please define variable HTTPD in config.cfg. Aborting now."
exit 1 exit 1
else # something custom else # something custom
echo "[WARNING] Unknown webserver defined. Please check variable HTTPD in config.cfg." echo_WARN "Unknown webserver defined. Probably you won't be able to see the file in your browser. Building it anyway. Please check variable \"HTTPD\" in config.cfg."
fi fi
### SHOW RESULTS ### SHOW RESULTS
echo DST_rel=$(echo $DST_full | sed "s|$LOC_out||") # relative path
DST_rel=$(echo $DST_full | sed "s|$LOC_out||") # relative path echo_SUC "Finished. File can be viewed at http://localhost:$HTTPD_port$DST_rel"
echo "[SUCCESS] Finished. File can be viewed at http://localhost:5080$DST_rel"
if [ $numargs -gt 1 ]; then
echo "++++++++++++++++++++++++++++++++++"
fi
shift
done
if [ $numargs -gt 1 ]; then
echo
echo_SUC "$numargs files have been processed. Preview links to each file can be found individually above."
fi

2
fsfe.org/.gitignore vendored
View File

@@ -1,2 +0,0 @@
*
!.gitignore

31
less-watch.sh Executable file
View File

@@ -0,0 +1,31 @@
#!/bin/bash
########################################################################
# Copyright (C) 2019 Michael Weimann <mweimann@fsfe.org>
########################################################################
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
########################################################################
#
# This script sets up a watcher that re-compiles the fsfe website
# styles on changes.
#
#######################################################################
while inotifywait \
-r -e close_write -e create -e moved_to \
--exclude '\.(swx|swp|min\.css)' fsfe-website/look; do
lessc -x fsfe-website/look/fsfe.less fsfe-website/look/fsfe.min.css;
done

View File

@@ -1,14 +1,19 @@
server.modules = ( "mod_access" ) server.modules = ( "mod_access", "mod_accesslog" )
$HTTP["remoteip"] !~ "127.0.0.1" { $HTTP["remoteip"] !~ "127.0.0.1" {
url.access-deny = ("") # prevent hosting to the network url.access-deny = ("") # prevent hosting to the network
} }
# change port and document-root accordingly # change port and document-root accordingly
server.port = 5080 server.port = 5080
server.document-root = "/home/USER/subversion/fsfe/local-build/fsfe.org" server.document-root = "/home/USER/Web/FSFE/fsfe-local-build/fsfe.org"
server.errorlog = "/dev/stdout" server.errorlog = "/home/USER/Web/FSFE/fsfe-local-build/lighttpd-fsfe.error.log"
accesslog.filename = "/home/USER/Web/FSFE/fsfe-local-build/lighttpd-fsfe.access.log"
server.dir-listing = "enable" server.dir-listing = "enable"
dir-listing.encoding = "utf-8" dir-listing.encoding = "utf-8"
index-file.names = ("index.html", "index.en.html") index-file.names = ("index.html", "index.en.html")
include_shell "./create-mime.assign.pl" include_shell "./create-mime.assign.pl"
# Uncomment if your would like to enable php support
# server.modules += ( "mod_cgi" )
# cgi.assign = ( ".php" => "/usr/bin/php-cgi" )

2
status/.gitignore vendored
View File

@@ -1,2 +0,0 @@
*
!.gitignore

0
status/.gitkeep Normal file
View File