Skip to content
Merged
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
16 changes: 16 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file

version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
# Check for updates to GitHub Actions every day
interval: "daily"
time: "09:00"
timezone: "UTC"
assignees:
- "jimboid"
185 changes: 185 additions & 0 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
name: ci/cd
on:
pull_request:
repository_dispatch:
types: [build]
workflow_dispatch:

jobs:
build:
strategy:
fail-fast: false
matrix:
platform:
- linux/amd64
- linux/arm64
runs-on: ${{ matrix.platform == 'linux/amd64' && 'ubuntu-24.04' || matrix.platform == 'linux/arm64' && 'ubuntu-24.04-arm' }}
name: build ${{ matrix.platform }}
outputs:
tag: ${{ steps.envvars.outputs.tag }}
steps:
- name: checkout
uses: actions/[email protected]

- name: Prepare env
id: envvars
run: |
platform=${{ matrix.platform }}
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
if [ ${{ github.event.client_payload.tag }} != 'null' ]; then
echo "tag=${{ github.event.client_payload.tag }}" >> $GITHUB_OUTPUT
else
echo "tag=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
fi

- name: Metadata
id: meta
uses: docker/[email protected]
with:
images: ghcr.io/${{ vars.ORG_REPO }}/${{ github.event.repository.name }}

- name: Authenticate with GHCR
id: auth
uses: docker/[email protected]
with:
registry: ghcr.io
username: ${{github.actor}}
password: ${{secrets.BUILD_TOKEN}}

- name: Set up Docker Buildx
id: buildx
uses: docker/[email protected]

- name: Build and push by digest
id: build
uses: docker/[email protected]
with:
file: ./docker/Dockerfile
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
tags: ghcr.io/${{ vars.ORG_REPO }}/${{ github.event.repository.name }}
outputs: type=image,push-by-digest=true,name-canonical=true,push=true

- name: Export digest
run: |
mkdir -p ${{ runner.temp }}/digests
digest="${{ steps.build.outputs.digest }}"
touch "${{ runner.temp }}/digests/${digest#sha256:}"

