diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 0906ce6..9593f06 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -22,7 +22,7 @@ Please select the desired item checkbox and change it to "[x]", then delete opti Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration --> -- [ ] I have run `bash ./tools/deploy.sh --dry-run` (at the root of the project) locally and passed +- [ ] I have run `bash ./tools/test.sh` (at the root of the project) locally and passed - [ ] I have tested this feature in the browser ### Test Configuration 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/_posts/2019-08-09-getting-started.md b/_posts/2019-08-09-getting-started.md index 33366b8..50b26a0 100644 --- a/_posts/2019-08-09-getting-started.md +++ b/_posts/2019-08-09-getting-started.md @@ -113,8 +113,6 @@ Quickly check the files needed for GitHub Actions build: - Ensure your Jekyll site has the file `.github/workflows/pages-deploy.yml`{: .filepath}. Otherwise, create a new one and fill in the contents of the [sample file][workflow], and the value of the `on.push.branches` should be the same as your repo's default branch name. -- Ensure your Jekyll site has file `tools/deploy.sh`{: .filepath}. Otherwise, copy it from here to your Jekyll site. - - Furthermore, if you have committed `Gemfile.lock`{: .filepath} to the repo, and your runtime system is not Linux, don't forget to update the platform list in the lock file: ```console @@ -123,13 +121,11 @@ Quickly check the files needed for GitHub Actions build: After the above steps, rename your repository to `.github.io` on GitHub. -Now publish your Jekyll site by: +Now publish your Jekyll site: -1. Push any commit to remote to trigger the GitHub Actions workflow. Once the build is complete and successful, a new remote branch named `gh-pages` will appear to store the built site files. +1. Browse to your repository on GitHub. Select the tab _Settings_, then click _Pages_ in the left navigation bar. Then, in the **Source** section (under _Build and deployment_), select [**GitHub Actions**][pages-workflow-src] from the dropdown menu. -2. Browse to your repository on GitHub. Select the tab _Settings_, then click _Pages_ in the left navigation bar, and then in the section **Source** of _GitHub Pages_, select the `/(root)` directory of branch `gh-pages` as the [publishing source][pages-src]. Remember to click Save before leaving. - - ![gh-pages-sources](/posts/20190809/gh-pages-sources.png){: width="1580" height="250" } +2. Push any commit to remote to trigger the GitHub Actions workflow. In the _Actions_ tab of your repository, you should see the "Automatic build and deploy" workflow with at least one job running. Once the build is complete and successful, the site should be deployed automatically. 3. Visit your website at the address indicated by GitHub. @@ -182,5 +178,5 @@ The merge is likely to conflict with your local modifications. Please be patient [use-starter]: https://github.com/cotes2020/chirpy-starter/generate [workflow]: https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/.github/workflows/pages-deploy.yml.hook [chirpy-4.1.0]: https://github.com/cotes2020/jekyll-theme-chirpy/releases/tag/v4.1.0 -[pages-src]: https://docs.github.com/en/github/working-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site +[pages-workflow-src]: https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site#publishing-with-a-custom-github-actions-workflowconfiguring-a-publishing-source-for-your-github-pages-site [latest-tag]: https://github.com/cotes2020/jekyll-theme-chirpy/tags 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