Skip to content

Commit

Permalink
Revert "test no docker (#250)"
Browse files Browse the repository at this point in the history
This reverts commit f35fabb.
  • Loading branch information
sosiristseng committed Oct 14, 2024
1 parent c56ce9a commit c175364
Show file tree
Hide file tree
Showing 7 changed files with 109 additions and 83 deletions.
3 changes: 3 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.git/
.cache/
.github/workflows
6 changes: 6 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,9 @@ updates:
directory: "/"
schedule:
interval: daily
- package-ecosystem: docker
directory: "/"
schedule:
interval: daily
labels:
- automerge
115 changes: 44 additions & 71 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,59 +14,34 @@ concurrency:
env:
ALLOWERRORS: 'false'
NBCACHE: '.cache'
JULIA_CONDAPKG_BACKEND: 'Null'
JULIA_NUM_THREADS: 'auto'
JULIA_CI: 'true'
UV_SYSTEM_PYTHON: 1

jobs:
setup:
permissions:
packages: write
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
hash: ${{ steps.hash.outputs.value }}
ver: ${{ steps.hash.outputs.ver }}
hash: ${{ steps.img.outputs.hash }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
id: setup-python
with:
python-version: '3.x'
- name: Read Julia version
uses: SebRollen/[email protected]
id: read_toml
with:
file: 'Manifest.toml'
field: 'julia_version'
- name: Setup Julia
uses: julia-actions/setup-julia@v2
- name: Login to ghcr.io
uses: docker/login-action@v3
with:
version: ${{ steps.read_toml.outputs.value }}
- name: Get environment hash
id: hash
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ github.token }}
- name: Get docker image hash
id: img
run: echo "hash=${{ hashFiles('requirements.txt', 'Project.toml', 'Manifest.toml', 'src/**', 'env.Dockerfile') }}" >> "$GITHUB_OUTPUT"
- name: Build Docker container
env:
IMG: ghcr.io/${{ github.repository }}:${{ steps.img.outputs.hash }}
run: |
echo "value=${{ hashFiles('Project.toml', 'Manifest.toml', 'src/**') }}" >> "$GITHUB_OUTPUT"
echo "ver=${{ runner.os }}-julia-${{ steps.read_toml.outputs.value }}" >> "$GITHUB_OUTPUT"
- name: Cache Julia packages
if: ${{ contains(runner.name, 'GitHub Actions') }}
uses: actions/cache@v4
id: cache-julia
with:
path: ~/.julia
key: ${{ steps.hash.outputs.ver }}-${{ steps.hash.outputs.value }}
restore-keys: |
${{ steps.hash.outputs.ver }}-
- name: Install Julia packages
if: ${{ runner.environment == 'self-hosted' || steps.cache-julia.outputs.cache-hit != 'true' }}
shell: julia --color=yes {0}
run: |
using Pkg
Pkg.add(["IJulia", "Literate", "JSON"])
Pkg.activate(".")
Pkg.instantiate()
Pkg.precompile()
docker manifest inspect ${IMG} && exit 0
docker build -f env.Dockerfile -t ${IMG} .
docker push ${IMG}
- name: List notebooks as a JSON array
id: set-matrix
run: echo "matrix=$(python -c 'import glob, json; print(json.dumps(glob.glob("**/*.ipynb", root_dir="docs", recursive=True) + glob.glob("**/*.jl", root_dir="docs",recursive=True)))')" >> "$GITHUB_OUTPUT"
Expand All @@ -81,6 +56,7 @@ jobs:
runs-on: ubuntu-latest
env:
NB: docs/${{ matrix.notebook }}
IMG: ghcr.io/${{ github.repository }}:${{ needs.setup.outputs.hash }}
steps:
- name: Checkout
uses: actions/checkout@v4
Expand All @@ -89,39 +65,35 @@ jobs:
id: nb-cache
with:
path: ${{ env.NBCACHE }}
key: ${{ needs.setup.outputs.ver }}-${{ needs.setup.outputs.hash }}-${{ hashFiles(env.NB) }}
- name: Setup Python
uses: actions/setup-python@v5
if: ${{ steps.nb-cache.outputs.cache-hit != 'true' }}
with:
python-version: '3.x'
- name: Install uv
key: ${{ runner.os }}-notebook-${{ hashFiles(env.NB) }}-${{ needs.setup.outputs.hash }}
- name: Pull docker image
if: ${{ steps.nb-cache.outputs.cache-hit != 'true' }}
run: curl -LsSf https://astral.sh/uv/install.sh | sh
- name: Install Python dependencies
if: ${{ steps.nb-cache.outputs.cache-hit != 'true' }}
run: uv pip install -r requirements.txt
- name: Read Julia version
run: |
docker pull ${{ env.IMG }}
docker images ${{ env.IMG }}
- name: Execute notebook
if: ${{ steps.nb-cache.outputs.cache-hit != 'true' }}
uses: SebRollen/[email protected]
id: read_toml
with:
file: 'Manifest.toml'
field: 'julia_version'
- name: Setup Julia
run: >
docker run -w /tmp -v ${{ github.workspace }}:/tmp
-e NB=${{ env.NB }}
-e NBCACHE=${{ env.NBCACHE }}
-e WORKSPACE=${{ github.workspace }}
-e ALLOWERRORS=${{ env.ALLOWERRORS }}
${{ env.IMG }}
julia execute.jl
- name: Claim output cache folder
run: |
sudo chown -R $USER ${{ env.NBCACHE }}
ls -R ${{ env.NBCACHE }}
- name: Cache notebook
uses: actions/cache/save@v4
if: ${{ steps.nb-cache.outputs.cache-hit != 'true' }}
uses: julia-actions/setup-julia@v2
with:
version: ${{ steps.read_toml.outputs.value }}
- name: Restore Julia packages
if: ${{ runner.environment == 'github-hosted' && steps.nb-cache.outputs.cache-hit != 'true'}}
uses: actions/cache@v4
with:
path: ~/.julia
key: ${{ needs.setup.outputs.ver }}-${{ needs.setup.outputs.hash }}
- name: Execute notebook
if: ${{ steps.nb-cache.outputs.cache-hit != 'true' }}
run: julia --project=@. execute.jl
path: ${{ env.NBCACHE }}
key: ${{ steps.nb-cache.outputs.cache-primary-key }}
- name: Convert artifact Name
id: art
run: echo "name=$(echo ${{ env.NB }} | sed 's/\//-/g')" >> "$GITHUB_OUTPUT"
- name: Upload Notebook
uses: actions/upload-artifact@v4
with:
Expand All @@ -146,6 +118,7 @@ jobs:
run: cp --verbose -rf ${{ env.NBCACHE }}/docs/* docs/
- name: Setup Python
uses: actions/setup-python@v5
id: setup-python
with:
python-version: '3.x'
- name: Install uv
Expand Down
20 changes: 20 additions & 0 deletions .github/workflows/rm-old-image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: Docker image retention
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * 1' # Every week

jobs:
clean:
name: Delete old images
runs-on: ubuntu-latest
permissions:
packages: write
steps:
- uses: snok/[email protected]
with:
account: user
token: ${{ secrets.GITHUB_TOKEN }}
image-names: ${{ github.event.repository.name }}
cut-off: 2w
dry-run: false
13 changes: 6 additions & 7 deletions .github/workflows/update-manifest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,13 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Julia
uses: julia-actions/setup-julia@v2
with:
version: '1'
- name: Update Julia dependencies
env:
JULIA_PKG_PRECOMPILE_AUTO: '0'
run: julia --project=@. --color=yes -e 'using Pkg; Pkg.update()'
run: >
docker run --rm -w /tmp
-v ${{ github.workspace }}:/tmp
-e JULIA_PKG_PRECOMPILE_AUTO=0
julia:latest
julia --project=@. --color=yes -e 'import Pkg; Pkg.update()'
# Authenticate with a custom GitHub APP
# https://github.com/peter-evans/create-pull-request/blob/main/docs/concepts-guidelines.md#authenticating-with-github-app-generated-tokens
- name: Generate token for PR
Expand Down
27 changes: 27 additions & 0 deletions env.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
FROM julia:1.10.5 as julia
FROM ghcr.io/astral-sh/uv:latest as uv
FROM python:3.12.5-slim

# System config
ENV UV_SYSTEM_PYTHON '1'
ENV JULIA_CI 'true'
ENV JULIA_NUM_THREADS 'auto'
# Let PythonCall use built-in python
ENV JULIA_CONDAPKG_BACKEND 'Null'
ENV JULIA_PATH '/usr/local/julia/'
ENV JULIA_DEPOT_PATH '/srv/juliapkg/'
ENV PATH ${JULIA_PATH}/bin:${PATH}
COPY --from=julia ${JULIA_PATH} ${JULIA_PATH}
COPY --from=uv /uv /bin/uv

WORKDIR /app

# Python dependencies
COPY requirements.txt .
RUN uv pip install --no-cache -r requirements.txt

# Julia dependencies
COPY Project.toml Manifest.toml ./
COPY src/ src
RUN julia --color=yes -e 'using Pkg; Pkg.add(["IJulia", "Literate", "JSON"]); import IJulia; IJulia.installkernel("Julia", "--project=@.")' && \
julia --color=yes --project=@. -e 'using Pkg; Pkg.instantiate(); Pkg.precompile()'
8 changes: 3 additions & 5 deletions execute.jl
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
using Literate
using JSON
using Pkg
using IJulia
Pkg.activate(Base.current_project())

ENV["GKSwstype"] = "100"
file = get(ENV, "NB", "test.ipynb")
cachedir = get(ENV, "NBCACHE", ".cache")

function main(; rmsvg=true)
file = get(ENV, "NB", "test.ipynb")
if endswith(file, ".jl")
run_literate(file; rmsvg)
elseif endswith(file, ".ipynb")
IJulia.installkernel("Julia", "--project=@.")
run_ipynb(file)
else
error("$(file) is not a valid notebook file!")
Expand Down Expand Up @@ -40,7 +40,6 @@ function strip_svg(ipynb)
end

function run_literate(file; rmsvg=true)
cachedir = get(ENV, "NBCACHE", ".cache")
outpath = joinpath(abspath(pwd()), cachedir, dirname(file))
mkpath(outpath)
ipynb = Literate.notebook(file, outpath; mdstrings=true, execute=true)
Expand All @@ -49,7 +48,6 @@ function run_literate(file; rmsvg=true)
end

function run_ipynb(file)
cachedir = get(ENV, "NBCACHE", ".cache")
outpath = joinpath(abspath(pwd()), cachedir, file)
mkpath(dirname(outpath))
kernelname = "--ExecutePreprocessor.kernel_name=julia-1.$(VERSION.minor)"
Expand Down

0 comments on commit c175364

Please sign in to comment.