From b1a6e403fb60bcd36910a3f1bc5b60d6733e32ad Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Thu, 11 Sep 2025 18:44:43 +0200 Subject: [PATCH] Cache apt install [ci] (#152113) --- .github/workflows/ci.yaml | 126 +++++++++++++++++++++++++++++++++++--- 1 file changed, 118 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 2c510af307a..0d465f428a6 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -37,7 +37,7 @@ on: type: boolean env: - CACHE_VERSION: 7 + CACHE_VERSION: 8 UV_CACHE_VERSION: 1 MYPY_CACHE_VERSION: 1 HA_SHORT_VERSION: "2025.10" @@ -61,6 +61,9 @@ env: POSTGRESQL_VERSIONS: "['postgres:12.14','postgres:15.2']" PRE_COMMIT_CACHE: ~/.cache/pre-commit UV_CACHE_DIR: /tmp/uv-cache + APT_CACHE_BASE: /home/runner/work/apt + APT_CACHE_DIR: /home/runner/work/apt/cache + APT_LIST_CACHE_DIR: /home/runner/work/apt/lists SQLALCHEMY_WARN_20: 1 PYTHONASYNCIODEBUG: 1 HASS_CI: 1 @@ -78,6 +81,7 @@ jobs: core: ${{ steps.core.outputs.changes }} integrations_glob: ${{ steps.info.outputs.integrations_glob }} integrations: ${{ steps.integrations.outputs.changes }} + apt_cache_key: ${{ steps.generate_apt_cache_key.outputs.key }} pre-commit_cache_key: ${{ steps.generate_pre-commit_cache_key.outputs.key }} python_cache_key: ${{ steps.generate_python_cache_key.outputs.key }} requirements: ${{ steps.core.outputs.requirements }} @@ -111,6 +115,10 @@ jobs: run: >- echo "key=pre-commit-${{ env.CACHE_VERSION }}-${{ hashFiles('.pre-commit-config.yaml') }}" >> $GITHUB_OUTPUT + - name: Generate partial apt restore key + id: generate_apt_cache_key + run: | + echo "key=$(lsb_release -rs)-apt-${{ env.CACHE_VERSION }}-${{ env.HA_SHORT_VERSION }}" >> $GITHUB_OUTPUT - name: Filter for core changes uses: dorny/paths-filter@v3.0.2 id: core @@ -515,16 +523,36 @@ jobs: ${{ runner.os }}-${{ runner.arch }}-${{ steps.python.outputs.python-version }}-uv-${{ env.UV_CACHE_VERSION }}-${{ steps.generate-uv-key.outputs.version }}-${{ env.HA_SHORT_VERSION }}- + - name: Restore apt cache + if: steps.cache-venv.outputs.cache-hit != 'true' + id: cache-apt + uses: actions/cache@v4.2.4 + with: + path: | + ${{ env.APT_CACHE_DIR }} + ${{ env.APT_LIST_CACHE_DIR }} + key: >- + ${{ runner.os }}-${{ runner.arch }}-${{ needs.info.outputs.apt_cache_key }} - name: Install additional OS dependencies if: steps.cache-venv.outputs.cache-hit != 'true' timeout-minutes: 10 run: | sudo rm /etc/apt/sources.list.d/microsoft-prod.list - sudo apt-get update + if [[ "${{ steps.cache-apt.outputs.cache-hit }}" != 'true' ]]; then + mkdir -p ${{ env.APT_CACHE_DIR }} + mkdir -p ${{ env.APT_LIST_CACHE_DIR }} + fi + + sudo apt-get update \ + -o Dir::Cache=${{ env.APT_CACHE_DIR }} \ + -o Dir::State::Lists=${{ env.APT_LIST_CACHE_DIR }} sudo apt-get -y install \ + -o Dir::Cache=${{ env.APT_CACHE_DIR }} \ + -o Dir::State::Lists=${{ env.APT_LIST_CACHE_DIR }} \ bluez \ ffmpeg \ libturbojpeg \ + libxml2-utils \ libavcodec-dev \ libavdevice-dev \ libavfilter-dev \ @@ -534,6 +562,10 @@ jobs: libswresample-dev \ libswscale-dev \ libudev-dev + + if [[ "${{ steps.cache-apt.outputs.cache-hit }}" != 'true' ]]; then + sudo chmod -R 755 ${{ env.APT_CACHE_BASE }} + fi - name: Create Python virtual environment if: steps.cache-venv.outputs.cache-hit != 'true' run: | @@ -578,12 +610,25 @@ jobs: - info - base steps: + - name: Restore apt cache + uses: actions/cache/restore@v4.2.4 + with: + path: | + ${{ env.APT_CACHE_DIR }} + ${{ env.APT_LIST_CACHE_DIR }} + fail-on-cache-miss: true + key: >- + ${{ runner.os }}-${{ runner.arch }}-${{ needs.info.outputs.apt_cache_key }} - name: Install additional OS dependencies timeout-minutes: 10 run: | sudo rm /etc/apt/sources.list.d/microsoft-prod.list - sudo apt-get update + sudo apt-get update \ + -o Dir::Cache=${{ env.APT_CACHE_DIR }} \ + -o Dir::State::Lists=${{ env.APT_LIST_CACHE_DIR }} sudo apt-get -y install \ + -o Dir::Cache=${{ env.APT_CACHE_DIR }} \ + -o Dir::State::Lists=${{ env.APT_LIST_CACHE_DIR }} \ libturbojpeg - name: Check out code from GitHub uses: actions/checkout@v5.0.0 @@ -878,12 +923,25 @@ jobs: - mypy name: Split tests for full run steps: + - name: Restore apt cache + uses: actions/cache/restore@v4.2.4 + with: + path: | + ${{ env.APT_CACHE_DIR }} + ${{ env.APT_LIST_CACHE_DIR }} + fail-on-cache-miss: true + key: >- + ${{ runner.os }}-${{ runner.arch }}-${{ needs.info.outputs.apt_cache_key }} - name: Install additional OS dependencies timeout-minutes: 10 run: | sudo rm /etc/apt/sources.list.d/microsoft-prod.list - sudo apt-get update + sudo apt-get update \ + -o Dir::Cache=${{ env.APT_CACHE_DIR }} \ + -o Dir::State::Lists=${{ env.APT_LIST_CACHE_DIR }} sudo apt-get -y install \ + -o Dir::Cache=${{ env.APT_CACHE_DIR }} \ + -o Dir::State::Lists=${{ env.APT_LIST_CACHE_DIR }} \ bluez \ ffmpeg \ libturbojpeg \ @@ -939,12 +997,25 @@ jobs: name: >- Run tests Python ${{ matrix.python-version }} (${{ matrix.group }}) steps: + - name: Restore apt cache + uses: actions/cache/restore@v4.2.4 + with: + path: | + ${{ env.APT_CACHE_DIR }} + ${{ env.APT_LIST_CACHE_DIR }} + fail-on-cache-miss: true + key: >- + ${{ runner.os }}-${{ runner.arch }}-${{ needs.info.outputs.apt_cache_key }} - name: Install additional OS dependencies timeout-minutes: 10 run: | sudo rm /etc/apt/sources.list.d/microsoft-prod.list - sudo apt-get update + sudo apt-get update \ + -o Dir::Cache=${{ env.APT_CACHE_DIR }} \ + -o Dir::State::Lists=${{ env.APT_LIST_CACHE_DIR }} sudo apt-get -y install \ + -o Dir::Cache=${{ env.APT_CACHE_DIR }} \ + -o Dir::State::Lists=${{ env.APT_LIST_CACHE_DIR }} \ bluez \ ffmpeg \ libturbojpeg \ @@ -1073,12 +1144,25 @@ jobs: name: >- Run ${{ matrix.mariadb-group }} tests Python ${{ matrix.python-version }} steps: + - name: Restore apt cache + uses: actions/cache/restore@v4.2.4 + with: + path: | + ${{ env.APT_CACHE_DIR }} + ${{ env.APT_LIST_CACHE_DIR }} + fail-on-cache-miss: true + key: >- + ${{ runner.os }}-${{ runner.arch }}-${{ needs.info.outputs.apt_cache_key }} - name: Install additional OS dependencies timeout-minutes: 10 run: | sudo rm /etc/apt/sources.list.d/microsoft-prod.list - sudo apt-get update + sudo apt-get update \ + -o Dir::Cache=${{ env.APT_CACHE_DIR }} \ + -o Dir::State::Lists=${{ env.APT_LIST_CACHE_DIR }} sudo apt-get -y install \ + -o Dir::Cache=${{ env.APT_CACHE_DIR }} \ + -o Dir::State::Lists=${{ env.APT_LIST_CACHE_DIR }} \ bluez \ ffmpeg \ libturbojpeg \ @@ -1214,12 +1298,25 @@ jobs: name: >- Run ${{ matrix.postgresql-group }} tests Python ${{ matrix.python-version }} steps: + - name: Restore apt cache + uses: actions/cache/restore@v4.2.4 + with: + path: | + ${{ env.APT_CACHE_DIR }} + ${{ env.APT_LIST_CACHE_DIR }} + fail-on-cache-miss: true + key: >- + ${{ runner.os }}-${{ runner.arch }}-${{ needs.info.outputs.apt_cache_key }} - name: Install additional OS dependencies timeout-minutes: 10 run: | sudo rm /etc/apt/sources.list.d/microsoft-prod.list - sudo apt-get update + sudo apt-get update \ + -o Dir::Cache=${{ env.APT_CACHE_DIR }} \ + -o Dir::State::Lists=${{ env.APT_LIST_CACHE_DIR }} sudo apt-get -y install \ + -o Dir::Cache=${{ env.APT_CACHE_DIR }} \ + -o Dir::State::Lists=${{ env.APT_LIST_CACHE_DIR }} \ bluez \ ffmpeg \ libturbojpeg \ @@ -1376,12 +1473,25 @@ jobs: name: >- Run tests Python ${{ matrix.python-version }} (${{ matrix.group }}) steps: + - name: Restore apt cache + uses: actions/cache/restore@v4.2.4 + with: + path: | + ${{ env.APT_CACHE_DIR }} + ${{ env.APT_LIST_CACHE_DIR }} + fail-on-cache-miss: true + key: >- + ${{ runner.os }}-${{ runner.arch }}-${{ needs.info.outputs.apt_cache_key }} - name: Install additional OS dependencies timeout-minutes: 10 run: | sudo rm /etc/apt/sources.list.d/microsoft-prod.list - sudo apt-get update + sudo apt-get update \ + -o Dir::Cache=${{ env.APT_CACHE_DIR }} \ + -o Dir::State::Lists=${{ env.APT_LIST_CACHE_DIR }} sudo apt-get -y install \ + -o Dir::Cache=${{ env.APT_CACHE_DIR }} \ + -o Dir::State::Lists=${{ env.APT_LIST_CACHE_DIR }} \ bluez \ ffmpeg \ libturbojpeg \