Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes #23 Deploy site for each git branch #170

Open
wants to merge 2 commits into
base: hakyll
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# EditorConfig helps maintain consistent coding styles for multiple developers working on the same project across various editors and IDEs.
# More: https://editorconfig.org/

root = true

[*]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true
charset = utf-8
end_of_line = lf

[Makefile]
indent_style = tab
17 changes: 17 additions & 0 deletions .github/workflows/branch-deleted.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: Branch Deleted

on: delete

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
ref: hakyll

- name: Remove deployment for deleted branch
run: |
./.github/workflows/deployment/delete.sh ${{ github.event.ref }}
53 changes: 53 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: Build

on:
push:
branches-ignore:
- gh-pages
pull_request:
branches-ignore:
- gh-pages

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
build:
runs-on: ubuntu-latest

strategy:
matrix:
stack: ["2.7.3"]
ghc: ["8.10.7"]

steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
with:
fetch-depth: 0

- uses: haskell/actions/setup@v1
name: Setup Haskell Stack
with:
ghc-version: ${{ matrix.ghc }}
stack-version: ${{ matrix.stack }}

- uses: actions/cache@v1
name: Cache ~/.stack
with:
path: ~/.stack
key: ${{ runner.os }}-${{ matrix.ghc }}-stack

- name: Build dependencies
run: stack build --system-ghc --only-dependencies

- name: Build site
run: |
stack build --system-ghc
stack exec --system-ghc site rebuild

- name: Deploy site
run: |
if [[ ! -z $GITHUB_HEAD_REF ]]; then echo "Skip this step for pull request"; exit 0; fi;
./.github/workflows/deployment/deploy.sh
59 changes: 59 additions & 0 deletions .github/workflows/deployment/commons.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#!/usr/bin/env bash

export repo_root_dir=$(git rev-parse --show-toplevel)
export site_src="${repo_root_dir}/_site"
export gh_pages_dir="${repo_root_dir}/docs"
export deployments_dir="${gh_pages_dir}/branches"

# Site built from the main branch will be available at 'https://<domain_name>/'.
# Sites built from other branchs will be available at 'https://<domain_name>/branches/<branch_name>'.
export main_git_branch="hakyll"

# replace "/", "#", etc with "-".
slugify() {
echo "$1" | iconv -c -t ascii//TRANSLIT | sed -E 's/[~^]+/-/g' | sed -E 's/[^a-zA-Z0-9]+/-/g' | sed -E 's/^-+|-+$/-/g' | tr A-Z a-z
}
export -f slugify

git config user.name github-actions
git config user.email [email protected]