- name: Upload digest
uses: actions/[email protected]
with:
name: digests-${{ env.PLATFORM_PAIR }}
path: ${{ runner.temp }}/digests/*
if-no-files-found: error
retention-days: 1

merge:
runs-on: ubuntu-24.04
name: merge into multiarch manifest
needs:
- build
steps:
- name: Download digests
uses: actions/[email protected]
with:
path: ${{ runner.temp }}/digests
pattern: digests-*
merge-multiple: true

- name: Authenticate with GHCR
id: auth
uses: docker/[email protected]
with:
registry: ghcr.io
username: ${{github.actor}}
password: ${{secrets.BUILD_TOKEN}}

- name: Set up Docker Buildx
id: buildx
uses: docker/[email protected]

- name: Metadata
id: meta
uses: docker/[email protected]
with:
images: ghcr.io/${{ vars.ORG_REPO }}/${{ github.event.repository.name }}
tags: dev

- name: Create manifest list and push
id: annotate
continue-on-error: true
working-directory: ${{ runner.temp }}/digests
run: |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
--annotation='index:org.opencontainers.image.description=${{ github.event.repository.description }}' \
--annotation='index:org.opencontainers.image.licenses=MIT' \
--annotation='index:org.opencontainers.image.created=${{ steps.timestamp.outputs.timestamp }}' \
--annotation='index:org.opencontainers.image.url=${{ github.event.repository.url }}' \
--annotation='index:org.opencontainers.image.source=${{ github.event.repository.url }}' \
$(printf 'ghcr.io/${{ vars.ORG_REPO }}/${{ github.event.repository.name }}@sha256:%s ' *)

- name: Create manifest list and push without annotations
if: steps.annotate.outcome == 'failure'
working-directory: ${{ runner.temp }}/digests
run: |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf 'ghcr.io/${{ vars.ORG_REPO }}/${{ github.event.repository.name }}@sha256:%s ' *)

- name: Inspect image
run: |
docker buildx imagetools inspect ghcr.io/${{ vars.ORG_REPO }}/${{ github.event.repository.name }}:dev

tests:
strategy:
fail-fast: false
matrix:
platform:
- linux/amd64
- linux/arm64
runs-on: ${{ matrix.platform == 'linux/amd64' && 'ubuntu-latest' || matrix.platform == 'linux/arm64' && 'ubuntu-24.04-arm' }}
name: testing on ${{ matrix.platform }}
timeout-minutes: 360
needs:
- build
- merge
steps:

- name: Test notebooks
shell: bash
run: |
docker run -t ghcr.io/${{ vars.ORG_REPO }}/${{ github.event.repository.name }}:dev bash -c " \
pip install pytest nbmake; \
find . -name '*.ipynb' | pytest --nbmake --nbmake-timeout=3600;"

tags:
runs-on: ubuntu-24.04
if: github.event_name != 'pull_request'
name: add tags
needs:
- build
- tests
steps:
- name: Authenticate with GHCR
id: auth
uses: docker/[email protected]
with:
registry: "ghcr.io"
username: ${{github.actor}}
password: ${{secrets.BUILD_TOKEN}}

- name: tag release versions
shell: bash
run: |
docker buildx imagetools create \
--tag ghcr.io/${{ vars.ORG_REPO }}/${{ github.event.repository.name }}:latest \
--tag ghcr.io/${{ vars.ORG_REPO }}/${{ github.event.repository.name }}:${{ needs.build.outputs.tag }} \
ghcr.io/${{ vars.ORG_REPO }}/${{ github.event.repository.name }}:dev

- name: Post version update to dash
uses: peter-evans/[email protected]
with:
token: ${{ secrets.BUILD_TOKEN }}
repository: jimboid/biosim-workshops-dash
event-type: build
client-payload: '{"repo": "${{ github.event.repository.name }}", "tag": "${{ needs.build.outputs.tag }}"}'
20 changes: 14 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
# clustering-workshop
# CCPBioSim Clustering Workshop

Cluster analysis is a popular and useful approach for the investigation and interpretation of molecular dynamics simulation data. This tutorial/workshop illustrates the application of a variety of clustering methods to an MD trajectory, comparing their performance.
[![build](https://github.com/ccpbiosim/clustering-workshop/actions/workflows/build.yaml/badge.svg?branch=main)](https://github.com/ccpbiosim/clustering-workshop/actions/workflows/build.yaml)

## Requirements
A basic knowledge of Python and MD simulation methods
## Docker

## Training material
A Jupyter notebook and associated data files
This container is derived from the CCPBioSim JupyterHub image. This container
adds the necessary software packages and notebook content to form a deployable
course container. The source content for this course can be found at
https://github.com/CCPBioSim/clustering-workshop

## How to Use

In our containers we are using the JupyterHub default port 8888, so you should
forward this port when deploying locally::

docker run -p 8888:8888 ghcr.io/jimboid/biosim-clustering-workshop:latest

## Contact
Please direct all comments and queries to [Charlie Laughton](mailto:[email protected])
29 changes: 29 additions & 0 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Start with BioSim base image.
ARG BASE_IMAGE=latest
FROM ghcr.io/ccpbiosim/jupyterhub-base:$BASE_IMAGE

LABEL maintainer="James Gebbie-Rayet <[email protected]>"
LABEL org.opencontainers.image.source=https://github.com/ccpbiosim/clustering-workshop
LABEL org.opencontainers.image.description="A container environment for the ccpbiosim workshop on Clustering."
LABEL org.opencontainers.image.licenses=MIT

# Switch to jovyan user.
USER $NB_USER
WORKDIR $HOME

# Install workshop deps
RUN conda install matplotlib numpy scipy ipywidgets -y
RUN pip install mdplus mdtraj rlcluster

# Get workshop files and move them to jovyan directory.
COPY --chown=1000:100 . .
RUN rm -rf requirements.txt AUTHORS LICENSE README.md docker .git .github

# Copy updated lab workspace
COPY --chown=1000:100 docker/default-37a8.jupyterlab-workspace /home/jovyan/.jupyter/lab/workspaces/default-37a8.jupyterlab-workspace

# UNCOMMENT THIS LINE FOR REMOTE DEPLOYMENT
COPY docker/jupyter_notebook_config.py /etc/jupyter/

# Always finish with non-root user as a precaution.
USER $NB_USER
1 change: 1 addition & 0 deletions docker/default-37a8.jupyterlab-workspace
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"data":{"layout-restorer:data":{"main":{"dock":{"type":"tab-area","currentIndex":0,"widgets":["notebook:Cluster Analysis.ipynb"]},"current":"notebook:Cluster Analysis.ipynb"},"left":{"collapsed":false,"current":"filebrowser","widgets":["filebrowser","running-sessions","@jupyterlab/toc:plugin","extensionmanager.main-view"]},"right":{"collapsed":true,"widgets":["jp-property-inspector"]}},"notebook:Cluster Analysis.ipynb":{"data":{"path":"Cluster Analysis.ipynb","factory":"Notebook"}}},"metadata":{"id":"default"}}
2 changes: 2 additions & 0 deletions docker/jupyter_notebook_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

c.JupyterHub.authenticator_class = 'tmpauthenticator.TmpAuthenticator'