Deploy #27
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Deploy | |
# Define when the workflow should run | |
on: | |
# Allow manual triggering of the workflow from the Actions tab | |
workflow_dispatch: | |
# push: | |
# branches: | |
# - main | |
# Allow inputs to be passed when manually triggering the workflow from the Actions tab | |
inputs: | |
DOCKERFILE_NAME: | |
type: choice | |
description: 'Dockerfile' | |
required: true | |
options: ['cl_bootcamp_base','cl_bootcamp_advanced'] | |
default: 'cl_bootcamp_base' | |
DEPLOY_TO_GITHUB_PAGES: | |
type: boolean | |
description: 'Deploy to Github pages' | |
required: true | |
default: true | |
GITHUB_RELEASE: | |
type: boolean | |
description: 'Upload GitHub release' | |
required: true | |
default: false | |
jobs: | |
guard_clause: | |
runs-on: ubuntu-22.04 | |
env: | |
GH_TOKEN: ${{ github.token }} # As required by the GitHub-CLI | |
DOCKERFILE_PATH: dockerfiles/${{ github.event.inputs.DOCKERFILE_NAME }} | |
permissions: | |
actions: 'write' # Required in order to terminate the workflow run. | |
steps: | |
- uses: actions/checkout@v3 | |
# Guard clause that cancels the workflow in case of an invalid DOCKERFILE_PATH and/or incorrectly configured Github Pages. | |
# The main reason for choosing this workaround for aborting the workflow is the fact that it does not display the workflow as successful, which can set false expectations. | |
- name: DOCKERFILE_PATH. | |
shell: bash | |
run: | | |
# We check whether the Dockerfile_path is valid. | |
if [ ! -f $DOCKERFILE_PATH ]; then | |
echo "::error title=Invalid Dockerfile path::No file found at $DOCKERFILE_PATH" | |
echo "terminate=true" >> $GITHUB_ENV | |
fi | |
- name: Github Pages config guard clause | |
if: ${{ github.event.inputs.DEPLOY_TO_GITHUB_PAGES == 'true' }} | |
run: | | |
# We use the Github Rest api to get information regarding pages for the Github Repository and store it into a temporary file named "pages_response". | |
set +e | |
gh api \ | |
-H "Accept: application/vnd.github+json" \ | |
-H "X-GitHub-Api-Version: 2022-11-28" \ | |
/repos/${{ github.repository_owner }}/$(basename ${{ github.repository }})/pages > pages_response | |
# We make sure Github Pages has been enabled for this repository. | |
if [ "$?" -ne 0 ]; then | |
echo "::error title=Potential pages configuration error.::Please make sure you have enabled Github pages for the ${{ github.repository }} repository. If already enabled then Github pages might be down" | |
echo "terminate=true" >> $GITHUB_ENV | |
fi | |
set -e | |
# We make sure the Github pages build & deployment source is set to "workflow" (Github Actions). Instead of a "legacy" (branch). | |
if [[ "$(jq --compact-output --raw-output .build_type pages_response)" != "workflow" ]]; then | |
echo "Undefined behaviour, Make sure the Github Pages source is correctly configured in the Github Pages settings." | |
echo "::error title=Pages configuration error.::Please make sure you have correctly picked \"Github Actions\" as the build and deployment source for the Github Pages." | |
echo "terminate=true" >> $GITHUB_ENV | |
fi | |
rm pages_response | |
- name: Terminate run if error occurred. | |
run: | | |
if [[ $terminate == "true" ]]; then | |
gh run cancel ${{ github.run_id }} | |
gh run watch ${{ github.run_id }} | |
fi | |
build: | |
needs: guard_clause # Dependency | |
runs-on: ubuntu-22.04 # Image to run the worker on. | |
env: | |
TAG: "ext2-cl-bootcamp-base-image" # Tag of docker image. | |
DOCKERFILE_PATH: dockerfiles/${{ github.event.inputs.DOCKERFILE_NAME }} | |
DEPLOY_DIR: /cl_bootcamp_deploy/ # Path to directory where we host the final image from. | |
permissions: # Permissions to grant the GITHUB_TOKEN. | |
contents: write # Required permission to make a github release. | |
steps: | |
# Checks-out our repository under $GITHUB_WORKSPACE, so our job can access it | |
- uses: actions/checkout@v3 | |
- name: Get container2wasm | |
run: | | |
wget https://github.com/ktock/container2wasm/releases/download/v0.6.2/c2w-net-proxy.wasm | |
wget https://github.com/ktock/container2wasm/releases/download/v0.6.2/container2wasm-v0.6.2-linux-amd64.tar.gz | |
tar -zxvf container2wasm-v0.6.2-linux-amd64.tar.gz | |
chmod +x c2w | |
# Setting the IMAGENAME variable in GITHUB_ENV to <Dockerfile name>_<date>_<run_id>.ext2. | |
- name: Generate the image_name. | |
id: image_name_gen | |
run: echo "IMAGENAME=$(basename $DOCKERFILE_PATH)" >> $GITHUB_ENV | |
- name: Generate the image_file. | |
id: image_file_gen | |
run: echo "IMAGEFILE=${{ env.IMAGENAME }}_$(date +%Y%m%d)_$(date +"%H%M%S").wasm" >> $GITHUB_ENV | |
# Create directory to host the image from. | |
- run: sudo mkdir -p $DEPLOY_DIR | |
# Build Docker image. | |
- name: Build WASM image | |
run: | | |
chmod +x image_gen.sh | |
./image_gen.sh $IMAGENAME $IMAGEFILE | |
# Set up quarto | |
- name: Set up Quarto | |
uses: quarto-dev/quarto-actions/setup@v2 | |
# Render guides | |
- name: render guides | |
shell: bash | |
run: chmod +x render_guides.sh && ./render_guides.sh | |
- name: setup Node 16 | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 16 | |
- name: install xterm (and possibly plugins) | |
run: npm install --save xterm | |
# Move required files for gh-pages deployment to the deployment directory $DEPLOY_DIR. | |
- run: > | |
sudo mv | |
browser_wasi_shim guide node_modules | |
c2w-net-proxy.wasm coi-serviceworker.js | |
favicon.ico index.html main.css scrollbar.css | |
stack.js stack-worker.js wasi-util.js worker.js | |
worker-util.js ws-delegate.js $IMAGEFILE | |
$DEPLOY_DIR | |
- run: sudo mv dockerfiles/data $DEPLOY_DIR/data | |
# Create a gh-pages artifact in order to deploy to gh-pages. | |
- name: Upload GitHub Pages artifact | |
uses: actions/upload-pages-artifact@v2 | |
with: | |
# Path of the directory containing the static assets for our gh pages deployment. | |
path: ${{ env.DEPLOY_DIR }} # optional, default is _site/ | |
- name: github release # To upload our final ext2 image as a github release. | |
if: ${{ github.event.inputs.GITHUB_RELEASE == 'true' }} | |
uses: softprops/[email protected] | |
with: | |
target_commitish: ${{ github.sha }} # Last commit on the GITHUB_REF branch or tag | |
tag_name: CL-Bootcamp-WASM-Image | |
fail_on_unmatched_files: 'true' # Fail in case of no matches with the file(s) glob(s). | |
files: | # Assets to upload as release. | |
${{ env.DEPLOY_DIR }}/${{ env.IMAGEFILE }} | |
deploy_to_github_pages: # Job that deploys the github-pages artifact to github-pages. | |
if: ${{ github.event.inputs.DEPLOY_TO_GITHUB_PAGES == 'true' }} | |
needs: build | |
environment: | |
name: github-pages | |
url: ${{ steps.deployment.outputs.page_url }} | |
# Grant GITHUB_TOKEN the permissions required to make a Pages deployment | |
permissions: | |
pages: write # to deploy to Pages | |
id-token: write # to verify the deployment originates from an appropriate source | |
runs-on: ubuntu-latest | |
steps: | |
# Deployment to github pages | |
- name: Deploy GitHub Pages site | |
id: deployment | |
uses: actions/deploy-pages@v3 |