| #!/bin/bash |
| |
| # Create a local Pelican build of an infrastructure-pelican-based site |
| # and deploy it at http://localhost:8000 |
| # |
| # requires pip3/python3, cmake, and a C compiler |
| # known to work on linux/osx. probably works under WSL. |
| # will not work under basic Windows. |
| |
| # github prefix for cloning/updating repos |
| GH="https://github.com/apache" |
| |
| # site_build directory path. use a /tmp dir by default |
| SB="$HOME/pelican-local" |
| |
| # infrastructure-pelican repo |
| IP="infrastructure-pelican" |
| |
| # build target site repo minus the .git suffix |
| REPO=`basename $1 .git` |
| |
| echo "Using GitHub prefix: $GH" |
| if [ "$1" = "" ] || [ $# -gt 1 ]; |
| then |
| echo "Usage: $0 site-repo" |
| echo "Example: $0 infrastructure-website" |
| exit -1 |
| fi |
| |
| echo "Starting build for $REPO" |
| |
| # make sure our tools exist |
| echo "Checking dependencies..." |
| if ! command -v cmake &> /dev/null |
| then |
| echo "cmake not found! you need to install the cmake package" |
| exit -1 |
| elif ! command -v python3 &> /dev/null |
| then |
| echo "python3 not found! you need to install the python3 package" |
| exit -1 |
| elif ! command -v pip3 &> /dev/null |
| then |
| echo "pip3 not found! you need to insatll the pip3 package" |
| exit -1 |
| elif ! command -v pipenv &> /dev/null |
| then |
| echo "pipenv not found! installing it for you..." |
| pip3 install pipenv > /dev/null 2>&1 |
| if [ $? -eq 1 ]; |
| then |
| echo "pipenv installation failed!" |
| exit -1 |
| fi |
| fi |
| |
| # create our build dir to hold our repos and cmark-gfm |
| if [ ! -d $SB ]; |
| then |
| mkdir $SB || 'echo "Creation of $SB failed!" && exit -1' |
| cd $SB |
| else |
| cd $SB |
| fi |
| |
| |
| # clone or update the pelican and site repos as needed |
| echo "Cloning repos..." |
| |
| if [ -d $IP ]; |
| then |
| echo "$IP exists - updating..." |
| cd $IP && git pull > /dev/null && cd .. |
| else |
| echo "Cloning $IP" |
| # Sometimes useful to add -b <branch> for buildsite testing |
| git clone $GH/$IP 2>&1 |
| fi |
| |
| IP="$SB/$IP" |
| |
| if [ -d $REPO ]; |
| then |
| echo "$REPO exists - not updating in case there are local changes!" |
| echo "Perform a manual git pull to sync with upstream $REPO" |
| # cd $REPO && git pull > /dev/null && cd .. |
| else |
| echo "Cloning $REPO" |
| git clone $GH/$REPO 2>&1 |
| fi |
| REPO="$SB/$REPO" |
| # deploy our pipenv if we haven't already |
| # TBD: check timestamp on $IP/requirements.txt and auto-update pipenv deps |
| # right now that process is manual |
| |
| if [ ! -f "Pipfile.lock" ]; |
| then |
| echo "Setting up pipenv..." |
| pipenv --three install -r $IP/requirements.txt > /dev/null 2>&1 || 'echo "pipenv install failed!" && exit -1' |
| |
| else |
| echo "Pipfile.lock found, assuming pipenv exists." |
| echo "Run pipenv install -r $IP/requirements.txt to update dependencies if needed." |
| fi |
| |
| # figure out what version of cmark-gfm we need to use |
| echo "Extracting cmark version..." |
| VERSION=`grep ^VERSION ./infrastructure-pelican/bin/build-cmark.sh | cut -d '=' -f 2` |
| |
| # if we already built this version of cmark, don't build it again |
| if [ $VERSION ]; |
| then |
| echo "Found version $VERSION" |
| else |
| echo "cmark-gfm version string not found! this shouldn't happen." |
| exit -1 |
| fi |
| |
| if [ -d "cmark-gfm-$VERSION" ]; |
| then |
| echo "Using existing ${PWD}/cmark-gfm-$VERSION/lib" |
| export LIBCMARKDIR=${PWD}/cmark-gfm-$VERSION/lib |
| else |
| echo "Building cmark-gfm..." |
| eval `./infrastructure-pelican/bin/build-cmark.sh 2>&1 | grep export | grep -v echo ` |
| fi |
| |
| # run the site build/deploy in our pipenv environment |
| |
| # Clean |
| if [ -d "$(realpath $REPO)/site-generated" ] && [ -f "$(realpath $REPO)/pelican.auto.py" ]; |
| then |
| echo "Generated local site exists! Removing..." |
| rm -rf $(realpath $REPO)/site-generated $(realpath $REPO)/pelican.auto.py |
| fi |
| |
| # Build |
| cd $REPO |
| pipenv run python3 $(realpath $IP)/bin/buildsite.py dir --yaml-dir $(realpath $REPO) --content-dir "$(realpath $REPO)/content" |
| |
| # Serve |
| pipenv run python3 -m pelican content --settings $(realpath $REPO)/pelican.auto.py --o $(realpath $REPO)/site-generated -r -l -b 0.0.0.0 |
| |