Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
fdbc686
Create initial version of release CI workflow
hwikle-lanl Apr 3, 2026
2bf2525
Remove vendored dependencies
hwikle-lanl Apr 3, 2026
ec7d05f
Add `update-dependencies` workflow
hwikle-lanl Apr 3, 2026
4dc2a1f
Move requirements.in to own directory
hwikle-lanl Apr 3, 2026
07cd63c
Temorarily add push trigger to `update-dependencies` workflow
hwikle-lanl Apr 3, 2026
a8a4aa4
Update Python 3.6 version
hwikle-lanl Apr 3, 2026
68c492b
Checkout base branch in workflow
hwikle-lanl Apr 3, 2026
6f572f0
Fix shell expansion
hwikle-lanl Apr 3, 2026
3a6012b
Attempt to fix `update-dependencies` workflow
hwikle-lanl Apr 3, 2026
abb0fd8
Attempt to fix `update-dependencies` workflow for Python 3.6
hwikle-lanl Apr 4, 2026
e66f2e6
Fix incorrect requirements
hwikle-lanl Apr 4, 2026
6ec93c5
Attempt to fix `update-dependencies` workflow
hwikle-lanl Apr 4, 2026
113f962
Attempt to fix `update-dependencies` workflow (again)
hwikle-lanl Apr 4, 2026
b5a768c
Update Python dependency lockfiles (#985)
github-actions[bot] Apr 4, 2026
a8b7cf6
Finalize `update-dependencies` workflow
hwikle-lanl Apr 4, 2026
50988bc
Temporarily modify `release` workflow to force trigger
hwikle-lanl Apr 4, 2026
beac41f
Convert flufl.lock.TimeOutError to native Python TimeoutError
hwikle-lanl Apr 4, 2026
53bd128
Create separate lockfiles for base, test, and docs
hwikle-lanl Apr 4, 2026
5af8cee
Add readme file for requirements
hwikle-lanl Apr 4, 2026
90723d6
Temoprarily force trigger on push
hwikle-lanl Apr 4, 2026
e08860a
Attempt to fix lockfile artifact upload
hwikle-lanl Apr 4, 2026
db93bd1
Fix artifact upload for lockfile generation
hwikle-lanl Apr 4, 2026
1af738e
Attempt to fix update-dependencies workflow
hwikle-lanl Apr 4, 2026
74e251c
Update Python dependency lockfiles (#988)
github-actions[bot] Apr 4, 2026
74617ab
Finalize `update-dependencies` workflow
hwikle-lanl Apr 4, 2026
71a8d2f
Progress towards offline release
hwikle-lanl Apr 4, 2026
11e9182
Fix variable substitution
hwikle-lanl Apr 5, 2026
6896519
Install from lockfiles in unit test workflow
hwikle-lanl Apr 5, 2026
68b7114
Add JSON file to control Python versions in CI
hwikle-lanl Apr 5, 2026
5affa14
Fix typo
hwikle-lanl Apr 5, 2026
53200d5
Fix indentation error
hwikle-lanl Apr 5, 2026
a0b1594
Convert lockfile paths to strings
hwikle-lanl Apr 5, 2026
56dab60
Convert lockfile path to string
hwikle-lanl Apr 5, 2026
f86e727
Restrict pylint version
hwikle-lanl Apr 5, 2026
cea85ca
Update Python dependency lockfiles (#993)
github-actions[bot] Apr 5, 2026
918cc8a
Attempt to fix demo workflow
hwikle-lanl Apr 5, 2026
98b13e4
Update requirements readme
hwikle-lanl Apr 5, 2026
baf3468
Add script to check inconsistent dependencies
hwikle-lanl Apr 5, 2026
c35e908
Add additional print statement
hwikle-lanl Apr 5, 2026
7511313
Fix bash array in CI
hwikle-lanl Apr 5, 2026
334c6c2
Add debug statement
hwikle-lanl Apr 5, 2026
d71ecf2
Attempt to fix bash loop
hwikle-lanl Apr 5, 2026
882bbfb
Fix check_inconsistencies name in CI
hwikle-lanl Apr 5, 2026
695069f
Run check_inconsistencies as script
hwikle-lanl Apr 5, 2026
94b532d
Fix missing import
hwikle-lanl Apr 5, 2026
d3285f7
Keep arguments as strings
hwikle-lanl Apr 5, 2026
1aa9331
Fix another thing
hwikle-lanl Apr 5, 2026
9f7783b
Fix another thing
hwikle-lanl Apr 5, 2026
a4ea392
Another fix to check_inconsistent_deps.py
hwikle-lanl Apr 5, 2026
90b6ff4
Fix check_inconsistent_deps.py
hwikle-lanl Apr 5, 2026
d5dbe56
Add docstring
hwikle-lanl Apr 5, 2026
f43d39e
Install dependencies for check_inconsistent_deps.py
hwikle-lanl Apr 5, 2026
9076d3d
Tweak language
hwikle-lanl Apr 5, 2026
11e1536
Parameterize unit tests workflow
hwikle-lanl Apr 5, 2026
81ee4dd
Finish parameterizing `update_dependencies` workflow
hwikle-lanl Apr 5, 2026
c5a927c
Rename unittests workflow
hwikle-lanl Apr 5, 2026
9027f3b
Add debug statements for python versions
hwikle-lanl Apr 5, 2026
4030992
Fix quotes
hwikle-lanl Apr 5, 2026
de071cd
Remove old lockfiles when updating dependencies
hwikle-lanl Apr 5, 2026
9e5cc20
Add `dev` dependency type
hwikle-lanl Apr 5, 2026
3af470c
Attempt to fix fromJSON error
hwikle-lanl Apr 5, 2026
1de922d
Attempt to fix lockfile PR CI
hwikle-lanl Apr 5, 2026
323f4e6
Fix artifact upload name
hwikle-lanl Apr 5, 2026
088e549
Fix run sections
hwikle-lanl Apr 5, 2026
61d2580
Attempt to fix download-artifacts step
hwikle-lanl Apr 5, 2026
b3125fa
Update Python dependency lockfiles (#997)
github-actions[bot] Apr 5, 2026
93cd7a0
Automatically generate PR body
hwikle-lanl Apr 5, 2026
d34dcff
Set workflow permissions
hwikle-lanl Apr 6, 2026
c474e51
Move check_inconsistent_deps script to dev-utils dir
hwikle-lanl Apr 6, 2026
b6726d7
Automatically discover dependency groups
hwikle-lanl Apr 6, 2026
02fcf56
Add debug statement
hwikle-lanl Apr 6, 2026
9595aea
Fix requirements group discovery
hwikle-lanl Apr 6, 2026
13aaac9
Remove coverage.py version minimum for legacy Python
hwikle-lanl Apr 6, 2026
f8ef063
Update GitHub actions versions
hwikle-lanl Apr 6, 2026
ebf16fb
Set default shell to bash
hwikle-lanl Apr 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 17 additions & 0 deletions .github/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Python Versions

Edit `py-versions.json` to modify which versions of Python releases are generated for and under
which versions unit tests run.

- Supported versions - These are the primary versions of Python that Pavilion supports, and the
versions under which the core unit tests run.
- Legacy versions - These are versions of Python that are no longer fully supported and may be end-
of-life, but which Pavilion must still support for one reason or another. Unit tests run under
legacy versions of Python necessarily run in containers in GitHub CI.
- Default version - For unit tests that don't need to run under multiple Python versions, this is
the version of Python under which those unit tests run. Ideally, the default version should
be among the supported versions.

For each version, a compatible OS must be specified. This controls the OS of the virtual machine
on which unit tests for that version of Python run. Typically, this is the latest version of
Ubuntu with which that version of Python is compatible.
12 changes: 12 additions & 0 deletions .github/py-versions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"supported_py_versions": [
{ "python": "3.10", "os": "ubuntu-latest" },
{ "python": "3.12", "os": "ubuntu-latest" }
],
"legacy_py_versions": [
{ "python": "3.6", "os": "ubuntu-latest" }
],
"default_py_version": {
"python": "3.10", "os": "ubuntu-latest"
}
}
7 changes: 5 additions & 2 deletions .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ on:
# Run at midnight on Sundays
- cron: "0 0 * * 0"

permissions:
contents: read

jobs:
coverage:
runs-on: ubuntu-latest
Expand All @@ -22,8 +25,8 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install -r test/requirements.txt
pip install -r requirements/base-py312-lock.txt
pip install -r requirements/test-py312-lock.txt
pip install "coverage>=7.10,<8"

- name: setup
Expand Down
13 changes: 11 additions & 2 deletions .github/workflows/demo.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ on:
- develop
- stable

permissions:
contents: read

jobs:
demo_runs:
# Check to make sure Pavilion can auto-fetch it's dependencies.
Expand All @@ -23,10 +26,16 @@ jobs:
with:
python-version: "3.10"

- name: install-deps
- name: Install Python dependencies
run: |
pip install -r requirements/base-py310-lock.txt
pip install -r requirements/test-py310-lock.txt
pip install -r requirements/docs-py310-lock.txt

- name: Install GCC
run: sudo apt install gcc

- name:
- name: Run demo tests
run: |
source examples/demo/activate.sh
pav run -v QUIET demo advanced buildit
Expand Down
300 changes: 300 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,300 @@
name: Build and Release Pavilion

on:
push:
branches:
- hwikle/offline-release-ci
tags:
- "v*"
workflow_dispatch:

env:
PACKAGE_NAME: "pavilion"

jobs:
test-standard:
name: Test standard install for Python ${{ matrix.python-version }}
runs-on: ubuntu-latest

permissions:
contents: read

strategy:
matrix:
python-version: ["3.10", "3.12"]

steps:
- name: Check out Pavilion repository
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: Upgrade packaging tools
run: |
python -m pip install --upgrade pip setuptools wheel

- name: Install dependencies from lock file
run: |
PY_TAG="py${{ matrix.python-version }}"
PY_TAG="${PY_TAG/./}"
pip install requirements/base-py$"${PY_TAG}"-lock.txt
pip install requirements/test-py$"${PY_TAG}"-lock.txt
pip install requirements/docs-py$"${PY_TAG}"-lock.txt

- name: Setup Pavilion application-level config
run: |
ln -s pavilion.yaml.ci test/data/pav_config_dir/pavilion.yaml
echo "working_dir: $(pwd)/test/working_dir" >> test/data/pav_config_dir/pavilion.yaml

- name: Run Pavilion unit tests
run: |
./test/run_tests

build-wheelhouse:
name: Build offline wheelhouse artifact for Python ${{ matrix.python-version }}
runs-on: ubuntu-latest
needs: test-standard

permissions:
contents: read

strategy:
matrix:
python-version: ["3.10", "3.12"]

steps:
- name: Check out Pavilion repository
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: Upgrade packaging tools
run: |
python -m pip install --upgrade pip setuptools wheel

- name: Create wheelhouse
run: |
PY_TAG="py${{ matrix.python-version }}"
PY_TAG="${PY_TAG/./}"
rm -rf dist wheelhouse release-offline
mkdir -p wheelhouse
python -m pip download \
--requirement requirements/{base,test,docs}-py"${PY_TAG}"-lock.txt \
--dest wheelhouse

- name: Build offline release tree
run: |
VERSION="${GITHUB_REF_NAME:-dev}"
ROOT="release-offline/${PACKAGE_NAME}-offline-${VERSION}"

mkdir -p "${ROOT}"

rsync -a \
--exclude ".git" \
--exclude ".github" \
--exclude "__pycache__" \
--exclude ".pytest_cache" \
--exclude "dist" \
--exclude "release-offline" \
./ "${ROOT}/"

cp -r wheelhouse "${ROOT}/wheelhouse"

cat > "${ROOT}/install_offline.sh" <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
VENV="${1:-$ROOT/.venv}"

python3 -m venv "$VENV"
# shellcheck disable=SC1091
source "$VENV/bin/activate"

python -m pip install --upgrade pip
python -m pip install \
--no-index \
--find-links "$ROOT/wheelhouse" \
-r "$ROOT/requirements-lock.txt"

cat <<MSG
Offline environment created at:
$VENV

Activate it with:
source "$VENV/bin/activate"
MSG
EOF

chmod +x "${ROOT}/install_offline.sh"

cat > "${ROOT}/README.offline.md" <<'EOF'
# Pavilion Offline Install

This bundle includes a wheelhouse for offline dependency installation.

## Install

```bash
./install_offline.sh
```

Or choose a custom virtualenv location:

```bash
./install_offline.sh /path/to/venv
```

## Notes

- Installation uses only the bundled `wheelhouse/`
- No package index access is required
- Pavilion itself runs from this source tree
EOF

cat > "${ROOT}/build-metadata.json" <<EOF
{
"git_ref": "${GITHUB_REF_NAME:-unknown}",
"git_sha": "${GITHUB_SHA}",
"python_version": "${PYTHON_VERSION}"
}
EOF

- name: Archive offline bundle
run: |
mkdir -p dist
VERSION="${GITHUB_REF_NAME:-dev}"
tar -C release-offline -czf "dist/${PACKAGE_NAME}-offline-${VERSION}.tar.gz" \
"${PACKAGE_NAME}-offline-${VERSION}"

- name: Upload offline artifact
uses: actions/upload-artifact@v4
with:
name: offline-release
path: dist/*.tar.gz

test-offline:
name: Test offline install
runs-on: ubuntu-latest
needs: build-wheelhouse

permissions:
contents: read

steps:
- name: Download offline artifact
uses: actions/download-artifact@v4
with:
name: offline-release
path: dist

- name: Extract offline artifact
run: |
mkdir -p extracted
tar -C extracted -xzf dist/*.tar.gz
find extracted -maxdepth 2 -type f | sort

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}

- name: Install from wheelhouse only
run: |
ROOT="$(find extracted -mindepth 1 -maxdepth 1 -type d | head -n 1)"
python -m venv /tmp/pav-offline-venv
# shellcheck disable=SC1091
source /tmp/pav-offline-venv/bin/activate

python -m pip install --upgrade pip
python -m pip install \
--no-index \
--find-links "$ROOT/wheelhouse" \
-r "$ROOT/requirements-lock.txt"

- name: Run Pavilion tests in offline-installed env
run: |
ROOT="$(find extracted -mindepth 1 -maxdepth 1 -type d | head -n 1)"
# shellcheck disable=SC1091
source /tmp/pav-offline-venv/bin/activate
cd "$ROOT"

# Replace with Pavilion's real test command.
pytest -q

build-standard:
name: Build standard source artifact
runs-on: ubuntu-latest
needs: test-offline

permissions:
contents: read

steps:
- name: Check out source
uses: actions/checkout@v4

- name: Create standard release tarball
run: |
rm -rf dist release-standard
mkdir -p dist release-standard

VERSION="${GITHUB_REF_NAME:-dev}"
ROOT="release-standard/${PACKAGE_NAME}-${VERSION}"

mkdir -p "${ROOT}"

rsync -a \
--exclude ".git" \
--exclude ".github" \
--exclude "__pycache__" \
--exclude ".pytest_cache" \
--exclude "dist" \
--exclude "release-standard" \
./ "${ROOT}/"

tar -C release-standard -czf "dist/${PACKAGE_NAME}-${VERSION}.tar.gz" \
"${PACKAGE_NAME}-${VERSION}"

- name: Upload standard artifact
uses: actions/upload-artifact@v4
with:
name: standard-release
path: dist/*.tar.gz

publish-release:
name: Publish GitHub release
runs-on: ubuntu-latest
needs:
- build-standard
- test-offline
if: startsWith(github.ref, 'refs/tags/')

permissions:
contents: write

steps:
- name: Download standard artifact
uses: actions/download-artifact@v4
with:
name: standard-release
path: dist

- name: Download offline artifact
uses: actions/download-artifact@v4
with:
name: offline-release
path: dist

- name: Publish release
uses: softprops/action-gh-release@v2
with:
name: Pavilion ${{ github.ref_name }} (test)
files: dist/*.tar.gz
generate_release_notes: true
Loading
Loading