# Settings
UNAME := $(shell uname)
JEKYLL=jekyll
PORT?=4000
HOST?=0.0.0.0
FLAGS?=""
ENV?="development"
CHROME=google-chrome-stable
PDF_HOST?=127.0.0.1
SITE_URL=http://${PDF_HOST}:${PORT}/training-material
PDF_DIR=_pdf
REPO=$(shell echo "$${ORIGIN_REPO:-galaxyproject/training-material}")
BRANCH=$(shell echo "$${ORIGIN_BRANCH:-main}")
MINICONDA_URL=https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
SHELL=bash
RUBY_VERSION=2.4.4
CONDA_ENV=galaxy_training_material
GATREPO=/tmp/git-gat
TEST_VM=gat-8.eu.training.galaxyproject.eu
ifeq ($(shell uname -s),Darwin)
CHROME=/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
MINICONDA_URL=https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
endif
ifeq ($(UNAME),Darwin)
ENV_FILE=environment-osx.yml
else
ENV_FILE=environment.yml
endif
CONDA=$(shell which mamba)
ifeq ($(CONDA),)
CONDA=$(shell which conda)
ifeq ($(CONDA),)
CONDA=${HOME}/miniconda3/bin/mamba
endif
endif
default: help
install-conda: ## install Miniconda
curl -L $(MINICONDA_URL) -o miniconda.sh
bash miniconda.sh -b
.PHONY: install-conda
create-env: ## create conda environment
if ${CONDA} env list | grep '^\s*${CONDA_ENV}'; then \
${CONDA} env update -f ${ENV_FILE}; \
else \
${CONDA} env create -f ${ENV_FILE}; \
fi
.PHONY: create-env
ACTIVATE_ENV = source $(shell dirname $(dir $(CONDA)))/bin/activate $(CONDA_ENV)
COND_ENV_DIR=$(shell dirname $(dir $(CONDA)))
install: clean create-env ## install dependencies
$(ACTIVATE_ENV) && \
gem update --no-document --system && \
ICONV_LIBS="-L${CONDA_PREFIX}/lib/ -liconv" ${CONDA_PREFIX}/bin/gem install --no-document addressable:'2.5.2' jekyll jekyll-feed jekyll-redirect-from csl-styles awesome_bot html-proofer pkg-config kwalify bibtex-ruby citeproc-ruby fastimage rubyzip && \
pushd ${COND_ENV_DIR}/envs/${CONDA_ENV}/share/rubygems/bin && \
ln -sf ../../../bin/ruby ruby
.PHONY: install
bundle-install: clean ## install gems if Ruby is already present (e.g. on gitpod.io)
bundle install
.PHONE: bundle-install
bundle-update: bundle-install ## install gems if Ruby is already present (e.g. on gitpod.io)
bundle update
.PHONE: bundle-update
serve: ## run a local server (You can specify PORT=, HOST=, and FLAGS= to set the port, host or to pass additional flags)
@echo "Tip: Want faster builds? Use 'serve-quick' in place of 'serve'."
@echo "Tip: to serve in incremental mode (faster rebuilds), use the command: make serve FLAGS=--incremental" && echo "" && \
$(ACTIVATE_ENV) && \
mv Gemfile Gemfile.backup || true && \
mv Gemfile.lock Gemfile.lock.backup || true && \
${JEKYLL} serve --trace --strict_front_matter -d _site/training-material -P ${PORT} -H ${HOST} ${FLAGS}
.PHONY: serve
serve-quick: ## run a local server (faster, some plugins disabled for speed)
@echo "This will build the website with citations and other content disabled, and incremental on by default. To run the full preview (slower), use make serve" && echo "" && \
$(ACTIVATE_ENV) && \
mv Gemfile Gemfile.backup || true && \
mv Gemfile.lock Gemfile.lock.backup || true && \
${JEKYLL} serve --strict_front_matter -d _site/training-material --incremental --config _config.yml,_config-dev.yml -P ${PORT} -H ${HOST} ${FLAGS}
.PHONY: serve-quick
preview: serve-codespaces
.PHONY: serve-codespaces
serve-codespaces: codespace-clean bundle-install bundle-update
bundle exec jekyll serve --config _config.yml,_config-dev.yml --incremental
.PHONY: serve-codespaces
codespace-clean:
rm -rf /workspaces/.codespaces/shared/editors/jetbrains;
rm -f /workspaces/training-material/.git/objects/pack/tmp_pack*
.PHONY: codespace-clean
serve-gitpod: bundle-install ## run a server on a gitpod.io environment
bundle exec jekyll serve --config _config.yml --incremental
.PHONY: serve-gitpod
serve-gitpod-quick: bundle-install ## run a server on a gitpod.io environment
bundle exec jekyll serve --config _config.yml,_config-dev.yml --incremental
.PHONY: serve-gitpod-quick
build-gitpod: bundle-install ## run a build on a gitpod.io environment
bundle exec jekyll build --config _config.yml
.PHONY: build-gitpod
build: clean ## build files but do not run a server (You can specify FLAGS= to pass additional flags to Jekyll)
$(ACTIVATE_ENV) && \
mv Gemfile Gemfile.backup || true && \
mv Gemfile.lock Gemfile.lock.backup || true && \
JEKYLL_ENV=${ENV} ${JEKYLL} build --strict_front_matter -d _site/training-material ${FLAGS}
.PHONY: build
check-frontmatter: ## Validate the frontmatter
$(ACTIVATE_ENV) && \
bundle exec ruby bin/validate-frontmatter.rb
bundle exec ruby bin/validate-other.rb
.PHONY: check-frontmatter
check-contributors: ## Validate the contributors.yaml file
$(ACTIVATE_ENV) && \
bundle exec ruby bin/validate-contributors.rb
.PHONY: check-contributors
_check-html: # Internal
$(ACTIVATE_ENV) && \
htmlproofer \
--assume-extension \
--http-status-ignore 405,503,999 \
--url-ignore "/.*localhost.*/","/.*vimeo\.com.*/","/.*gitter\.im.*/","/.*drmaa\.org.*/" \
--url-swap "github.com/galaxyproject/training-material/tree/main:github.com/${REPO}/tree/${BRANCH}" \
--file-ignore "/.*\/files\/.*/","/.*\/node_modules\/.*/","/\/tutorials\/.*\/docker\//" \
--allow-hash-href \
./_site
.PHONY: _check-html
check-html: build ## validate HTML
$(MAKE) _check-html
.PHONY: check-html
_check-html-internal: # Internal
$(ACTIVATE_ENV) && \
htmlproofer \
--assume-extension \
--http-status-ignore 405,503,999 \
--url-ignore "/.*localhost.*/","/.*vimeo\.com.*/","/.*gitter\.im.*/","/.*drmaa\.org.*/","/.*slides.html#/","/#embedded_jbrowse/","/.*videos.*.mp4.png/" \
--url-swap "github.com/galaxyproject/training-material/tree/main:github.com/${REPO}/tree/${BRANCH}" \
--file-ignore "/.*\/files\/.*/","/.*\/node_modules\/.*/","/\/tutorials\/.*\/docker\//" \
--disable-external \
--allow-hash-href \
./_site
.PHONY: _check-html-internal
check-html-internal: build ## validate HTML (internal links only)
$(MAKE) _check-html-internal
.PHONY: check-html-internal
check-slides: build ## check the markdown-formatted links in slides
$(ACTIVATE_ENV) && \
find _site -path "**/slides*.html" \
| xargs -L 1 -I '{}' sh -c "awesome_bot \
--allow 405 \
--allow-redirect \
--white-list localhost,127.0.0.1,fqdn,vimeo.com,drmaa.com \
--allow-ssl \
--allow-dupe \
--skip-save-results \
-f {}"
.PHONY: check-slides
check-diffs: ## lint diffs in tutorials
find ./topics/admin/ -name '*.md' -type f -print0 | xargs -n 1 -0 python3 bin/lint-diffs.py
.PHONY: check-diffs
check-yaml: ## lint yaml files
find . -name '*.yaml' | grep -v .github | xargs -L 1 -I '{}' sh -c "yamllint -c .yamllint {}"
.PHONY: check-yaml
check-framework:
$(ACTIVATE_ENV) && \
ruby _plugins/jekyll-notranslate.rb
.PHONY: check-framework
check-broken-boxes: build ## List tutorials containing broken boxes
./bin/check-broken-boxes
.PHONY: check-broken-boxes
check: check-html-internal check-html check-broken-boxes check-slides ## run checks which require compiled HTML
.PHONY: check
lint: check-frontmatter check-contributors ## run linting checks which do not require a built site
.PHONY: lint
check-links-gh-pages: ## validate HTML on gh-pages branch (for daily cron job)
$(ACTIVATE_ENV) && \
htmlproofer \
--assume-extension \
--http-status-ignore 405,503,999 \
--url-ignore "/.*localhost.*/","/.*vimeo\.com.*/","/.*gitter\.im.*/","/.*drmaa\.org.*/" \
--file-ignore "/.*\/files\/.*/","/\/tutorials\/.*\/docker\//" \
--allow-hash-href \
. && \
find . -path "**/slides*.html" \
| xargs -L 1 -I '{}' sh -c "awesome_bot \
--allow 405 \
--allow-redirect \
--white-list localhost,127.0.0.1,fqdn,vimeo.com,drmaa.com \
--allow-ssl \
--allow-dupe \
--skip-save-results \
-f {}"
.PHONY: check-links-gh-pages
TUTORIAL_PDFS=$(shell find _site/training-material -name 'tutorial.html' | sed 's/html$$/pdf/g')
SLIDE_PDFS=$(shell find _site/training-material -name 'slides.html' | sed 's/html$$/pdf/g')
SLIDE_PDFS+=$(shell find _site/training-material/*/*/slides/* | sed 's/html$$/pdf/g')
pdf: $(SLIDE_PDFS) $(TUTORIAL_PDFS) ## generate the PDF of the tutorials and slides
.PHONY: pdf
_site/%/tutorial.pdf: _site/%/tutorial.html
if ! grep 'http-equiv="refresh"' $< --quiet; then \
$(ACTIVATE_ENV) && \
sed "s|/training-material/|$(shell pwd)/_site/training-material/|g" $< | \
sed "s|<head>|<head><base href=\"file://$(shell pwd)/$(<:_site/training/material%=%)\">|" | \
wkhtmltopdf \
--enable-javascript --javascript-delay 1000 \
- $@; \
fi
_site/%/slides.pdf: _site/%/slides.html
$(ACTIVATE_ENV) && \
./node_modules/.bin/http-server _site -p 9876 & \
docker run --rm --network host -v $(shell pwd):/slides astefanutti/decktape:3.9 automatic -s 1920x1080 http://127.0.0.1:9876/$(<:_site/%=%) /slides/$@
_site/%/slides_ES.pdf: _site/%/slides_ES.html
$(ACTIVATE_ENV) && \
./node_modules/.bin/http-server _site -p 9876 & \
docker run --rm --network host -v $(shell pwd):/slides astefanutti/decktape:3.9 automatic -s 1920x1080 http://127.0.0.1:9876/$(<:_site/%=%) /slides/$@
_site/%/slides_CAT_ES.pdf: _site/%/slides_CAT_ES.html
$(ACTIVATE_ENV) && \
./node_modules/.bin/http-server _site -p 9876 & \
docker run --rm --network host -v $(shell pwd):/slides astefanutti/decktape:3.9 automatic -s 1920x1080 http://127.0.0.1:9876/$(<:_site/%=%) /slides/$@
video: ## Build all videos
bash bin/ari-make.sh
metadata/public-server-tools.json:
python ./bin/supported-fetch.py
annotate: ## annotate the tutorials with usable Galaxy instances
${ACTIVATE_ENV} && \
wget https://github.com/hexylena/toolshed-version-database/raw/main/guid-rev.json -O metadata/toolshed-revisions.json && \
python bin/supported-fetch.py
bin/workflows-fetch.rb
bin/fetch-categories.rb
.PHONY: annotate
rebuild-search-index: ## Rebuild search index
node bin/lunr-index.js > search.json
clean: ## clean up junk files
@rm -rf _site
@rm -rf .sass-cache
@rm -rf .bundle
@rm -rf vendor
@rm -rf node_modules
@rm -rf .jekyll-metadata
@rm -rf .jekyll-cache
@find . -name .DS_Store -exec rm {} \;
@find . -name '*~' -exec rm {} \;
.PHONY: clean
help:
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
.PHONY: help
setup-gat: $(GATREPO)
@echo "Setting up temporary git-gat repo"
.PHONY: setup-gat
$(GATREPO):
bash bin/knit-automated.sh export
cd /tmp/git-gat && git init && git am -3 *.patch && rm *.patch
clean-gat:
@echo "Cleaning temporary git-gat repo"
rm -rf $(GATREPO)
.PHONY: clean-gat
test-gat: gat-update-hosts
echo "password" > $(GATREPO)/.vault-password.txt
cd $(GATREPO) && ansible-galaxy install -p roles -r requirements.yml && ansible-galaxy collection install -p roles -r requirements.yml || ansible-playbook galaxy.yml
.PHONY: test-gat
gat-update-hosts:
sed -i 's/gat-0\.eu\.galaxy\.training/${TEST_VM}/g' $(GATREPO)/hosts
sed -i 's/ansible_connection=local//g' $(GATREPO)/hosts
.PHONY: gat-update-hosts
import-gat:
./bin/knit-automated.sh import
.PHONY: import-gat