From 90f7a4c8ede0dcbf21ad35488519799fc398f70f Mon Sep 17 00:00:00 2001 From: SophieCurinier Date: Thu, 19 Dec 2024 14:59:46 -0500 Subject: [PATCH 01/20] [DEVOPS-584] Add pixi to pytest and pylint workflows --- .../reusable-python-setup_pixi/action.yml | 31 +++++++++++++++++++ .github/workflows/reusable-python-pytest.yml | 10 +++++- .../reusable-python-static_analysis.yml | 12 ++++++- 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 .github/actions/reusable-python-setup_pixi/action.yml diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml new file mode 100644 index 00000000..aea9a401 --- /dev/null +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -0,0 +1,31 @@ +name: Setup pixi env +description: Setup pixi environment for Python +inputs: + cache-number: + description: 'Cache number to reset cache if poetry.lock has not changed' + required: true + type: number + runner-os: + description: 'Runner OS' + required: true + type: string + virtual-repo-names: + description: 'Matrix of virtual repository names to resolve (eg. ["public-dev-pypi"])' + required: false + type: string + JFROG_ARTIFACTORY_TOKEN: + description: 'JFrog Artifactory Token' + required: true + type: string + +runs: + using: "composite" + steps: + - name: Get full Python version + id: full-python-version + shell: bash + run: echo "version=$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))")" >> $GITHUB_OUTPUT + - uses: prefix-dev/setup-pixi@v0.8.1 + with: + pixi-version: v0.39.2 + cache: true diff --git a/.github/workflows/reusable-python-pytest.yml b/.github/workflows/reusable-python-pytest.yml index 2a43a2c1..736e04ac 100644 --- a/.github/workflows/reusable-python-pytest.yml +++ b/.github/workflows/reusable-python-pytest.yml @@ -4,7 +4,7 @@ on: workflow_call: inputs: package-manager: - description: 'Package manager to use (eg. "conda", "poetry")' + description: 'Package manager to use (eg. "conda", "poetry", "pixi")' required: true type: string default: 'poetry' @@ -98,6 +98,12 @@ jobs: with: cache-number: ${{ inputs.cache-number }} runner-os: ${{ runner.os }} + - uses: MiraGeoscience/CI-tools/.github/actions/reusable-python-setup_pixi@DEVOPS-584 + name: Setup pixi env + if: ${{ inputs.package-manager == 'pixi' }} + with: + python-version: ${{ inputs.python-version }} + runner-os: ${{ runner.os }} - name: Run Pytest run: | @@ -105,6 +111,8 @@ jobs: pytest --cov --cov-report=xml elif ${{ inputs.package-manager == 'poetry' }}; then poetry run pytest --cov --cov-report=xml + elif ${{ inputs.package-manager == 'pixi' }}; then + pixi run pytest --cov --cov-report=xml else hatch run pytest --cov --cov-report=xml fi diff --git a/.github/workflows/reusable-python-static_analysis.yml b/.github/workflows/reusable-python-static_analysis.yml index af6dcca9..9ed99ef2 100644 --- a/.github/workflows/reusable-python-static_analysis.yml +++ b/.github/workflows/reusable-python-static_analysis.yml @@ -4,7 +4,7 @@ on: workflow_call: inputs: package-manager: - description: 'Package manager to use (eg. "conda", "poetry")' + description: 'Package manager to use (eg. "conda", "poetry", "pixi")' required: true type: string default: 'poetry' @@ -80,6 +80,12 @@ jobs: with: cache-number: 1 runner-os: ${{ runner.os }} + - uses: MiraGeoscience/CI-tools/.github/actions/reusable-python-setup_pixi@DEVOPS-584 + name: Setup pixi env + if: ${{ inputs.package-manager == 'pixi' }} + with: + python-version: ${{ inputs.python-version }} + runner-os: ${{ runner.os }} - name: Capture modified files if: github.event_name == 'pull_request' @@ -96,6 +102,8 @@ jobs: pylint $FILES_PARAM elif ${{ inputs.package-manager == 'poetry' }}; then poetry run pylint $FILES_PARAM + elif ${{ inputs.package-manager == 'pixi' }}; then + pixi run pylint $FILES_PARAM else hatch run pylint $FILES_PARAM fi @@ -106,6 +114,8 @@ jobs: pylint $source_dir tests elif ${{ inputs.package-manager == 'poetry' }}; then poetry run pylint $source_dir tests + elif ${{ inputs.package-manager == 'pixi' }}; then + pixi run pylint $source_dir tests else hatch run pylint $source_dir tests fi From de9d41fbbf78b16ae21ea0386f8b715acefbcfcd Mon Sep 17 00:00:00 2001 From: SophieCurinier Date: Thu, 19 Dec 2024 16:01:06 -0500 Subject: [PATCH 02/20] [DEVOPS-584] Run pixi install --frozen instead of pixi install --locked --- .github/actions/reusable-python-setup_pixi/action.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml index aea9a401..2dfc543a 100644 --- a/.github/actions/reusable-python-setup_pixi/action.yml +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -29,3 +29,4 @@ runs: with: pixi-version: v0.39.2 cache: true + frozen: true From 71334b41d60e0134ffa29ce8ac217422a0136ac3 Mon Sep 17 00:00:00 2001 From: SophieCurinier Date: Fri, 20 Dec 2024 11:50:19 -0500 Subject: [PATCH 03/20] [DEVOPS-584] Add a build pixi package workflow --- .../reusable-python-build_pixi_package.yml | 115 ++++++++++++++++++ .../reusable-python-publish_pypi_package.yml | 15 +++ 2 files changed, 130 insertions(+) create mode 100644 .github/workflows/reusable-python-build_pixi_package.yml diff --git a/.github/workflows/reusable-python-build_pixi_package.yml b/.github/workflows/reusable-python-build_pixi_package.yml new file mode 100644 index 00000000..18768d25 --- /dev/null +++ b/.github/workflows/reusable-python-build_pixi_package.yml @@ -0,0 +1,115 @@ +name: Build poetry package + +on: + workflow_call: + inputs: + package-name: + description: 'Name of the package to build' + required: true + type: string + python-version: + description: 'Python version to use (eg: 3.10)' + required: true + type: string + lfs: + description: 'Boolean to indicate if Github LFS is needed' + required: false + type: boolean + default: false + version-tag: + description: 'Version tag of the package to build' + required: true + type: string + + virtual-repo-names: + description: 'Matrix of virtual repository names to publish on (eg. ["public-dev-pypi"])' + required: true + type: string + os: + description: 'OS to build against (eg. "ubuntu-latest")' + required: true + type: string + timeout-minutes: + description: 'Timeout in minutes for the job' + required: true + type: number + outputs: + build-dir-path: + description: 'Path to the build directory' + value: ${{ jobs.build_package.outputs.build-dir-path }} + version: + description: 'Version of the package' + value: ${{ jobs.build_package.outputs.version }} + secrets: + JFROG_ARTIFACTORY_URL: + description: 'JFrog Artifactory URL' + required: true + JFROG_ARTIFACTORY_TOKEN: + description: 'JFrog Artifactory Token' + required: true + +defaults: + run: + shell: 'bash -l {0}' + +jobs: + build_package: + name: Build poetry package + runs-on: ${{ inputs.os }} + timeout-minutes: ${{ inputs.timeout-minutes }} + outputs: + build-dir-path: ${{ steps.define-build-path.outputs.dir-path }} + version: ${{ steps.get-version.outputs.version }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + lfs: ${{ inputs.lfs }} + fetch-depth: 0 + - name: Get version + id: get-version + run: | + if [ "${{ inputs.version-tag }}" = "v0.0.0" ]; then + echo "Version tag not available" + exit 1 + fi + VERSION=$(echo "${{ inputs.version-tag }}" | sed 's/v//') + echo "version: ${VERSION}" + if [ -z "${VERSION}" ]; then + echo "Version is not available" + exit 1 + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + - uses: jfrog/setup-jfrog-cli@v4.4.1 + name: Setup JFrog CLI + env: + JF_URL: https://${{ secrets.JFROG_ARTIFACTORY_URL }} + JF_ACCESS_TOKEN: ${{ secrets.JFROG_ARTIFACTORY_TOKEN }} + + - name: Set up Python version + uses: actions/setup-python@v5 + with: + python-version: ${{ inputs.python-version }} + - uses: prefix-dev/setup-pixi@v0.8.1 + with: + pixi-version: v0.39.2 + cache: false + frozen: true + - name: Hatch build + run: pixi run hatch build + + - name: Define build path + id: define-build-path + run: | + DIR_PATH="dist" + echo "dir-path: ${DIR_PATH}" + if [[ -z ${DIR_PATH} ]]; then + echo "No build path found" + exit 1 + fi + echo "dir-path=${DIR_PATH}" >> $GITHUB_OUTPUT + - name: Archive build artifact + uses: actions/upload-artifact@v4 + with: + name: package-build-pypi + path: ${{ steps.define-build-path.outputs.dir-path }} diff --git a/.github/workflows/reusable-python-publish_pypi_package.yml b/.github/workflows/reusable-python-publish_pypi_package.yml index 9eb236e6..8f3bdfd9 100644 --- a/.github/workflows/reusable-python-publish_pypi_package.yml +++ b/.github/workflows/reusable-python-publish_pypi_package.yml @@ -71,6 +71,21 @@ jobs: secrets: JFROG_ARTIFACTORY_URL: ${{ secrets.JFROG_ARTIFACTORY_URL }} JFROG_ARTIFACTORY_TOKEN: ${{ secrets.JFROG_ARTIFACTORY_TOKEN }} + build_pixi_package: + name: Build pixi package + if: ${{ inputs.package-manager == 'pixi' && github.repository_owner == 'MiraGeoscience' }} + uses: MiraGeoscience/CI-tools/.github/workflows/reusable-python-build_pixi_package.yml@DEVOPS-584 + with: + package-name: ${{ inputs.package-name }} + python-version: ${{ inputs.python-version }} + lfs: ${{ inputs.lfs }} + version-tag: ${{ inputs.version-tag }} + virtual-repo-names: ${{ inputs.virtual-repo-names }} + os: ${{ inputs.os }} + timeout-minutes: ${{ inputs.timeout-minutes }} + secrets: + JFROG_ARTIFACTORY_URL: ${{ secrets.JFROG_ARTIFACTORY_URL }} + JFROG_ARTIFACTORY_TOKEN: ${{ secrets.JFROG_ARTIFACTORY_TOKEN }} build_setuptools_package: name: Build setuptools package if: ${{ inputs.package-manager == 'setuptools' && github.repository_owner == 'MiraGeoscience' }} From 247eaba533c03857d83f32d923f985bad38b98d1 Mon Sep 17 00:00:00 2001 From: saicheranb Date: Wed, 3 Sep 2025 16:22:58 -0400 Subject: [PATCH 04/20] Add GIT_LFS_SKIP_SMUDGE environment variable --- .github/actions/reusable-python-setup_pixi/action.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml index 2dfc543a..fcb39425 100644 --- a/.github/actions/reusable-python-setup_pixi/action.yml +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -30,3 +30,5 @@ runs: pixi-version: v0.39.2 cache: true frozen: true + env: + GIT_LFS_SKIP_SMUDGE: 1 From 62b112623493f8d8820b16b40e2271b53d40e237 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Wed, 3 Sep 2025 22:57:36 -0400 Subject: [PATCH 05/20] [DEVOPS-584] update setup-pixi action and pix version --- .github/actions/reusable-python-setup_pixi/action.yml | 4 ++-- .github/workflows/reusable-python-build_pixi_package.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml index fcb39425..e494f846 100644 --- a/.github/actions/reusable-python-setup_pixi/action.yml +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -25,9 +25,9 @@ runs: id: full-python-version shell: bash run: echo "version=$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))")" >> $GITHUB_OUTPUT - - uses: prefix-dev/setup-pixi@v0.8.1 + - uses: prefix-dev/setup-pixi@v0.9.0 with: - pixi-version: v0.39.2 + pixi-version: v0.54.1 cache: true frozen: true env: diff --git a/.github/workflows/reusable-python-build_pixi_package.yml b/.github/workflows/reusable-python-build_pixi_package.yml index 18768d25..bf1ba769 100644 --- a/.github/workflows/reusable-python-build_pixi_package.yml +++ b/.github/workflows/reusable-python-build_pixi_package.yml @@ -90,9 +90,9 @@ jobs: uses: actions/setup-python@v5 with: python-version: ${{ inputs.python-version }} - - uses: prefix-dev/setup-pixi@v0.8.1 + - uses: prefix-dev/setup-pixi@v0.9.0 with: - pixi-version: v0.39.2 + pixi-version: v0.54.1 cache: false frozen: true - name: Hatch build From 0697e0c8a7f213ab6e94008b0430c7268a520ba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Wed, 3 Sep 2025 23:04:06 -0400 Subject: [PATCH 06/20] [DEVOPS-584] pixi install --locked instead of --frozen so that it fails in case the lock file is not up-to-date with the pyproject.toml --- .github/actions/reusable-python-setup_pixi/action.yml | 2 +- .github/workflows/reusable-python-build_pixi_package.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml index e494f846..887c20e2 100644 --- a/.github/actions/reusable-python-setup_pixi/action.yml +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -29,6 +29,6 @@ runs: with: pixi-version: v0.54.1 cache: true - frozen: true + locked: true env: GIT_LFS_SKIP_SMUDGE: 1 diff --git a/.github/workflows/reusable-python-build_pixi_package.yml b/.github/workflows/reusable-python-build_pixi_package.yml index bf1ba769..8afaa346 100644 --- a/.github/workflows/reusable-python-build_pixi_package.yml +++ b/.github/workflows/reusable-python-build_pixi_package.yml @@ -94,7 +94,7 @@ jobs: with: pixi-version: v0.54.1 cache: false - frozen: true + locked: true - name: Hatch build run: pixi run hatch build From c75e48be0708fe3b142604a5bc0945bb874650a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Wed, 3 Sep 2025 23:11:07 -0400 Subject: [PATCH 07/20] [DEVOPS-584] removing pixi build. Can still use poetry build Can possibly move to hatch or uv later. Building the pypi package does not rely on pixi, even if pixi can be used to define a build environment or a task --- .../reusable-python-build_pixi_package.yml | 115 ------------------ .../reusable-python-publish_pypi_package.yml | 15 --- 2 files changed, 130 deletions(-) delete mode 100644 .github/workflows/reusable-python-build_pixi_package.yml diff --git a/.github/workflows/reusable-python-build_pixi_package.yml b/.github/workflows/reusable-python-build_pixi_package.yml deleted file mode 100644 index 8afaa346..00000000 --- a/.github/workflows/reusable-python-build_pixi_package.yml +++ /dev/null @@ -1,115 +0,0 @@ -name: Build poetry package - -on: - workflow_call: - inputs: - package-name: - description: 'Name of the package to build' - required: true - type: string - python-version: - description: 'Python version to use (eg: 3.10)' - required: true - type: string - lfs: - description: 'Boolean to indicate if Github LFS is needed' - required: false - type: boolean - default: false - version-tag: - description: 'Version tag of the package to build' - required: true - type: string - - virtual-repo-names: - description: 'Matrix of virtual repository names to publish on (eg. ["public-dev-pypi"])' - required: true - type: string - os: - description: 'OS to build against (eg. "ubuntu-latest")' - required: true - type: string - timeout-minutes: - description: 'Timeout in minutes for the job' - required: true - type: number - outputs: - build-dir-path: - description: 'Path to the build directory' - value: ${{ jobs.build_package.outputs.build-dir-path }} - version: - description: 'Version of the package' - value: ${{ jobs.build_package.outputs.version }} - secrets: - JFROG_ARTIFACTORY_URL: - description: 'JFrog Artifactory URL' - required: true - JFROG_ARTIFACTORY_TOKEN: - description: 'JFrog Artifactory Token' - required: true - -defaults: - run: - shell: 'bash -l {0}' - -jobs: - build_package: - name: Build poetry package - runs-on: ${{ inputs.os }} - timeout-minutes: ${{ inputs.timeout-minutes }} - outputs: - build-dir-path: ${{ steps.define-build-path.outputs.dir-path }} - version: ${{ steps.get-version.outputs.version }} - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - lfs: ${{ inputs.lfs }} - fetch-depth: 0 - - name: Get version - id: get-version - run: | - if [ "${{ inputs.version-tag }}" = "v0.0.0" ]; then - echo "Version tag not available" - exit 1 - fi - VERSION=$(echo "${{ inputs.version-tag }}" | sed 's/v//') - echo "version: ${VERSION}" - if [ -z "${VERSION}" ]; then - echo "Version is not available" - exit 1 - fi - echo "version=${VERSION}" >> $GITHUB_OUTPUT - - uses: jfrog/setup-jfrog-cli@v4.4.1 - name: Setup JFrog CLI - env: - JF_URL: https://${{ secrets.JFROG_ARTIFACTORY_URL }} - JF_ACCESS_TOKEN: ${{ secrets.JFROG_ARTIFACTORY_TOKEN }} - - - name: Set up Python version - uses: actions/setup-python@v5 - with: - python-version: ${{ inputs.python-version }} - - uses: prefix-dev/setup-pixi@v0.9.0 - with: - pixi-version: v0.54.1 - cache: false - locked: true - - name: Hatch build - run: pixi run hatch build - - - name: Define build path - id: define-build-path - run: | - DIR_PATH="dist" - echo "dir-path: ${DIR_PATH}" - if [[ -z ${DIR_PATH} ]]; then - echo "No build path found" - exit 1 - fi - echo "dir-path=${DIR_PATH}" >> $GITHUB_OUTPUT - - name: Archive build artifact - uses: actions/upload-artifact@v4 - with: - name: package-build-pypi - path: ${{ steps.define-build-path.outputs.dir-path }} diff --git a/.github/workflows/reusable-python-publish_pypi_package.yml b/.github/workflows/reusable-python-publish_pypi_package.yml index 2da33ba9..2760b8e4 100644 --- a/.github/workflows/reusable-python-publish_pypi_package.yml +++ b/.github/workflows/reusable-python-publish_pypi_package.yml @@ -77,21 +77,6 @@ jobs: secrets: JFROG_ARTIFACTORY_URL: ${{ secrets.JFROG_ARTIFACTORY_URL }} JFROG_ARTIFACTORY_TOKEN: ${{ secrets.JFROG_ARTIFACTORY_TOKEN }} - build_pixi_package: - name: Build pixi package - if: ${{ inputs.package-manager == 'pixi' && github.repository_owner == 'MiraGeoscience' }} - uses: MiraGeoscience/CI-tools/.github/workflows/reusable-python-build_pixi_package.yml@DEVOPS-584 - with: - package-name: ${{ inputs.package-name }} - python-version: ${{ inputs.python-version }} - lfs: ${{ inputs.lfs }} - version-tag: ${{ inputs.version-tag }} - virtual-repo-names: ${{ inputs.virtual-repo-names }} - os: ${{ inputs.os }} - timeout-minutes: ${{ inputs.timeout-minutes }} - secrets: - JFROG_ARTIFACTORY_URL: ${{ secrets.JFROG_ARTIFACTORY_URL }} - JFROG_ARTIFACTORY_TOKEN: ${{ secrets.JFROG_ARTIFACTORY_TOKEN }} build_setuptools_package: name: Build setuptools package if: ${{ inputs.package-manager == 'setuptools' && github.repository_owner == 'MiraGeoscience' }} From a493e489ea6ecbbc878edd1ab36a3d7da9af79a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Thu, 4 Sep 2025 13:36:57 -0400 Subject: [PATCH 08/20] [DEVOPS-584] minor fix in comment --- .github/actions/reusable-python-setup_pixi/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml index 887c20e2..579eddea 100644 --- a/.github/actions/reusable-python-setup_pixi/action.yml +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -2,7 +2,7 @@ name: Setup pixi env description: Setup pixi environment for Python inputs: cache-number: - description: 'Cache number to reset cache if poetry.lock has not changed' + description: 'Cache number to reset cache if pixi.lock has not changed' required: true type: number runner-os: From bf0e404ae05cd9161cbfe26e68795bf67076b914 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Thu, 4 Sep 2025 13:40:52 -0400 Subject: [PATCH 09/20] [DEVOPS-584] use cache number to reset cache --- .github/actions/reusable-python-setup_pixi/action.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml index 579eddea..5877df79 100644 --- a/.github/actions/reusable-python-setup_pixi/action.yml +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -28,6 +28,7 @@ runs: - uses: prefix-dev/setup-pixi@v0.9.0 with: pixi-version: v0.54.1 + cache-key: K{{ inputs.cache-number }}- cache: true locked: true env: From 0c6a64fe8937a137c74d686660de76616c4790e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Thu, 4 Sep 2025 13:42:07 -0400 Subject: [PATCH 10/20] [DEVOPS-584] no need to check python version: pixi manages it all --- .github/actions/reusable-python-setup_pixi/action.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml index 5877df79..45ee7ed7 100644 --- a/.github/actions/reusable-python-setup_pixi/action.yml +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -21,10 +21,6 @@ inputs: runs: using: "composite" steps: - - name: Get full Python version - id: full-python-version - shell: bash - run: echo "version=$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))")" >> $GITHUB_OUTPUT - uses: prefix-dev/setup-pixi@v0.9.0 with: pixi-version: v0.54.1 From 0e197d322aee11b8384b2729430f31aa3d0210ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Thu, 4 Sep 2025 15:25:29 -0400 Subject: [PATCH 11/20] [DEVOPS-584] remove unused input from pixi shared action --- .github/actions/reusable-python-setup_pixi/action.yml | 8 -------- .github/workflows/reusable-python-pytest.yml | 2 -- .github/workflows/reusable-python-static_analysis.yml | 2 -- 3 files changed, 12 deletions(-) diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml index 45ee7ed7..30daea9d 100644 --- a/.github/actions/reusable-python-setup_pixi/action.yml +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -5,14 +5,6 @@ inputs: description: 'Cache number to reset cache if pixi.lock has not changed' required: true type: number - runner-os: - description: 'Runner OS' - required: true - type: string - virtual-repo-names: - description: 'Matrix of virtual repository names to resolve (eg. ["public-dev-pypi"])' - required: false - type: string JFROG_ARTIFACTORY_TOKEN: description: 'JFrog Artifactory Token' required: true diff --git a/.github/workflows/reusable-python-pytest.yml b/.github/workflows/reusable-python-pytest.yml index c2974c08..15521de6 100644 --- a/.github/workflows/reusable-python-pytest.yml +++ b/.github/workflows/reusable-python-pytest.yml @@ -115,8 +115,6 @@ jobs: name: Setup pixi env if: ${{ inputs.package-manager == 'pixi' }} with: - python-version: ${{ inputs.python-version }} - runner-os: ${{ runner.os }} - name: Run Pytest run: | diff --git a/.github/workflows/reusable-python-static_analysis.yml b/.github/workflows/reusable-python-static_analysis.yml index 5ede6c8b..e2df3cfb 100644 --- a/.github/workflows/reusable-python-static_analysis.yml +++ b/.github/workflows/reusable-python-static_analysis.yml @@ -101,8 +101,6 @@ jobs: name: Setup pixi env if: ${{ inputs.package-manager == 'pixi' }} with: - python-version: ${{ inputs.python-version }} - runner-os: ${{ runner.os }} - name: Capture modified files if: github.event_name == 'pull_request' From f2c66399887a0dd67ca85cb6fb85c0861d4ccd79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Thu, 4 Sep 2025 15:27:08 -0400 Subject: [PATCH 12/20] [DEVOPS-584] pass cache number to shared actions --- .github/actions/reusable-python-setup_conda/action.yml | 6 ++++++ .github/actions/reusable-python-setup_pixi/action.yml | 2 +- .github/workflows/reusable-python-pytest.yml | 4 +++- .github/workflows/reusable-python-static_analysis.yml | 8 +++++--- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/.github/actions/reusable-python-setup_conda/action.yml b/.github/actions/reusable-python-setup_conda/action.yml index 65c93b59..35942af8 100644 --- a/.github/actions/reusable-python-setup_conda/action.yml +++ b/.github/actions/reusable-python-setup_conda/action.yml @@ -1,6 +1,10 @@ name: Setup conda env description: Setup conda environment for Python inputs: + cache-number: + description: 'Cache number to reset cache if pixi.lock has not changed' + required: true + type: number python-version: description: 'Python version to use' required: true @@ -32,6 +36,7 @@ runs: micromamba-version: ${{ env.micromamba_version }} init-shell: bash cache-downloads: true + cache-downloads-key: micromamba-dl${{ inputs.cache-number }} environment-name: "" post-cleanup: none - name: Authenticate to Artifactory @@ -47,6 +52,7 @@ runs: environment-name: test_env init-shell: bash cache-downloads: true + cache-downloads-key: micromamba-dl${{ inputs.cache-number }} post-cleanup: none env: PYTHONUTF8: 1 diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml index 30daea9d..058c5b9a 100644 --- a/.github/actions/reusable-python-setup_pixi/action.yml +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -16,7 +16,7 @@ runs: - uses: prefix-dev/setup-pixi@v0.9.0 with: pixi-version: v0.54.1 - cache-key: K{{ inputs.cache-number }}- + cache-key: pixi-env${{ inputs.cache-number }} cache: true locked: true env: diff --git a/.github/workflows/reusable-python-pytest.yml b/.github/workflows/reusable-python-pytest.yml index 15521de6..36c37009 100644 --- a/.github/workflows/reusable-python-pytest.yml +++ b/.github/workflows/reusable-python-pytest.yml @@ -87,10 +87,11 @@ jobs: with: python-version: ${{ matrix.python-version }} - - uses: MiraGeoscience/CI-tools/.github/actions/reusable-python-setup_conda@main + - uses: MiraGeoscience/CI-tools/.github/actions/reusable-python-setup_conda@DEVOPS-584 name: Setup conda env if: ${{ inputs.package-manager == 'conda' }} with: + cache-number: ${{ inputs.cache-number }} python-version: ${{ matrix.python-version }} JFROG_ARTIFACTORY_URL: ${{ secrets.JFROG_ARTIFACTORY_URL }} JFROG_ARTIFACTORY_TOKEN: ${{ secrets.JFROG_ARTIFACTORY_TOKEN }} @@ -115,6 +116,7 @@ jobs: name: Setup pixi env if: ${{ inputs.package-manager == 'pixi' }} with: + cache-number: ${{ inputs.cache-number }} - name: Run Pytest run: | diff --git a/.github/workflows/reusable-python-static_analysis.yml b/.github/workflows/reusable-python-static_analysis.yml index e2df3cfb..a5ebf46a 100644 --- a/.github/workflows/reusable-python-static_analysis.yml +++ b/.github/workflows/reusable-python-static_analysis.yml @@ -73,10 +73,11 @@ jobs: with: python-version: ${{inputs.python-version}} - - uses: MiraGeoscience/CI-tools/.github/actions/reusable-python-setup_conda@main + - uses: MiraGeoscience/CI-tools/.github/actions/reusable-python-setup_conda@DEVOPS-584 name: Setup conda env if: ${{ inputs.package-manager == 'conda' }} with: + cache-number: ${{ inputs.cache-number }} python-version: ${{ inputs.python-version }} JFROG_ARTIFACTORY_URL: ${{ secrets.JFROG_ARTIFACTORY_URL }} JFROG_ARTIFACTORY_TOKEN: ${{ secrets.JFROG_ARTIFACTORY_TOKEN }} @@ -85,7 +86,7 @@ jobs: name: Setup poetry env if: ${{ inputs.package-manager == 'poetry' }} with: - cache-number: 1 + cache-number: ${{ inputs.cache-number }} runner-os: ${{ runner.os }} install-extras: ${{ inputs.install-extras }} virtual-repo-names: ${{ inputs.virtual-repo-names }} @@ -95,12 +96,13 @@ jobs: name: Setup hatch env if: ${{ inputs.package-manager == 'hatch' }} with: - cache-number: 1 + cache-number: ${{ inputs.cache-number }} runner-os: ${{ runner.os }} - uses: MiraGeoscience/CI-tools/.github/actions/reusable-python-setup_pixi@DEVOPS-584 name: Setup pixi env if: ${{ inputs.package-manager == 'pixi' }} with: + cache-number: ${{ inputs.cache-number }} - name: Capture modified files if: github.event_name == 'pull_request' From 4755d1675d10c51a103295eccecef8d98d7e5265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Thu, 4 Sep 2025 15:29:08 -0400 Subject: [PATCH 13/20] [DEVOPS-584] aesthetics --- .github/workflows/reusable-python-pytest.yml | 3 ++- .github/workflows/reusable-python-static_analysis.yml | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/reusable-python-pytest.yml b/.github/workflows/reusable-python-pytest.yml index 36c37009..96e19bc4 100644 --- a/.github/workflows/reusable-python-pytest.yml +++ b/.github/workflows/reusable-python-pytest.yml @@ -37,7 +37,7 @@ on: required: false type: string virtual-repo-names: - description: 'List of repository names to publish on (e.g. ["public-dev-pypi"])' + description: 'List of repository names to resolve on (e.g. ["public-dev-pypi"])' required: false type: string lfs: @@ -112,6 +112,7 @@ jobs: with: cache-number: ${{ inputs.cache-number }} runner-os: ${{ runner.os }} + - uses: MiraGeoscience/CI-tools/.github/actions/reusable-python-setup_pixi@DEVOPS-584 name: Setup pixi env if: ${{ inputs.package-manager == 'pixi' }} diff --git a/.github/workflows/reusable-python-static_analysis.yml b/.github/workflows/reusable-python-static_analysis.yml index a5ebf46a..a09a95df 100644 --- a/.github/workflows/reusable-python-static_analysis.yml +++ b/.github/workflows/reusable-python-static_analysis.yml @@ -68,6 +68,7 @@ jobs: with: lfs: ${{ inputs.lfs }} fetch-depth: 0 + - name: Set up Python version uses: actions/setup-python@v5 with: @@ -98,6 +99,7 @@ jobs: with: cache-number: ${{ inputs.cache-number }} runner-os: ${{ runner.os }} + - uses: MiraGeoscience/CI-tools/.github/actions/reusable-python-setup_pixi@DEVOPS-584 name: Setup pixi env if: ${{ inputs.package-manager == 'pixi' }} From 516a1c0ac44557eb93fe5706fccdae65c62a9259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Thu, 4 Sep 2025 15:32:27 -0400 Subject: [PATCH 14/20] [DEVOPS-584] input for pixi env --- .github/actions/reusable-python-setup_pixi/action.yml | 5 +++++ .github/workflows/reusable-python-pytest.yml | 1 + .github/workflows/reusable-python-static_analysis.yml | 1 + 3 files changed, 7 insertions(+) diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml index 058c5b9a..0a6dd57a 100644 --- a/.github/actions/reusable-python-setup_pixi/action.yml +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -5,6 +5,10 @@ inputs: description: 'Cache number to reset cache if pixi.lock has not changed' required: true type: number + pixi-env: + description: 'Name of the pixi environment to create' + required: true + type: string JFROG_ARTIFACTORY_TOKEN: description: 'JFrog Artifactory Token' required: true @@ -16,6 +20,7 @@ runs: - uses: prefix-dev/setup-pixi@v0.9.0 with: pixi-version: v0.54.1 + environment: ${{ inputs.pixi-env }} cache-key: pixi-env${{ inputs.cache-number }} cache: true locked: true diff --git a/.github/workflows/reusable-python-pytest.yml b/.github/workflows/reusable-python-pytest.yml index 96e19bc4..4ace7853 100644 --- a/.github/workflows/reusable-python-pytest.yml +++ b/.github/workflows/reusable-python-pytest.yml @@ -118,6 +118,7 @@ jobs: if: ${{ inputs.package-manager == 'pixi' }} with: cache-number: ${{ inputs.cache-number }} + pixi-env: ${{ inputs.python-version }} - name: Run Pytest run: | diff --git a/.github/workflows/reusable-python-static_analysis.yml b/.github/workflows/reusable-python-static_analysis.yml index a09a95df..c66896a8 100644 --- a/.github/workflows/reusable-python-static_analysis.yml +++ b/.github/workflows/reusable-python-static_analysis.yml @@ -105,6 +105,7 @@ jobs: if: ${{ inputs.package-manager == 'pixi' }} with: cache-number: ${{ inputs.cache-number }} + pixi-env: ${{ inputs.python-version }} - name: Capture modified files if: github.event_name == 'pull_request' From c6a8f01c291573f323a93288bbe8c3962dc65a12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Thu, 4 Sep 2025 15:33:55 -0400 Subject: [PATCH 15/20] [DEVOPS-584] pass credentials to pixi for Artifactory --- .github/actions/reusable-python-setup_pixi/action.yml | 7 +++++++ .github/workflows/reusable-python-pytest.yml | 2 ++ .github/workflows/reusable-python-static_analysis.yml | 2 ++ 3 files changed, 11 insertions(+) diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml index 0a6dd57a..fcc1c3c5 100644 --- a/.github/actions/reusable-python-setup_pixi/action.yml +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -9,6 +9,10 @@ inputs: description: 'Name of the pixi environment to create' required: true type: string + JFROG_ARTIFACTORY_URL: + description: 'JFrog Artifactory URL' + required: true + type: string JFROG_ARTIFACTORY_TOKEN: description: 'JFrog Artifactory Token' required: true @@ -24,5 +28,8 @@ runs: cache-key: pixi-env${{ inputs.cache-number }} cache: true locked: true + auth-host: ${{ inputs.JFROG_ARTIFACTORY_URL }} + auth-username: github + auth-password: ${{ inputs.JFROG_ARTIFACTORY_TOKEN }} env: GIT_LFS_SKIP_SMUDGE: 1 diff --git a/.github/workflows/reusable-python-pytest.yml b/.github/workflows/reusable-python-pytest.yml index 4ace7853..cfb4a938 100644 --- a/.github/workflows/reusable-python-pytest.yml +++ b/.github/workflows/reusable-python-pytest.yml @@ -119,6 +119,8 @@ jobs: with: cache-number: ${{ inputs.cache-number }} pixi-env: ${{ inputs.python-version }} + JFROG_ARTIFACTORY_URL: ${{ secrets.JFROG_ARTIFACTORY_URL }} + JFROG_ARTIFACTORY_TOKEN: ${{ secrets.JFROG_ARTIFACTORY_TOKEN }} - name: Run Pytest run: | diff --git a/.github/workflows/reusable-python-static_analysis.yml b/.github/workflows/reusable-python-static_analysis.yml index c66896a8..6c3ecc90 100644 --- a/.github/workflows/reusable-python-static_analysis.yml +++ b/.github/workflows/reusable-python-static_analysis.yml @@ -106,6 +106,8 @@ jobs: with: cache-number: ${{ inputs.cache-number }} pixi-env: ${{ inputs.python-version }} + JFROG_ARTIFACTORY_URL: ${{ secrets.JFROG_ARTIFACTORY_URL }} + JFROG_ARTIFACTORY_TOKEN: ${{ secrets.JFROG_ARTIFACTORY_TOKEN }} - name: Capture modified files if: github.event_name == 'pull_request' From 49e2b3020f4f165b00b7d112ffbb2e5911ed1c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Thu, 4 Sep 2025 16:32:43 -0400 Subject: [PATCH 16/20] [DEVOPS-584] fix wrong input description --- .github/actions/reusable-python-setup_conda/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/reusable-python-setup_conda/action.yml b/.github/actions/reusable-python-setup_conda/action.yml index 35942af8..d474c139 100644 --- a/.github/actions/reusable-python-setup_conda/action.yml +++ b/.github/actions/reusable-python-setup_conda/action.yml @@ -2,7 +2,7 @@ name: Setup conda env description: Setup conda environment for Python inputs: cache-number: - description: 'Cache number to reset cache if pixi.lock has not changed' + description: 'Cache number to reset cache if conda lock file has not changed' required: true type: number python-version: From a45e21cbab6a351660ff9ffa7776306e8834336c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Thu, 4 Sep 2025 16:20:34 -0400 Subject: [PATCH 17/20] [DEVOPS-584] convert python verion to pixi env name --- .../actions/reusable-python-setup_pixi/action.yml | 14 +++++++++++--- .github/workflows/reusable-python-pytest.yml | 2 +- .../workflows/reusable-python-static_analysis.yml | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml index fcc1c3c5..cc3510af 100644 --- a/.github/actions/reusable-python-setup_pixi/action.yml +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -5,8 +5,8 @@ inputs: description: 'Cache number to reset cache if pixi.lock has not changed' required: true type: number - pixi-env: - description: 'Name of the pixi environment to create' + python-version: + description: 'Python version to decide on the pixi environment to install' required: true type: string JFROG_ARTIFACTORY_URL: @@ -21,10 +21,18 @@ inputs: runs: using: "composite" steps: + - id: get-env-name + name: Get pixi environment name + shell: bash + env: + PYTHON_VERSION: ${{ inputs.python-version }} + run: | + pixi_env="py${PYTHON_VERSION//./}" + echo "pixi-env=$pixi_env" >> "$GITHUB_OUTPUT" - uses: prefix-dev/setup-pixi@v0.9.0 with: pixi-version: v0.54.1 - environment: ${{ inputs.pixi-env }} + environments: ${{ steps.get-env-name.outputs.pixi-env }} cache-key: pixi-env${{ inputs.cache-number }} cache: true locked: true diff --git a/.github/workflows/reusable-python-pytest.yml b/.github/workflows/reusable-python-pytest.yml index cfb4a938..ab8a0658 100644 --- a/.github/workflows/reusable-python-pytest.yml +++ b/.github/workflows/reusable-python-pytest.yml @@ -118,7 +118,7 @@ jobs: if: ${{ inputs.package-manager == 'pixi' }} with: cache-number: ${{ inputs.cache-number }} - pixi-env: ${{ inputs.python-version }} + python-version: ${{ matrix.python-version }} JFROG_ARTIFACTORY_URL: ${{ secrets.JFROG_ARTIFACTORY_URL }} JFROG_ARTIFACTORY_TOKEN: ${{ secrets.JFROG_ARTIFACTORY_TOKEN }} diff --git a/.github/workflows/reusable-python-static_analysis.yml b/.github/workflows/reusable-python-static_analysis.yml index 6c3ecc90..0ed54b90 100644 --- a/.github/workflows/reusable-python-static_analysis.yml +++ b/.github/workflows/reusable-python-static_analysis.yml @@ -105,7 +105,7 @@ jobs: if: ${{ inputs.package-manager == 'pixi' }} with: cache-number: ${{ inputs.cache-number }} - pixi-env: ${{ inputs.python-version }} + python-version: ${{ inputs.python-version }} JFROG_ARTIFACTORY_URL: ${{ secrets.JFROG_ARTIFACTORY_URL }} JFROG_ARTIFACTORY_TOKEN: ${{ secrets.JFROG_ARTIFACTORY_TOKEN }} From ca1af4edb68dc94d2ac08fca6b5966550b48bbf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Thu, 4 Sep 2025 17:28:25 -0400 Subject: [PATCH 18/20] [DEVOPS-584] accessing Artifactory is not necessarily required for pixi depends on repos --- .github/actions/reusable-python-setup_pixi/action.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml index cc3510af..023baa31 100644 --- a/.github/actions/reusable-python-setup_pixi/action.yml +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -7,7 +7,7 @@ inputs: type: number python-version: description: 'Python version to decide on the pixi environment to install' - required: true + required: false type: string JFROG_ARTIFACTORY_URL: description: 'JFrog Artifactory URL' @@ -15,7 +15,7 @@ inputs: type: string JFROG_ARTIFACTORY_TOKEN: description: 'JFrog Artifactory Token' - required: true + required: false type: string runs: @@ -37,7 +37,7 @@ runs: cache: true locked: true auth-host: ${{ inputs.JFROG_ARTIFACTORY_URL }} - auth-username: github + auth-username: ${{ inputs.JFROG_ARTIFACTORY_TOKEN && 'github' || '' }} auth-password: ${{ inputs.JFROG_ARTIFACTORY_TOKEN }} env: GIT_LFS_SKIP_SMUDGE: 1 From 22e1e54e5aa8ba6c12ef51982ab6e37eadb7f050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Thu, 4 Sep 2025 18:00:26 -0400 Subject: [PATCH 19/20] [DEVOPS-584] activate the pixi environment so that subsequent calls to pixi run do not fall back to the default env --- .github/actions/reusable-python-setup_pixi/action.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/actions/reusable-python-setup_pixi/action.yml b/.github/actions/reusable-python-setup_pixi/action.yml index 023baa31..aacbfbf2 100644 --- a/.github/actions/reusable-python-setup_pixi/action.yml +++ b/.github/actions/reusable-python-setup_pixi/action.yml @@ -33,6 +33,7 @@ runs: with: pixi-version: v0.54.1 environments: ${{ steps.get-env-name.outputs.pixi-env }} + activate-environment: true cache-key: pixi-env${{ inputs.cache-number }} cache: true locked: true From e6176e0e159b7ac20c5cac84a1c54c98295f6265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hensgen?= Date: Thu, 4 Sep 2025 18:15:47 -0400 Subject: [PATCH 20/20] [DEVOPS-584] pixi and micromamba do not need a pre-installed python --- .github/workflows/reusable-python-pytest.yml | 1 + .github/workflows/reusable-python-static_analysis.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/reusable-python-pytest.yml b/.github/workflows/reusable-python-pytest.yml index ab8a0658..1b471004 100644 --- a/.github/workflows/reusable-python-pytest.yml +++ b/.github/workflows/reusable-python-pytest.yml @@ -84,6 +84,7 @@ jobs: - name: Set up Python version uses: actions/setup-python@v5 + if: ${{ inputs.package-manager == 'poetry' || inputs.package-manager == 'hatch' }} with: python-version: ${{ matrix.python-version }} diff --git a/.github/workflows/reusable-python-static_analysis.yml b/.github/workflows/reusable-python-static_analysis.yml index 0ed54b90..957e5e7a 100644 --- a/.github/workflows/reusable-python-static_analysis.yml +++ b/.github/workflows/reusable-python-static_analysis.yml @@ -71,6 +71,7 @@ jobs: - name: Set up Python version uses: actions/setup-python@v5 + if: ${{ inputs.package-manager == 'poetry' || inputs.package-manager == 'hatch' }} with: python-version: ${{inputs.python-version}}