# Analysis preservation workshop solutions
## Docker
### python3.11 (easy)
```
docker pull python:3.11.1-bullseye
```
then run it and do something like `import tomllib` to confirm that you have python3.11
### python3.11 (intermediate)
Dockerfile:
```
FROM python:3.11.1-bullseye
RUN pip install --no-cache-dir -q uproot
WORKDIR /home/docker
```
then
```
docker build -f py311_dockerfile -t py311_dockerfile:latest .
```
#### Option 1
Create `requirements.txt` with e.g., `uproot` in it
then
```
FROM python:3.11.1-bullseye
COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -q -r requirements.txt
WORKDIR /home/docker
```
## Singularity
### Doing the same as with docker (interactively)
This is basically [this exercise from the training](https://hsf-training.github.io/hsf-training-singularity-webpage/04-building-containers/index.html#execute-python-with-pyroot-available)
### Doing the same as with docker (definition file)
```
BootStrap: docker
From: python:3.11
%post
pip install uproot
%runscript
python -c "import uproot; print(uproot.__version__)"
```
### CMS example analysis
Perform the CMS example analysis in a single execution using a definition file. Save the plots in the execution directory.
```
BootStrap: docker
From: rootproject/root:6.22.06-conda
%post
# Save the files for the analysis in a top-level dir
mkdir /analysis
git clone https://github.com/hsf-training/hsf-training-cms-analysis.git /analysis
%environment
# Not mandatory, but for example you can define where to store files
# (Remember that $HOME is shared with the host by default)
export SKIMS_DIR=$HOME/analysis_tmp/skims
%runscript
# Create the file to store the skims
mkdir -p $SKIMS_DIR
# Move the analysis files to local dir (required for compile)
cp /analysis/* .
# Run the skims
bash skim.sh root://eospublic.cern.ch//eos/root-eos/HiggsTauTauReduced/ $SKIMS_DIR
# Get the histograms
mkdir -p histograms
bash histograms.sh $SKIMS_DIR histograms/
# Produce the plots
mkdir -p plots
bash plot.sh histograms/histograms.root plots
%labels
Author HSFTraining
Version v1
%help
Example container running the CMS analysis example.
Execute with the HOME shared with the host to save the skimmed files.
```
Then
```bash
singularity build --fakeroot awesome_analysis.sif awesome_analysis.def
```
### Jupyter notebooks
```
```
## CI/CD
### From zero to hero
A few things to remember:
* Don't forget to install `pytest` in the action
* Add a `.gitignore` to avoid tracking cache files while local testing
* [Full repository for GHA](https://github.com/hsf-training/hsf-training-minimal-github-actions-pytest)
* [Full repository for gitlab](https://gitlab.com/klieret/hsf-training-minimal-gitlab-ci-pytest)
### LaTeX documents (GHA only)
* Use https://github.com/xu-cheng/latex-action
* Example: [kilian's ICSC lecture](https://github.com/klieret/icsc-paradigms-and-patterns/blob/master/.github/workflows/workflow.yml)
### Build docker container (GHA)
Build a docker container in GitHub Actions using the [appropriate action](https://github.com/marketplace/actions/build-and-push-docker-images).
* [Full repository for GHA](https://github.com/hsf-training/hsf-training-minimal-github-actions-docker-build-push)