Skip to content

Commit

Permalink
Add container runtime and developer environment
Browse files Browse the repository at this point in the history
Publish runtime container
Update devcontainer to build and run C++ applictions
Create full local eiger deployment
Add development quickstart guide to README
Add verbose build
Add launch configs
  • Loading branch information
GDYendell committed Aug 29, 2024
1 parent 342d65a commit d787759
Show file tree
Hide file tree
Showing 33 changed files with 1,196 additions and 55 deletions.
51 changes: 30 additions & 21 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,46 +1,55 @@
// For format details, see https://containers.dev/implementors/json_reference/
{
"name": "Python 3 Developer Container",
"name": "eiger-detector devcontainer",
"build": {
"dockerfile": "../Dockerfile",
"context": "..",
"target": "developer"
},
"remoteEnv": {
// Allow X11 apps to run inside the container
"DISPLAY": "${localEnv:DISPLAY}"
"features": {
// add quality of life features for developers including git config integration
// note this is slow for the odin-data container - leaving out for now
"ghcr.io/devcontainers/features/common-utils:2": {
// don't upgrade to make this similar to the runtime container
"upgradePackages": false
}
},
// IMPORTANT for this devcontainer to work with docker VSCODE_REMOTE_USER must be
// set to vscode. You will run as vscode with full sudo rights.
// For podman it should be left blank. You will run as root but host mounts
// will be owned by your user.
"remoteUser": "${localEnv:VSCODE_REMOTE_USER}",
"customizations": {
"vscode": {
// Set *default* container specific settings.json values on container create.
"settings": {
"python.defaultInterpreterPath": "/venv/bin/python"
},
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"ms-python.python",
"github.vscode-github-actions",
"ms-python.vscode-pylance",
"tamasfe.even-better-toml",
"redhat.vscode-yaml",
"ryanluker.vscode-coverage-gutters",
"epicsdeb.vscode-epics",
"charliermarsh.ruff",
"ms-azuretools.vscode-docker"
"ms-vscode.cmake-tools",
"ms-vscode.cpptools"
]
}
},
"features": {
// Some default things like git config
"ghcr.io/devcontainers/features/common-utils:2": {
"upgradePackages": false
}
},
// You can place any outside of the container before-launch commands here
"initializeCommand": "bash .devcontainer/initializeCommand ${devcontainerId}",
// One time global setup commands inside the container
"postCreateCommand": "bash .devcontainer/postCreateCommand ${devcontainerId}",
"runArgs": [
// Allow the container to access the host X11 display and EPICS CA
"--net=host",
// Make sure SELinux does not disable with access to host filesystems like tmp
// Make sure SELinux does not disable write access to host filesystems like tmp
"--security-opt=label=disable"
],
// Mount the parent as /workspaces so we can pip install peers as editable
// Mount the parent of the project folder so we can access peer projects
"workspaceMount": "source=${localWorkspaceFolder}/..,target=/workspaces,type=bind",
// After the container is created, install the python project in editable form
"postCreateCommand": "pip install $([ -f dev-requirements.txt ] && echo '-c dev-requirements.txt') -e './python[dev]' && pre-commit install"
// mount in other useful files from the host
"mounts": [
// add extra mounts below
// "source=${localWorkspaceFolder},target=/odin-data,type=bind"
"source=/dev/shm,target=/dev/shm,type=bind"
]
}
6 changes: 6 additions & 0 deletions .devcontainer/initializeCommand
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/bin/bash

# custom initialization goes here - runs outside of the dev container
# just before the container is launched but after the container is created

echo "devcontainerID ${1}"
28 changes: 28 additions & 0 deletions .devcontainer/postCreateCommand
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/bin/bash

# Custom initialization goes here if needed.
# Runs inside the dev container after the container is created

################################################################################
# When using docker we will not be root inside the container
# You may wish to change ownership of files you want the user to modify
################################################################################

# if [[ $USER != "root" ]] ; then
# # make sure the non-root user can build iocs and (mounted in) support modules
# # sudo chown -R ${USER}:${USER} add_folders_here_if needed
# fi

################################################################################
# Shell customizations for Generic IOC devcontainers
################################################################################

# pick a zsh theme that does not cause completion corruption in zsh vscode terminals
sed -i $HOME/.zshrc -e 's/ZSH_THEME="devcontainers"/ZSH_THEME="dst"/'

# allow personalization of all devcontainers in this subdirectory
# by placing a .devcontainer_rc file in the workspace root
if [[ -f /workspaces/.devcontainer_rc ]] ; then
source /workspaces/.devcontainer_rc
fi

10 changes: 10 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
.dockerignore

external
*build*
*prefix*
*.pyc
venv*
*.egg-info

docs/build/
92 changes: 92 additions & 0 deletions .github/workflows/container.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
name: Container CI

on:
push:
pull_request:

jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write

steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0 # All history

- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Log in to GitHub Docker Registry
if: github.event_name != 'pull_request'
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1

- name: Build image
uses: docker/build-push-action@v4
with:
context: .
file: Dockerfile
target: runtime
push: false
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache

- name: Create tags for developer image
id: meta-developer
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}-developer
tags: |
type=ref,event=tag
type=raw,value=latest
- name: Push developer image
if: ${{ github.event_name == 'push' && github.ref_type == 'tag' }}
uses: docker/build-push-action@v4
with:
context: .
file: Dockerfile
target: developer
tags: ${{ steps.meta-developer.outputs.tags }}
labels: ${{ steps.meta-developer.outputs.labels }}
push: ${{ github.event_name != 'pull_request' }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache

- name: Create tags for runtime image
id: meta-runtime
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}-runtime
tags: |
type=ref,event=tag
type=raw,value=latest
- name: Push runtime image
if: ${{ github.event_name == 'push' && github.ref_type == 'tag' }}
uses: docker/build-push-action@v4
with:
context: .
file: Dockerfile
target: runtime
tags: ${{ steps.meta-runtime.outputs.tags }}
labels: ${{ steps.meta-runtime.outputs.labels }}
push: ${{ github.event_name != 'pull_request' }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
93 changes: 93 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Odin Control",
"type": "debugpy",
"request": "launch",
"module": "odin.main",
"justMyCode": false,
"console": "integratedTerminal",
"args": ["--config", "${workspaceFolder}/deploy/odin_server.cfg", "--logging", "info"]
},
{
"name": "Meta Writer",
"type": "debugpy",
"request": "launch",
"module": "odin_data.meta_writer.meta_writer_app",
"justMyCode": false,
"console": "integratedTerminal",
"args": [
"--writer", "eiger_detector.EigerMetaWriter",
"--sensor-shape", "4362", "4148",
"--data-endpoints", "tcp://127.0.0.1:10008,tcp://127.0.0.1:10018,tcp://127.0.0.1:10028,tcp://127.0.0.1:10038"
]
},
{
"name": "Debug Unit Test",
"type": "debugpy",
"request": "launch",
"justMyCode": false,
"program": "${file}",
"purpose": [
"debug-test"
],
"console": "integratedTerminal",
"env": {
// Enable break on exception when debugging tests (see: tests/conftest.py)
"PYTEST_RAISE": "1",
},
},
{
"name": "Eiger Fan",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/vscode_build/bin/eigerfan",
"args": ["--addr", "127.0.0.1", "--consumers", "4", "--sockets", "4", "--blocksize", "1000", "--threads", "2"],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
},
{
"name": "FrameProcessor",
"type": "cppdbg",
"request": "launch",
"program": "/odin/bin/frameProcessor",
"args": ["--ctrl", "tcp://0.0.0.0:10004", "--config", "${workspaceFolder}/deploy/fp1.json"],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [{"name": "HDF5_PLUGIN_PATH", "value": "/odin/h5plugin"}],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
},
],
}
21 changes: 21 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"cmake.generator": "Unix Makefiles",
"cmake.sourceDirectory": "${workspaceFolder}/cpp",
"cmake.buildDirectory": "${workspaceFolder}/vscode_build",
"cmake.installPrefix": "/odin",
"cmake.configureArgs": [
"-DODINDATA_ROOT_DIR=/odin"
],
"cmake.buildArgs": ["VERBOSE=1"],
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
"editor.formatOnSave": true,
"[python]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit"
},
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.rulers": [
88
]
},
}
58 changes: 31 additions & 27 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,27 +1,31 @@
# The devcontainer should use the developer target and run as root with podman
# or docker with user namespaces.
ARG PYTHON_VERSION=3.11
FROM python:${PYTHON_VERSION} as developer

# Add any system dependencies for the developer/build environment here
RUN apt-get update && apt-get install -y --no-install-recommends \
graphviz \
&& rm -rf /var/lib/apt/lists/*

# Set up a virtual environment and put it in PATH
RUN python -m venv /venv
ENV PATH=/venv/bin:$PATH

# The build stage installs the context into the venv
FROM developer as build
COPY . /context
WORKDIR /context
RUN pip install ./python

# The runtime stage copies the built venv into a slim runtime container
FROM python:${PYTHON_VERSION}-slim as runtime
# Add apt-get system dependecies for runtime here if needed
COPY --from=build /venv/ /venv/
ENV PATH=/venv/bin:$PATH

ENTRYPOINT ["bash"]
FROM ghcr.io/odin-detector/odin-data-build:1.10.1-fastcs-dev3 AS developer

FROM developer AS build

# Root of eiger-detector
COPY . /odin/eiger-detector

# C++
WORKDIR /odin/eiger-detector
RUN mkdir -p build && cd build && \
cmake -DCMAKE_INSTALL_PREFIX=/odin -DODINDATA_ROOT_DIR=/odin ../cpp && \
make -j8 VERBOSE=1 && \
make install

# Python
WORKDIR /odin/eiger-detector/python
RUN python -m pip install .[sim]

FROM ghcr.io/odin-detector/odin-data-runtime:1.10.1-fastcs-dev3 AS runtime

COPY --from=build /odin /odin
COPY --from=build /venv /venv
COPY deploy /odin/eiger-deploy

RUN rm -rf /odin/eiger-detector

ENV PATH=/odin/bin:/odin/venv/bin:$PATH

WORKDIR /odin

CMD ["sh", "-c", "cd /odin/eiger-deploy && zellij --layout ./layout.kdl"]
Loading

0 comments on commit d787759

Please sign in to comment.