Skip to content

Add MRSF NAMD, SOC-NAMD, and ESPF QM/MM dynamics #558

Add MRSF NAMD, SOC-NAMD, and ESPF QM/MM dynamics

Add MRSF NAMD, SOC-NAMD, and ESPF QM/MM dynamics #558

Workflow file for this run

name: Build and Push Multi-Platform Docker Image
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
env:
HAS_DOCKER_CREDENTIALS: ${{ secrets.DOCKER_USERNAME != '' && secrets.DOCKER_PASSWORD != '' }}
# Keep in sync with the FROM line in Dockerfile and docker/buildenv.Dockerfile.
BUILDENV_IMAGE: openqp/openqp-buildenv:1
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Set up Docker Buildx
id: setup-buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
if: github.event_name == 'push' && env.HAS_DOCKER_CREDENTIALS == 'true'
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
run: echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
# The build environment (toolchain, ILP64 OpenBLAS, Python deps) is a
# prebuilt image; pull it instead of reinstalling prerequisites on every
# run. Until the image has been published once (or right after a tag
# bump) the pull fails and we build it here; the next push-to-main run
# with Docker Hub credentials publishes it.
- name: Prepare build environment image
id: buildenv
run: |
if docker pull "${BUILDENV_IMAGE}"; then
echo "source=registry" >> "${GITHUB_OUTPUT}"
else
echo "::warning::${BUILDENV_IMAGE} not in registry; building it from docker/buildenv.Dockerfile"
docker build -t "${BUILDENV_IMAGE}" -f docker/buildenv.Dockerfile docker
echo "source=local" >> "${GITHUB_OUTPUT}"
fi
- name: Cache Docker build mounts
if: steps.buildenv.outputs.source == 'registry'
id: docker-cache-mounts
uses: actions/cache@v4
with:
path: docker-cache-mounts
key: docker-cache-mounts-${{ runner.os }}-${{ hashFiles('Dockerfile', 'pyproject.toml', 'external/CMakeLists.txt') }}
restore-keys: |
docker-cache-mounts-${{ runner.os }}-
- name: Restore Docker build mounts
if: steps.buildenv.outputs.source == 'registry'
uses: reproducible-containers/buildkit-cache-dance@v3
with:
builder: ${{ steps.setup-buildx.outputs.name }}
cache-dir: docker-cache-mounts
dockerfile: Dockerfile
skip-extraction: ${{ steps.docker-cache-mounts.outputs.cache-hit }}
- name: Build OpenQP image
if: steps.buildenv.outputs.source == 'registry'
uses: docker/build-push-action@v6
with:
context: .
tags: openqp/openqp:v1.0
load: true
# BuildKit's GitHub cache keeps source-independent Docker layers.
# actions/cache + buildkit-cache-dance above keep the pip/OpenQP
# externals cache mounts. pyproject.toml or external/CMakeLists.txt
# changes get a new mount-cache key and refresh subsequent builds.
cache-from: type=gha,scope=openqp-docker
cache-to: type=gha,mode=max,scope=openqp-docker
- name: Build OpenQP image with local buildenv fallback
if: steps.buildenv.outputs.source == 'local'
run: DOCKER_BUILDKIT=1 docker build -t openqp/openqp:v1.0 .
- name: Push images
if: github.event_name == 'push' && env.HAS_DOCKER_CREDENTIALS == 'true'
run: |
docker push "${BUILDENV_IMAGE}"
docker push openqp/openqp:v1.0