update_deployments_list() {
github_project_url=$(git remote get-url origin)
if [[ $github_project_url == [email protected]:* ]]; then
github_repo=$(echo ${github_project_url#"[email protected]:"} | sed 's/\.git$//g')
elif [[ $github_project_url == https://github.com/* ]]; then
github_repo=$(echo ${github_project_url#"https://github.com/"} | sed 's/\.git$//g' | sed 's/^\/\///g')
fi

github_repo_owner=$(echo "${github_repo}" | sed 's/\/.*$//g')
github_repo_name=$(echo "${github_repo}" | sed 's/^.*\///g')

deployments_list="DEPLOYMENTS.md"
echo "Updating ${deployments_list}"
rm $deployments_list

# Create a markdown table
touch $deployments_list
echo "# Deployments" >>$deployments_list
echo "" >>$deployments_list
echo "| Branch | Link |" >>$deployments_list
echo "| --- | --- |" >>$deployments_list

main_deployment_url="https://${github_repo_owner}.github.io/${github_repo_name}/"
echo "| [${main_git_branch}](https://github.com/${github_repo_owner}/${github_repo_name}/tree/${branch}) | [Open](${main_deployment_url}) |" >>$deployments_list

remote_branches=$(git ls-remote --heads origin | sed 's?.*refs/heads/??' | grep -v "gh-pages" | grep -v "${main_git_branch}")
echo "$remote_branches" | while IFS= read -r branch; do
branch_slug=$(slugify $branch)
deployment_url="https://${github_repo_owner}.github.io/${github_repo_name}/branches/${branch_slug}"
echo "| [${branch}](https://github.com/${github_repo_owner}/${github_repo_name}/tree/${branch}) | [Open](${deployment_url}) |" >>$deployments_list
done

# Update gh-pages branch
git add --all
git commit --allow-empty -m "Update ${deployments_list} [ci skip]"
git push --force origin gh-pages
}

export -f update_deployments_list
22 changes: 22 additions & 0 deletions .github/workflows/deployment/delete.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#!/usr/bin/env bash

# Remove deployment by specified git branch name.

set -eo pipefail

script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
source $script_dir/commons.sh

git checkout gh-pages
git pull origin gh-pages

branch_slug=$(slugify $1)
rm -rf "$deployments_dir/$branch_slug"

echo "Updating gh-pages branch."
git add --all
git commit --allow-empty -m "Delete '$1' branch deployment [ci skip]"
git push --force origin gh-pages
echo "Deployment for branch '$1' has been deleted."

update_deployments_list
57 changes: 57 additions & 0 deletions .github/workflows/deployment/deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/usr/bin/env bash

# Deploy static site to the GitHub pages.

set -eo pipefail

script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
source $script_dir/commons.sh

deploy() {
if [[ ! -z "$GITHUB_REF_NAME" ]]; then
# The GITHUB_REF_NAME env variable is available in github actions.
git_branch=$GITHUB_REF_NAME
else
git_branch=$(git branch --show-current)
fi
echo "Current git branch is '${git_branch}'."

git checkout gh-pages
git pull origin gh-pages

if [ "$git_branch" == "$main_git_branch" ]; then
site_dest="${gh_pages_dir}"

# Create temporary backup for other branches content.
mv "${deployments_dir}" .

# Replace site files.
rm -rf "${site_dest}"
mkdir -p "${site_dest}"
cp -a -v ${site_src}/* ${site_dest}/

# Restore temporary backup for other branches content.
mv ./branches "${gh_pages_dir}/"
else
# Patch html files to tell search engine bots like google-bot not to index this content.
# More info: https://developers.google.com/search/docs/advanced/crawling/block-indexing
find $site_src -name '*.html' -exec sed -i 's/<head>/<head><meta name="robots" content="noindex, nofollow">/g' {} \;

branch_slug=$(slugify $git_branch)
site_dest="${gh_pages_dir}/branches/${branch_slug}"

# Replace site files.
rm -rf "${site_dest}"
mkdir -p "${site_dest}"
cp -a -v ${site_src}/* ${site_dest}/
fi

echo "Updating gh-pages branch."
git add --all
git commit --allow-empty -m "Update '${git_branch}' branch deployment [ci skip]"
git push --force origin gh-pages
echo "Deployment finished."
}

deploy
update_deployments_list
68 changes: 0 additions & 68 deletions .github/workflows/main.yml

This file was deleted.

23 changes: 22 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ This repository is for the [haskell.foundation](https://haskell.foundation) webs
- [Table Of Contents](#table-of-contents)
- [Building](#building)
- [CI](#ci)
- [Deployment](#deployment)
- [PRs deployment](#prs-deployment)
- [License](#license)


## Building

To build the project:
Expand Down Expand Up @@ -50,6 +51,26 @@ The general steps are:
7. Copy the `_site` directory over the `main` branch contents
8. Commit and push the site contents to the `main` branch.

## Deployment

[Available Deployments](https://github.com/haskellfoundation/haskellfoundation.github.io/blob/gh-pages/DEPLOYMENTS.md)

Deployment is automated for branches in the original repository.

### PRs deployment

When you are submitting a PR, it's a good practice to provide a link to a running website demo.

First you should enable GitHub pages for you forked repository.

<img width="949" alt="Screen Shot 2021-12-29 at 10 28 32 PM" src="https://user-images.githubusercontent.com/9302460/147704755-d9bc8c08-7272-4c55-b88f-34b3aefd0c1e.png">

Then you should manually trigger a build for your branch in your forker repository.

<img width="988" alt="Screen Shot 2021-12-29 at 10 25 19 PM" src="https://user-images.githubusercontent.com/9302460/147704589-8bce2b51-cedc-4e8a-9aec-33574b2d2c02.png">

At first time it can take a while because there is no cache for Hakyll dependencies at your GitHub actions runner yet. You can attach a link to running CI job to the PR and go drink coffee.

## License

This site is open source, and covered under the Apache 2.0 license.
4 changes: 2 additions & 2 deletions donations/sponsors/flipstone.markdown
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: FlipStone
logo: /assets/images/sponsors/flipstone/flipstone-683.png
srcset: /assets/images/sponsors/flipstone/flipstone-200.png 200w, /assets/images/sponsors/flipstone/flipstone-400.png 400w, /assets/images/sponsors/flipstone/flipstone-683.png 683w
logo: ./assets/images/sponsors/flipstone/flipstone-683.png
srcset: ./assets/images/sponsors/flipstone/flipstone-200.png 200w, ./assets/images/sponsors/flipstone/flipstone-400.png 400w, ./assets/images/sponsors/flipstone/flipstone-683.png 683w
externalUrl: https://flipstone.com/
level: Functor
---
4 changes: 2 additions & 2 deletions donations/sponsors/github.markdown
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: GitHub
logo: /assets/images/sponsors/github/github-683.png
srcset: /assets/images/sponsors/github/github-200.png 200w, /assets/images/sponsors/github/github-400.png 400w, /assets/images/sponsors/github/github-683.png 683w
logo: ./assets/images/sponsors/github/github-683.png
srcset: ./assets/images/sponsors/github/github-200.png 200w, ./assets/images/sponsors/github/github-400.png 400w, ./assets/images/sponsors/github/github-683.png 683w
externalUrl: https://github.com/
level: Monad
---
4 changes: 2 additions & 2 deletions donations/sponsors/iohk.markdown
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: IOHK
logo: /assets/images/sponsors/iohk/iohk-683.png
srcset: /assets/images/sponsors/iohk/iohk-200.png 200w, /assets/images/sponsors/iohk/iohk-400.png 400w, /assets/images/sponsors/iohk/iohk-683.png 683w
logo: ./assets/images/sponsors/iohk/iohk-683.png
srcset: ./assets/images/sponsors/iohk/iohk-200.png 200w, ./assets/images/sponsors/iohk/iohk-400.png 400w, ./assets/images/sponsors/iohk/iohk-683.png 683w
externalUrl: https://iohk.io/
level: Monad
---
4 changes: 2 additions & 2 deletions donations/sponsors/obsidian.markdown
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Obsidian Systems
logo: /assets/images/sponsors/obsidian-systems/obsidian-systems-683.png
srcset: /assets/images/sponsors/obsidian-systems/obsidian-systems-200.png 200w, /assets/images/sponsors/obsidian-systems/obsidian-systems-400.png 400w, /assets/images/sponsors/obsidian-systems/obsidian-systems-683.png 683w
logo: ./assets/images/sponsors/obsidian-systems/obsidian-systems-683.png
srcset: ./assets/images/sponsors/obsidian-systems/obsidian-systems-200.png 200w, ./assets/images/sponsors/obsidian-systems/obsidian-systems-400.png 400w, ./assets/images/sponsors/obsidian-systems/obsidian-systems-683.png 683w
externalUrl: https://obsidian.systems/
level: Applicative
---
4 changes: 2 additions & 2 deletions donations/sponsors/tweag.markdown
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Tweag
logo: /assets/images/sponsors/tweag/tweag-683.png
srcset: /assets/images/sponsors/tweag/tweag-200.png 200w, /assets/images/sponsors/tweag/tweag-400.png 400w, /assets/images/sponsors/tweag/tweag-683.png 683w
logo: ./assets/images/sponsors/tweag/tweag-683.png
srcset: ./assets/images/sponsors/tweag/tweag-200.png 200w, ./assets/images/sponsors/tweag/tweag-400.png 400w, ./assets/images/sponsors/tweag/tweag-683.png 683w
externalUrl: https://tweag.io/
level: Applicative
---
4 changes: 2 additions & 2 deletions donations/sponsors/welltyped.markdown
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Well-Typed
logo: /assets/images/sponsors/well-typed/well-typed-683.png
srcset: /assets/images/sponsors/well-typed/well-typed-200.png 200w, /assets/images/sponsors/well-typed/well-typed-400.png 400w, /assets/images/sponsors/well-typed/well-typed-683.png 683w
logo: ./assets/images/sponsors/well-typed/well-typed-683.png
srcset: ./assets/images/sponsors/well-typed/well-typed-200.png 200w, ./assets/images/sponsors/well-typed/well-typed-400.png 400w, ./assets/images/sponsors/well-typed/well-typed-683.png 683w
externalUrl: https://well-typed.com/
level: Applicative
---