chore(ci, cd): build and deploy via _gh-actions_ directly
New actions available in GitHub allow for building and deploying the site completely from the actions workflow with minimal code. The deploy.sh script is no longer necessary with these changes.
This commit is contained in:
parent
b78a2d85bd
commit
43323abdfe
4 changed files with 124 additions and 170 deletions
8
.github/workflows/ci.yml
vendored
8
.github/workflows/ci.yml
vendored
|
@ -20,18 +20,22 @@ on:
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
ruby: [2.5, 2.6, 2.7, 3]
|
ruby: [2.5, 2.6, 2.7, 3]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0 # for posts's lastmod
|
fetch-depth: 0 # for posts's lastmod
|
||||||
|
|
||||||
- name: Setup Ruby
|
- name: Setup Ruby
|
||||||
uses: ruby/setup-ruby@v1
|
uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: ${{ matrix.ruby }}
|
ruby-version: ${{ matrix.ruby }}
|
||||||
bundler-cache: true
|
bundler-cache: true
|
||||||
|
|
||||||
- name: Test Site
|
- name: Test Site
|
||||||
run: bash tools/deploy.sh --dry-run
|
run: bash tools/test.sh
|
||||||
|
|
59
.github/workflows/pages-deploy.yml.hook
vendored
59
.github/workflows/pages-deploy.yml.hook
vendored
|
@ -1,29 +1,72 @@
|
||||||
name: 'Automatic build'
|
name: "Build and deploy"
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
|
- main
|
||||||
- master
|
- master
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- .gitignore
|
- .gitignore
|
||||||
- README.md
|
- README.md
|
||||||
- LICENSE
|
- LICENSE
|
||||||
|
|
||||||
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
# Allow one concurrent deployment
|
||||||
|
concurrency:
|
||||||
|
group: "pages"
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
continuous-delivery:
|
build:
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0 # for posts's lastmod
|
fetch-depth: 0
|
||||||
|
# submodules: true
|
||||||
|
# If using the 'assets' git submodule from Chirpy Starter, uncomment above
|
||||||
|
# (See: https://github.com/cotes2020/chirpy-starter/tree/main/assets)
|
||||||
|
|
||||||
|
- name: Setup Pages
|
||||||
|
id: pages
|
||||||
|
uses: actions/configure-pages@v1
|
||||||
|
|
||||||
- name: Setup Ruby
|
- name: Setup Ruby
|
||||||
uses: ruby/setup-ruby@v1
|
uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: 2.7
|
ruby-version: 3 # reads from a '.ruby-version' or '.tools-version' file if 'ruby-version' is omitted
|
||||||
bundler-cache: true
|
bundler-cache: true
|
||||||
|
|
||||||
- name: Deploy
|
- name: Build site
|
||||||
run: bash tools/deploy.sh
|
run: bundle exec jekyll b -d "_site${{ steps.pages.outputs.base_path }}"
|
||||||
|
env:
|
||||||
|
JEKYLL_ENV: "production"
|
||||||
|
|
||||||
|
- name: Test site
|
||||||
|
run: |
|
||||||
|
bundle exec htmlproofer _site --disable-external --check-html --allow_hash_href
|
||||||
|
|
||||||
|
- name: Upload site artifact
|
||||||
|
uses: actions/upload-pages-artifact@v1
|
||||||
|
with:
|
||||||
|
path: "_site${{ steps.pages.outputs.base_path }}"
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
name: "Deploy site"
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: build
|
||||||
|
steps:
|
||||||
|
- name: Deploy to GitHub Pages
|
||||||
|
id: deployment
|
||||||
|
uses: actions/deploy-pages@v1
|
||||||
|
|
160
tools/deploy.sh
160
tools/deploy.sh
|
@ -1,160 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
#
|
|
||||||
# Build, test and then deploy the site content to 'origin/<pages_branch>'
|
|
||||||
#
|
|
||||||
# Requirement: html-proofer, jekyll
|
|
||||||
#
|
|
||||||
# Usage: See help information
|
|
||||||
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
PAGES_BRANCH="gh-pages"
|
|
||||||
|
|
||||||
SITE_DIR="_site"
|
|
||||||
|
|
||||||
_opt_dry_run=false
|
|
||||||
|
|
||||||
_config="_config.yml"
|
|
||||||
|
|
||||||
_no_pages_branch=false
|
|
||||||
|
|
||||||
_backup_dir="$(mktemp -d)"
|
|
||||||
|
|
||||||
_baseurl=""
|
|
||||||
|
|
||||||
help() {
|
|
||||||
echo "Build, test and then deploy the site content to 'origin/<pages_branch>'"
|
|
||||||
echo
|
|
||||||
echo "Usage:"
|
|
||||||
echo
|
|
||||||
echo " bash ./tools/deploy.sh [options]"
|
|
||||||
echo
|
|
||||||
echo "Options:"
|
|
||||||
echo ' -c, --config "<config_a[,config_b[...]]>" Specify config file(s)'
|
|
||||||
echo " --dry-run Build site and test, but not deploy"
|
|
||||||
echo " -h, --help Print this information."
|
|
||||||
}
|
|
||||||
|
|
||||||
init() {
|
|
||||||
if [[ -z ${GITHUB_ACTION+x} && $_opt_dry_run == 'false' ]]; then
|
|
||||||
echo "ERROR: It is not allowed to deploy outside of the GitHub Action envrionment."
|
|
||||||
echo "Type option '-h' to see the help information."
|
|
||||||
exit -1
|
|
||||||
fi
|
|
||||||
|
|
||||||
_baseurl="$(grep '^baseurl:' _config.yml | sed "s/.*: *//;s/['\"]//g;s/#.*//")"
|
|
||||||
}
|
|
||||||
|
|
||||||
build() {
|
|
||||||
# clean up
|
|
||||||
if [[ -d $SITE_DIR ]]; then
|
|
||||||
rm -rf "$SITE_DIR"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# build
|
|
||||||
JEKYLL_ENV=production bundle exec jekyll b -d "$SITE_DIR$_baseurl" --config "$_config"
|
|
||||||
}
|
|
||||||
|
|
||||||
test() {
|
|
||||||
bundle exec htmlproofer \
|
|
||||||
--disable-external \
|
|
||||||
--check-html \
|
|
||||||
--allow_hash_href \
|
|
||||||
"$SITE_DIR"
|
|
||||||
}
|
|
||||||
|
|
||||||
resume_site_dir() {
|
|
||||||
if [[ -n $_baseurl ]]; then
|
|
||||||
# Move the site file to the regular directory '_site'
|
|
||||||
mv "$SITE_DIR$_baseurl" "${SITE_DIR}-rename"
|
|
||||||
rm -rf "$SITE_DIR"
|
|
||||||
mv "${SITE_DIR}-rename" "$SITE_DIR"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
setup_gh() {
|
|
||||||
if [[ -z $(git branch -av | grep "$PAGES_BRANCH") ]]; then
|
|
||||||
_no_pages_branch=true
|
|
||||||
git checkout -b "$PAGES_BRANCH"
|
|
||||||
else
|
|
||||||
git checkout -f "$PAGES_BRANCH"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
backup() {
|
|
||||||
mv "$SITE_DIR"/* "$_backup_dir"
|
|
||||||
mv .git "$_backup_dir"
|
|
||||||
|
|
||||||
# When adding custom domain from Github website,
|
|
||||||
# the CANME only exist on `gh-pages` branch
|
|
||||||
if [[ -f CNAME ]]; then
|
|
||||||
mv CNAME "$_backup_dir"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
flush() {
|
|
||||||
rm -rf ./*
|
|
||||||
rm -rf .[^.] .??*
|
|
||||||
|
|
||||||
shopt -s dotglob nullglob
|
|
||||||
mv "$_backup_dir"/* .
|
|
||||||
[[ -f ".nojekyll" ]] || echo "" >".nojekyll"
|
|
||||||
}
|
|
||||||
|
|
||||||
deploy() {
|
|
||||||
git config --global user.name "GitHub Actions"
|
|
||||||
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
||||||
|
|
||||||
git update-ref -d HEAD
|
|
||||||
git add -A
|
|
||||||
git commit -m "[Automation] Site update No.${GITHUB_RUN_NUMBER}"
|
|
||||||
|
|
||||||
if $_no_pages_branch; then
|
|
||||||
git push -u origin "$PAGES_BRANCH"
|
|
||||||
else
|
|
||||||
git push -f
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
main() {
|
|
||||||
init
|
|
||||||
build
|
|
||||||
test
|
|
||||||
resume_site_dir
|
|
||||||
|
|
||||||
if $_opt_dry_run; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
setup_gh
|
|
||||||
backup
|
|
||||||
flush
|
|
||||||
deploy
|
|
||||||
}
|
|
||||||
|
|
||||||
while (($#)); do
|
|
||||||
opt="$1"
|
|
||||||
case $opt in
|
|
||||||
-c | --config)
|
|
||||||
_config="$2"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--dry-run)
|
|
||||||
# build & test, but not deploy
|
|
||||||
_opt_dry_run=true
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-h | --help)
|
|
||||||
help
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# unknown option
|
|
||||||
help
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
main
|
|
67
tools/test.sh
Executable file
67
tools/test.sh
Executable file
|
@ -0,0 +1,67 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Build and test the site content
|
||||||
|
#
|
||||||
|
# Requirement: html-proofer, jekyll
|
||||||
|
#
|
||||||
|
# Usage: See help information
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
SITE_DIR="_site"
|
||||||
|
|
||||||
|
_config="_config.yml"
|
||||||
|
|
||||||
|
help() {
|
||||||
|
echo "Build and test the site content"
|
||||||
|
echo
|
||||||
|
echo "Usage:"
|
||||||
|
echo
|
||||||
|
echo " bash ./tools/test.sh [options]"
|
||||||
|
echo
|
||||||
|
echo "Options:"
|
||||||
|
echo ' -c, --config "<config_a[,config_b[...]]>" Specify config file(s)'
|
||||||
|
echo " -h, --help Print this information."
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
# clean up
|
||||||
|
if [[ -d $SITE_DIR ]]; then
|
||||||
|
rm -rf "$SITE_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
_baseurl="$(grep '^baseurl:' "$_config" | sed "s/.*: *//;s/['\"]//g;s/#.*//")"
|
||||||
|
|
||||||
|
# build
|
||||||
|
JEKYLL_ENV=production bundle exec jekyll build \
|
||||||
|
--destination "$SITE_DIR$_baseurl" \
|
||||||
|
--config "$_config"
|
||||||
|
|
||||||
|
# test
|
||||||
|
bundle exec htmlproofer "$SITE_DIR" \
|
||||||
|
--disable-external \
|
||||||
|
--check-html \
|
||||||
|
--allow_hash_href
|
||||||
|
}
|
||||||
|
|
||||||
|
while (($#)); do
|
||||||
|
opt="$1"
|
||||||
|
case $opt in
|
||||||
|
-c | --config)
|
||||||
|
_config="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-h | --help)
|
||||||
|
help
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# unknown option
|
||||||
|
help
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
main
|
Loading…
Reference in a new issue