From a36eca3c1e83e6ed7d54cca7d065f9d70259f4ca Mon Sep 17 00:00:00 2001 From: Peter Van Dyken Date: Thu, 14 Dec 2023 11:53:35 -0500 Subject: [PATCH] Refactor gh-actions to use reusable rule sets Project installation uses khanlab/actions Docker container setup is refactored into a composite rule --- .../actions/build-test-container/action.yaml | 40 ++++ .github/workflows/deploy.yml | 2 +- .github/workflows/test.yml | 195 +++--------------- 3 files changed, 68 insertions(+), 169 deletions(-) create mode 100644 .github/actions/build-test-container/action.yaml diff --git a/.github/actions/build-test-container/action.yaml b/.github/actions/build-test-container/action.yaml new file mode 100644 index 00000000..06ab3b86 --- /dev/null +++ b/.github/actions/build-test-container/action.yaml @@ -0,0 +1,40 @@ +name: Build template testing container +description: Build and cache the container for testing snakebids create +inputs: + python-version: + description: Python version to setup + required: true + load: + required: false + description: | + if true, load the docker container into docker for downstream consumption + default: '' + +runs: + using: composite + steps: + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Cache Template Testing Containers + uses: actions/cache@v3 + with: + path: container-test-template-cache + key: ${{ runner.os }}-test-template-cache-${{ hashFiles('containers/test-template/**') }}-${{ inputs.python-version }} + - name: Inject container-test-template-cache into docker + uses: reproducible-containers/buildkit-cache-dance@v2.1.2 + with: + cache-source: container-test-template-cache + - name: Build Docker container for cache + uses: docker/build-push-action@v5 + with: + context: containers/test-template + cache-from: type=gha + cache-to: type=gha,mode=max + push: false + load: ${{ inputs.load == 'true' }} + tags: snakebids/test-template:${{ inputs.python-version }} + platforms: linux/amd64 + build-args: | + PYTHON_VERSION=${{ inputs.python-version }} diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ae0a07fd..4337b90d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -69,7 +69,7 @@ jobs: git fetch --tags - name: Set up Python - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: '3.9' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2304b01e..c808a57f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,42 +18,11 @@ jobs: runs-on: ubuntu-latest steps: - - name: Clone repo - uses: actions/checkout@v3 - - # install & configure poetry - - name: Cache Poetry Installation - id: cached-poetry - uses: actions/cache@v3 - with: - path: ~/.local - key: ${{ runner.os }}-poetry-${{ github.event.pull_request.id || github.event.after }} - - name: Install Poetry - uses: snok/install-poetry@v1 - if: steps.cached-poetry.outputs.cache-hit != 'true' - with: - virtualenvs-create: true - virtualenvs-in-project: true - - - name: Setup Python - id: setup-python - uses: actions/setup-python@v4 + - name: Install + uses: khanlab/actions/.github/actions/action-setup_task-installPyProject@v0.3.2 with: python-version: '3.11' - cache: 'poetry' - - name: Store Pip Cache - uses: actions/cache@v3 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ steps.setup-python.outputs.python-version }} - restore-keys: ${{ runner.os }}-pip-${{ steps.setup-python.outputs.python-version }} - - # install dependencies - - name: Install dependencies - if: steps.setup-python.outputs.cache-hit != 'true' - run: poetry install --no-interaction --no-ansi --no-root - - name: Install library - run: poetry install --no-interaction --no-ansi + install-library: true # run python style checks - name: Poetry Lock Check @@ -74,68 +43,14 @@ jobs: matrix: python-version: ['3.8', '3.9', '3.10', '3.11'] steps: - - uses: actions/checkout@v3 - - # install & configure poetry - - name: Cache Poetry Installation - id: cached-poetry - uses: actions/cache@v3 - with: - path: ~/.local - key: ${{ runner.os }}-poetry-${{ github.event.pull_request.id || github.event.after }} - - name: Install Poetry - if: steps.cached-poetry.outputs.cache-hit != 'true' - uses: snok/install-poetry@v1 - with: - virtualenvs-create: true - virtualenvs-in-project: true - - - name: Set up Python ${{ matrix.python-version }} - id: setup-python - uses: actions/setup-python@v4 + - uses: khanlab/actions/.github/actions/action-setup_task-installPyProject@v0.3.3 + id: setup with: python-version: ${{ matrix.python-version }} - cache: 'poetry' - - name: Store pip cache - uses: actions/cache@v3 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ steps.setup-python.outputs.python-version }} - restore-keys: | - ${{ runner.os }}-pip-${{ steps.setup-python.outputs.python-version }} - ${{ runner.os }}-pip- - - # install dependencies if cache does not exist - - name: Install dependencies - if: steps.setup-python.outputs.cache-hit != 'true' - run: poetry install --no-interaction --no-root --no-ansi - - # Build docker container needed for test - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Cache Template Testing Containers - uses: actions/cache@v3 - with: - path: container-test-template-cache - key: ${{ runner.os }}-test-template-cache-${{ hashFiles('containers/test-template/**') }}-${{ steps.setup-python.outputs.python-version }} - - name: Inject container-test-template-cache into docker - uses: reproducible-containers/buildkit-cache-dance@v2.1.2 + - name: setup docker + uses: ./.github/actions/build-test-container with: - cache-source: container-test-template-cache - - name: Build Docker container for cache - uses: docker/build-push-action@v5 - with: - context: containers/test-template - cache-from: type=gha - cache-to: type=gha,mode=max - push: false - load: false - tags: snakebids/test-template:${{ steps.setup-python.outputs.python-version }} - platforms: linux/amd64 - build-args: | - PYTHON_VERSION=${{ steps.setup-python.outputs.python-version }} + python-version: ${{ steps.setup.outputs.python-version }} test: runs-on: ubuntu-latest @@ -146,81 +61,25 @@ jobs: split: ['1', '2', '3', '4', '5'] fail-fast: false steps: - - uses: actions/checkout@v3 - - # install & configure poetry - - name: Cache Poetry Installation - id: cached-poetry - uses: actions/cache@v3 - with: - path: ~/.local - key: ${{ runner.os }}-poetry-${{ github.event.pull_request.id || github.event.after }} - - name: Install Poetry - uses: snok/install-poetry@v1 - if: steps.cached-poetry.outputs.cache-hit != 'true' - with: - # Ensure this specification is removed when py37 support is dropped - version: 1.5.1 - virtualenvs-create: true - virtualenvs-in-project: true - - - name: Set up Python ${{ matrix.python-version }} - id: setup-python - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - cache: poetry - - uses: actions/cache@v3 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ steps.setup-python.outputs.python-version }} - restore-keys: | - ${{ runner.os }}-pip-${{ steps.setup-python.outputs.python-version }} - ${{ runner.os }}-pip- - - # install dependencies - - name: Install dependencies - if: steps.setup-python.outputs.cache-hit != 'true' - run: poetry install --no-interaction --no-root --no-ansi - - - # Build docker container needed for test - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Cache Template Testing Containers - uses: actions/cache@v3 - with: - path: container-test-template-cache - key: ${{ runner.os }}-test-template-cache-${{ hashFiles('containers/test-template/**') }}-${{ steps.setup-python.outputs.python-version }} - - name: Inject container-test-template-cache into docker - uses: reproducible-containers/buildkit-cache-dance@v2.1.2 - with: - cache-source: container-test-template-cache - - name: Build Docker container for cache - uses: docker/build-push-action@v5 - with: - context: containers/test-template - cache-from: type=gha - cache-to: type=gha,mode=max - push: false - load: true - tags: snakebids/test-template:${{ steps.setup-python.outputs.python-version }} - platforms: linux/amd64 - build-args: | - PYTHON_VERSION=${{ steps.setup-python.outputs.python-version }} - - - name: Install library - run: poetry install --no-interaction --no-ansi - - - name: Test with pytest - env: - HYPOTHESIS_PROFILE: pr - run: >- - poetry run pytest -n auto --splits 5 --group ${{ matrix.split }} - --doctest-modules --ignore=docs - --ignore=snakebids/project_template --benchmark-disable + - name: install + uses: khanlab/actions/.github/actions/action-setup_task-installPyProject@v0.3.3 + id: setup + with: + python-version: ${{ matrix.python-version }} + install-library: true + - name: build docker test container + uses: ./.github/actions/build-test-container + with: + python-version: ${{ steps.setup.outputs.python-version }} + load: true + + - name: Test with pytest + env: + HYPOTHESIS_PROFILE: pr + run: >- + poetry run pytest -n auto --splits 5 --group ${{ matrix.split }} + --doctest-modules --ignore=docs + --ignore=snakebids/project_template --benchmark-disable deployment_on_base: runs-on: ubuntu-latest