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