From 43323abdfe38a31bf2f4ed031e3262b6cd6dafbf Mon Sep 17 00:00:00 2001 From: Galen Rice Date: Sat, 13 Aug 2022 17:47:30 -0400 Subject: [PATCH] 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. --- .github/workflows/ci.yml | 8 +- .github/workflows/pages-deploy.yml.hook | 59 +++++++-- tools/deploy.sh | 160 ------------------------ tools/test.sh | 67 ++++++++++ 4 files changed, 124 insertions(+), 170 deletions(-) delete mode 100755 tools/deploy.sh create mode 100755 tools/test.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dbefeae..86c6370 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,18 +20,22 @@ on: jobs: build: runs-on: ubuntu-latest + strategy: matrix: ruby: [2.5, 2.6, 2.7, 3] + steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 # for posts's lastmod + - name: Setup Ruby uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby }} bundler-cache: true + - name: Test Site - run: bash tools/deploy.sh --dry-run + run: bash tools/test.sh diff --git a/.github/workflows/pages-deploy.yml.hook b/.github/workflows/pages-deploy.yml.hook index 81a249e..821a08b 100644 --- a/.github/workflows/pages-deploy.yml.hook +++ b/.github/workflows/pages-deploy.yml.hook @@ -1,29 +1,72 @@ -name: 'Automatic build' +name: "Build and deploy" on: push: branches: + - main - master paths-ignore: - .gitignore - README.md - 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: - continuous-delivery: - + build: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 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 uses: ruby/setup-ruby@v1 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 - - name: Deploy - run: bash tools/deploy.sh + - name: Build site + 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 diff --git a/tools/deploy.sh b/tools/deploy.sh deleted file mode 100755 index 5baba00..0000000 --- a/tools/deploy.sh +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash -# -# Build, test and then deploy the site content to 'origin/' -# -# 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/'" - echo - echo "Usage:" - echo - echo " bash ./tools/deploy.sh [options]" - echo - echo "Options:" - echo ' -c, --config "" 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 diff --git a/tools/test.sh b/tools/test.sh new file mode 100755 index 0000000..155df3e --- /dev/null +++ b/tools/test.sh @@ -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 "" 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