From 8e9901f1d5b688ae49e6ac6388f8118d6e9bce1a Mon Sep 17 00:00:00 2001 From: Juanpe Araque Date: Thu, 7 May 2026 11:43:22 +0200 Subject: [PATCH] Unify ddev workflow installs with uv cache --- .github/actions/setup-ddev/action.yml | 190 ++++++++++++++++++ .github/workflows/build-ddev.yml | 12 +- .github/workflows/docs.yml | 11 +- .../workflows/measure-disk-usage-master.yml | 7 +- .github/workflows/measure-disk-usage.yml | 9 +- .github/workflows/pr-all-windows.yml | 1 + .github/workflows/pr-all.yml | 1 + .github/workflows/release-base.yml | 7 +- .github/workflows/release-dev.yml | 7 +- .github/workflows/release-dispatch.yml | 29 ++- .github/workflows/run-validations.yml | 22 +- .github/workflows/test-fips-e2e.yml | 27 +-- .github/workflows/test-target.yml | 33 +-- .github/workflows/update-agent-changelog.yml | 7 +- .github/workflows/update-dependencies.yml | 7 +- .github/workflows/upgrade-python-version.yml | 7 +- 16 files changed, 286 insertions(+), 91 deletions(-) create mode 100644 .github/actions/setup-ddev/action.yml diff --git a/.github/actions/setup-ddev/action.yml b/.github/actions/setup-ddev/action.yml new file mode 100644 index 0000000000000..f2220e330bd59 --- /dev/null +++ b/.github/actions/setup-ddev/action.yml @@ -0,0 +1,190 @@ +name: Setup ddev +description: Install uv, restore the shared Python dependency cache, and install ddev. + +inputs: + install-mode: + description: >- + Install source for ddev. Allowed values: local (install editable ddev and + datadog_checks_dev from this checkout), pypi (install ddev from PyPI). + required: false + default: local + cache-profile: + description: >- + Cache key profile to restore for local installs. Ignored when install-mode + is pypi. Allowed values: local-ddev-base (local ddev, datadog_checks_dev, + and datadog_checks_base dependencies), local-ddev (local ddev and + datadog_checks_dev dependencies). + required: false + default: local-ddev-base + ddev-version: + description: Optional PyPI ddev version specifier, for example ==16.0.0. + required: false + default: "" + +runs: + using: composite + steps: + - name: Validate inputs + shell: bash + env: + CACHE_PROFILE: ${{ inputs.cache-profile }} + INSTALL_MODE: ${{ inputs.install-mode }} + run: |- + case "$INSTALL_MODE" in + local|pypi) ;; + *) + echo "::error::Invalid install-mode '$INSTALL_MODE'. Allowed values: local, pypi." + exit 1 + ;; + esac + + case "$CACHE_PROFILE" in + local-ddev-base|local-ddev) ;; + *) + echo "::error::Invalid cache-profile '$CACHE_PROFILE'. Allowed values: local-ddev-base, local-ddev." + exit 1 + ;; + esac + + - name: Compute cache date + id: cache-date + shell: bash + run: echo "date=$(date -u +%Y-%m-%d)" >> "$GITHUB_OUTPUT" + + - name: Install uv + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 + with: + enable-cache: false + + - name: Restore local ddev cache + if: ${{ inputs.install-mode == 'local' && inputs.cache-profile == 'local-ddev-base' }} + id: restore-local-ddev-base-cache + uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + with: + path: | + ${{ runner.os == 'Windows' && '~\AppData\Local\uv\cache' || runner.os == 'macOS' && '~/Library/Caches/uv' || '~/.cache/uv' }} + ${{ runner.os == 'Windows' && '~\AppData\Local\pip\Cache' || runner.os == 'macOS' && '~/Library/Caches/pip' || '~/.cache/pip' }} + key: >- + ${{ format( + 'v02-uv-{0}-{1}-{2}-{3}-{4}', + env.pythonLocation, + hashFiles('datadog_checks_base/pyproject.toml'), + hashFiles('datadog_checks_dev/pyproject.toml'), + hashFiles('ddev/pyproject.toml'), + steps.cache-date.outputs.date + )}} + restore-keys: |- + ${{ format( + 'v02-uv-{0}-{1}-{2}-{3}-', + env.pythonLocation, + hashFiles('datadog_checks_base/pyproject.toml'), + hashFiles('datadog_checks_dev/pyproject.toml'), + hashFiles('ddev/pyproject.toml') + )}} + ${{ format( + 'v02-uv-{0}-{1}-{2}-{3}', + env.pythonLocation, + hashFiles('datadog_checks_base/pyproject.toml'), + hashFiles('datadog_checks_dev/pyproject.toml'), + hashFiles('ddev/pyproject.toml') + )}} + v02-uv-${{ env.pythonLocation }} + + - name: Restore local ddev cache without base package + if: ${{ inputs.install-mode == 'local' && inputs.cache-profile == 'local-ddev' }} + id: restore-local-ddev-cache + uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + with: + path: | + ${{ runner.os == 'Windows' && '~\AppData\Local\uv\cache' || runner.os == 'macOS' && '~/Library/Caches/uv' || '~/.cache/uv' }} + ${{ runner.os == 'Windows' && '~\AppData\Local\pip\Cache' || runner.os == 'macOS' && '~/Library/Caches/pip' || '~/.cache/pip' }} + key: >- + ${{ format( + 'v02-uv-local-ddev-{0}-{1}-{2}-{3}', + env.pythonLocation, + hashFiles('datadog_checks_dev/pyproject.toml'), + hashFiles('ddev/pyproject.toml'), + steps.cache-date.outputs.date + )}} + restore-keys: |- + ${{ format( + 'v02-uv-local-ddev-{0}-{1}-{2}-', + env.pythonLocation, + hashFiles('datadog_checks_dev/pyproject.toml'), + hashFiles('ddev/pyproject.toml') + )}} + ${{ format( + 'v02-uv-local-ddev-{0}-{1}-{2}', + env.pythonLocation, + hashFiles('datadog_checks_dev/pyproject.toml'), + hashFiles('ddev/pyproject.toml') + )}} + v02-uv-local-ddev-${{ env.pythonLocation }} + + - name: Restore PyPI ddev cache + if: ${{ inputs.install-mode == 'pypi' }} + id: restore-pypi-ddev-cache + uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + with: + path: | + ${{ runner.os == 'Windows' && '~\AppData\Local\uv\cache' || runner.os == 'macOS' && '~/Library/Caches/uv' || '~/.cache/uv' }} + ${{ runner.os == 'Windows' && '~\AppData\Local\pip\Cache' || runner.os == 'macOS' && '~/Library/Caches/pip' || '~/.cache/pip' }} + key: >- + ${{ format( + 'v02-uv-pypi-ddev-{0}-{1}-{2}', + env.pythonLocation, + inputs.ddev-version || 'latest', + steps.cache-date.outputs.date + )}} + restore-keys: |- + ${{ format( + 'v02-uv-pypi-ddev-{0}-{1}-', + env.pythonLocation, + inputs.ddev-version || 'latest' + )}} + ${{ format( + 'v02-uv-pypi-ddev-{0}-{1}', + env.pythonLocation, + inputs.ddev-version || 'latest' + )}} + v02-uv-pypi-ddev-${{ env.pythonLocation }} + + - name: Install ddev from local folder + if: ${{ inputs.install-mode == 'local' }} + shell: bash + run: uv pip install --system -e ./datadog_checks_dev[cli] -e ./ddev + + - name: Install ddev from PyPI + if: ${{ inputs.install-mode == 'pypi' }} + shell: bash + run: uv pip install --system "ddev${{ inputs.ddev-version }}" + + - name: Save local ddev cache + if: ${{ inputs.install-mode == 'local' && inputs.cache-profile == 'local-ddev-base' && steps.restore-local-ddev-base-cache.outputs.cache-hit != 'true' }} + uses: actions/cache/save@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + continue-on-error: true + with: + path: | + ${{ runner.os == 'Windows' && '~\AppData\Local\uv\cache' || runner.os == 'macOS' && '~/Library/Caches/uv' || '~/.cache/uv' }} + ${{ runner.os == 'Windows' && '~\AppData\Local\pip\Cache' || runner.os == 'macOS' && '~/Library/Caches/pip' || '~/.cache/pip' }} + key: ${{ steps.restore-local-ddev-base-cache.outputs.cache-primary-key }} + + - name: Save local ddev cache without base package + if: ${{ inputs.install-mode == 'local' && inputs.cache-profile == 'local-ddev' && steps.restore-local-ddev-cache.outputs.cache-hit != 'true' }} + uses: actions/cache/save@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + continue-on-error: true + with: + path: | + ${{ runner.os == 'Windows' && '~\AppData\Local\uv\cache' || runner.os == 'macOS' && '~/Library/Caches/uv' || '~/.cache/uv' }} + ${{ runner.os == 'Windows' && '~\AppData\Local\pip\Cache' || runner.os == 'macOS' && '~/Library/Caches/pip' || '~/.cache/pip' }} + key: ${{ steps.restore-local-ddev-cache.outputs.cache-primary-key }} + + - name: Save PyPI ddev cache + if: ${{ inputs.install-mode == 'pypi' && steps.restore-pypi-ddev-cache.outputs.cache-hit != 'true' }} + uses: actions/cache/save@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + continue-on-error: true + with: + path: | + ${{ runner.os == 'Windows' && '~\AppData\Local\uv\cache' || runner.os == 'macOS' && '~/Library/Caches/uv' || '~/.cache/uv' }} + ${{ runner.os == 'Windows' && '~\AppData\Local\pip\Cache' || runner.os == 'macOS' && '~/Library/Caches/pip' || '~/.cache/pip' }} + key: ${{ steps.restore-pypi-ddev-cache.outputs.cache-primary-key }} diff --git a/.github/workflows/build-ddev.yml b/.github/workflows/build-ddev.yml index bcbc25f5de560..5befc7977a069 100644 --- a/.github/workflows/build-ddev.yml +++ b/.github/workflows/build-ddev.yml @@ -738,16 +738,12 @@ jobs: with: python-version: "${{ env.PYTHON_VERSION }}" - - name: Install uv - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 - continue-on-error: true - with: - enable-cache: false - - name: Install ddev from local folder continue-on-error: true - working-directory: . - run: uv pip install --system -e ./datadog_checks_dev[cli] -e ./ddev + uses: ./.github/actions/setup-ddev + with: + install-mode: local + cache-profile: local-ddev-base - name: Configure ddev continue-on-error: true diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 7af1c81002bec..d7b336a2970d7 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -34,14 +34,11 @@ jobs: with: python-version: '3.13' - - name: Install uv - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 - with: - enable-cache: false - - name: Install ddev - run: | - uv pip install --system -e ./datadog_checks_dev[cli] -e ./ddev + uses: ./.github/actions/setup-ddev + with: + install-mode: local + cache-profile: local-ddev-base - name: Configure ddev run: | diff --git a/.github/workflows/measure-disk-usage-master.yml b/.github/workflows/measure-disk-usage-master.yml index 6819f5ca0978a..11cb94025d78e 100644 --- a/.github/workflows/measure-disk-usage-master.yml +++ b/.github/workflows/measure-disk-usage-master.yml @@ -40,9 +40,10 @@ jobs: policy: integrations-core-api-key - name: Install ddev - run: | - pip install -e ./datadog_checks_dev[cli] - pip install -e ./ddev + uses: ./.github/actions/setup-ddev + with: + install-mode: local + cache-profile: local-ddev-base - name: Configure ddev run: ddev config override diff --git a/.github/workflows/measure-disk-usage.yml b/.github/workflows/measure-disk-usage.yml index 69c2636eac520..9eae11fd8a032 100644 --- a/.github/workflows/measure-disk-usage.yml +++ b/.github/workflows/measure-disk-usage.yml @@ -36,9 +36,10 @@ jobs: policy: integrations-core-api-key - name: Install ddev - run: | - pip install -e ./datadog_checks_dev[cli] - pip install -e ./ddev + uses: ./.github/actions/setup-ddev + with: + install-mode: local + cache-profile: local-ddev-base - name: Configure ddev run: | @@ -85,4 +86,4 @@ jobs: with: name: status_compressed.json path: status_compressed.json - if-no-files-found: error \ No newline at end of file + if-no-files-found: error diff --git a/.github/workflows/pr-all-windows.yml b/.github/workflows/pr-all-windows.yml index 65dec48ff97eb..8f1d9c0e34268 100644 --- a/.github/workflows/pr-all-windows.yml +++ b/.github/workflows/pr-all-windows.yml @@ -15,6 +15,7 @@ on: - '.github/workflows/test-all-windows.yml' # Also run in the action to install test-target scripts changes - '.github/actions/setup-test-target-scripts/**' + - '.github/actions/setup-ddev/**' concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.head_ref }} diff --git a/.github/workflows/pr-all.yml b/.github/workflows/pr-all.yml index f0a1cd4c8453d..9ea6dce99667e 100644 --- a/.github/workflows/pr-all.yml +++ b/.github/workflows/pr-all.yml @@ -16,6 +16,7 @@ on: - '.github/workflows/test-all.yml' # Also run if the action to install test-target scripts changes - '.github/actions/setup-test-target-scripts/**' + - '.github/actions/setup-ddev/**' concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.head_ref }} diff --git a/.github/workflows/release-base.yml b/.github/workflows/release-base.yml index e68c928595e75..5b69a40a302bf 100644 --- a/.github/workflows/release-base.yml +++ b/.github/workflows/release-base.yml @@ -26,9 +26,10 @@ jobs: run: pip install --disable-pip-version-check --upgrade pip setuptools wheel - name: Install ddev - run: | - pip install -e ./datadog_checks_dev[cli] - pip install -e ./ddev + uses: ./.github/actions/setup-ddev + with: + install-mode: local + cache-profile: local-ddev-base - name: Configure ddev run: | diff --git a/.github/workflows/release-dev.yml b/.github/workflows/release-dev.yml index 7d1494950a0d1..d56e87ed280f9 100644 --- a/.github/workflows/release-dev.yml +++ b/.github/workflows/release-dev.yml @@ -26,9 +26,10 @@ jobs: run: pip install --disable-pip-version-check --upgrade pip setuptools wheel - name: Install ddev - run: | - pip install -e ./datadog_checks_dev[cli] - pip install -e ./ddev + uses: ./.github/actions/setup-ddev + with: + install-mode: local + cache-profile: local-ddev-base - name: Configure ddev run: | diff --git a/.github/workflows/release-dispatch.yml b/.github/workflows/release-dispatch.yml index 6922d20a8ce59..9569ecdffe094 100644 --- a/.github/workflows/release-dispatch.yml +++ b/.github/workflows/release-dispatch.yml @@ -44,6 +44,7 @@ env: # Default ddev version when callers don't pass `ddev-version`. Tracked by Renovate. # renovate: datasource=pypi depName=ddev DEFAULT_DDEV_VERSION: "16.0.0" + PYTHON_VERSION: "3.13" jobs: prepare: @@ -59,8 +60,34 @@ jobs: with: fetch-depth: 0 # ddev needs full tag history + - name: Checkout integrations-core actions + if: github.repository != 'DataDog/integrations-core' + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + repository: "DataDog/integrations-core" + ref: master + fetch-depth: 1 + sparse-checkout: .github/actions + path: core-temp + + - name: Set up Python ${{ env.PYTHON_VERSION }} + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + with: + python-version: "${{ env.PYTHON_VERSION }}" + - name: Install ddev - run: pip install "ddev==${{ inputs.ddev-version || env.DEFAULT_DDEV_VERSION }}" + if: github.repository == 'DataDog/integrations-core' + uses: ./.github/actions/setup-ddev + with: + install-mode: pypi + ddev-version: "==${{ inputs.ddev-version || env.DEFAULT_DDEV_VERSION }}" + + - name: Install ddev + if: github.repository != 'DataDog/integrations-core' + uses: ./core-temp/.github/actions/setup-ddev + with: + install-mode: pypi + ddev-version: "==${{ inputs.ddev-version || env.DEFAULT_DDEV_VERSION }}" - name: Configure ddev env: diff --git a/.github/workflows/run-validations.yml b/.github/workflows/run-validations.yml index f22bf83de6273..eb26fb7f41d06 100644 --- a/.github/workflows/run-validations.yml +++ b/.github/workflows/run-validations.yml @@ -33,6 +33,16 @@ jobs: with: fetch-depth: "0" + - name: Checkout integrations-core actions + if: inputs.repo != 'core' + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + repository: "DataDog/integrations-core" + ref: master + fetch-depth: 1 + sparse-checkout: .github/actions + path: core-temp + - name: Set up Python ${{ env.PYTHON_VERSION }} uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: @@ -40,13 +50,17 @@ jobs: - name: Install ddev from local folder if: inputs.repo == 'core' - run: |- - pip install -e ./datadog_checks_dev[cli] - pip install -e ./ddev + uses: ./.github/actions/setup-ddev + with: + install-mode: local + cache-profile: local-ddev-base - name: Install ddev from PyPI if: inputs.repo != 'core' - run: pip install ddev${{ inputs.ddev-version }} + uses: ./core-temp/.github/actions/setup-ddev + with: + install-mode: pypi + ddev-version: ${{ inputs.ddev-version }} - name: Configure ddev run: | diff --git a/.github/workflows/test-fips-e2e.yml b/.github/workflows/test-fips-e2e.yml index 8d69c918b5a79..1035573ea9424 100644 --- a/.github/workflows/test-fips-e2e.yml +++ b/.github/workflows/test-fips-e2e.yml @@ -64,27 +64,6 @@ jobs: with: python-version: "${{ env.PYTHON_VERSION }}" - - name: Install uv - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 - with: - enable-cache: false - - - name: Restore cache - uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 - with: - path: | - ~/.cache/uv - ~/.cache/pip - key: >- - ${{ format( - 'v02-uv-{0}-{1}-{2}-{3}', - env.pythonLocation, - hashFiles('datadog_checks_base/pyproject.toml'), - hashFiles('datadog_checks_dev/pyproject.toml'), - hashFiles('ddev/pyproject.toml') - )}} - restore-keys: |- - v02-uv-${{ env.pythonLocation }} - name: Get Datadog credentials id: dd-sts uses: DataDog/dd-sts-action@2e8187910199bd93129520183c093e19aa585c75 # v1.0.0 @@ -92,8 +71,10 @@ jobs: policy: integrations-core-api-key - name: Install ddev from local folder - run: |- - uv pip install --system -e ./datadog_checks_dev[cli] -e ./ddev + uses: ./.github/actions/setup-ddev + with: + install-mode: local + cache-profile: local-ddev-base - name: Configure ddev run: |- diff --git a/.github/workflows/test-target.yml b/.github/workflows/test-target.yml index 4ff4131a3c91f..64ebc87d596f4 100644 --- a/.github/workflows/test-target.yml +++ b/.github/workflows/test-target.yml @@ -258,37 +258,18 @@ jobs: with: python-version: "${{ env.PYTHON_VERSION }}" - - name: Install uv - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 - with: - enable-cache: false - - - name: Restore cache - if: inputs.repo == 'core' - uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 - with: - path: | - ${{ runner.os == 'Windows' && '~\AppData\Local\uv\cache' || runner.os == 'macOS' && '~/Library/Caches/uv' || '~/.cache/uv' }} - ${{ runner.os == 'Windows' && '~\AppData\Local\pip\Cache' || runner.os == 'macOS' && '~/Library/Caches/pip' || '~/.cache/pip' }} - key: >- - ${{ format( - 'v02-uv-{0}-{1}-{2}-{3}', - env.pythonLocation, - hashFiles('datadog_checks_base/pyproject.toml'), - hashFiles('datadog_checks_dev/pyproject.toml'), - hashFiles('ddev/pyproject.toml') - )}} - restore-keys: |- - v02-uv-${{ env.pythonLocation }} - - name: Install ddev from local folder if: inputs.repo == 'core' - run: |- - uv pip install --system -e ./datadog_checks_dev[cli] -e ./ddev + uses: ./.github/actions/setup-ddev + with: + install-mode: local + cache-profile: local-ddev-base - name: Install ddev from PyPI if: inputs.repo != 'core' - run: uv pip install --system ddev + uses: ./core-temp/.github/actions/setup-ddev + with: + install-mode: pypi - name: Configure ddev run: |- diff --git a/.github/workflows/update-agent-changelog.yml b/.github/workflows/update-agent-changelog.yml index 0311b10dbbb31..069bf057c5393 100644 --- a/.github/workflows/update-agent-changelog.yml +++ b/.github/workflows/update-agent-changelog.yml @@ -23,9 +23,10 @@ jobs: with: python-version: 3.13 - name: Install ddev from local folder - run: |- - pip install -e ./datadog_checks_dev[cli] - pip install -e ./ddev + uses: ./.github/actions/setup-ddev + with: + install-mode: local + cache-profile: local-ddev-base - name: Configure ddev run: |- ddev config set upgrade_check false diff --git a/.github/workflows/update-dependencies.yml b/.github/workflows/update-dependencies.yml index b9db7c974048e..f0c3a42b68a47 100644 --- a/.github/workflows/update-dependencies.yml +++ b/.github/workflows/update-dependencies.yml @@ -24,9 +24,10 @@ jobs: with: python-version: 3.13 - name: Install ddev from local folder - run: |- - pip install -e ./datadog_checks_dev[cli] - pip install -e ./ddev + uses: ./.github/actions/setup-ddev + with: + install-mode: local + cache-profile: local-ddev-base - name: Configure ddev run: |- ddev config set upgrade_check false diff --git a/.github/workflows/upgrade-python-version.yml b/.github/workflows/upgrade-python-version.yml index 77e39cce55581..bce4ee5ba8666 100644 --- a/.github/workflows/upgrade-python-version.yml +++ b/.github/workflows/upgrade-python-version.yml @@ -23,9 +23,10 @@ jobs: with: python-version: 3.13 - name: Install ddev from local folder - run: |- - pip install -e ./datadog_checks_dev[cli] - pip install -e ./ddev + uses: ./.github/actions/setup-ddev + with: + install-mode: local + cache-profile: local-ddev-base - name: Configure ddev run: |- ddev config set upgrade_check false