From 8f186cd770ebb088aa85f0aacea7f41a046c2054 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 8 Sep 2025 05:02:33 +0000 Subject: [PATCH 1/2] chore(deps): update https://github.com/renovatebot/github-action action to v43.0.11 --- .forgejo/workflows/renovate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml index 0152b387..6c898657 100644 --- a/.forgejo/workflows/renovate.yml +++ b/.forgejo/workflows/renovate.yml @@ -70,7 +70,7 @@ jobs: package-cache- - name: Self-hosted Renovate - uses: https://github.com/renovatebot/github-action@v43.0.9 + uses: https://github.com/renovatebot/github-action@v43.0.11 env: LOG_LEVEL: ${{ inputs.logLevel || 'info' }} RENOVATE_DRY_RUN: ${{ inputs.dryRun || 'false' }} From 7950e2cc7f86646431713c171836209a50b5d9d7 Mon Sep 17 00:00:00 2001 From: Tom Foster Date: Mon, 8 Sep 2025 04:32:23 +0100 Subject: [PATCH 2/2] ci: Refactor timelord action to use git-warp-time fallback Updates the timelord action to fall back to git-warp-time when the cache is completely empty, enabling timestamp restoration even on fresh builds. When git-warp-time is used, performs an unshallow fetch to get full history, while subsequent runs use normal fetches. Simplifies the interface by making inputs optional with sensible defaults. Adds binary caching for timelord-cli and git-warp-time tools to avoid repeated installations, and updates paths to use /usr/share/rust/.cargo/bin/ for the catthehacker runner image used by the dind profile (may need updating if/when switching to standard image). The main timelord restore now happens inside the Dockerfile itself, as Docker intentionally wipes all file mtimes on COPY/ADD operations. --- .forgejo/actions/timelord/action.yml | 109 ++++++++++++++++++++------- .forgejo/workflows/release-image.yml | 17 ++++- docker/Dockerfile | 14 +++- 3 files changed, 106 insertions(+), 34 deletions(-) diff --git a/.forgejo/actions/timelord/action.yml b/.forgejo/actions/timelord/action.yml index bb9766d5..40c6d0a6 100644 --- a/.forgejo/actions/timelord/action.yml +++ b/.forgejo/actions/timelord/action.yml @@ -1,46 +1,99 @@ name: timelord description: | - Use timelord to set file timestamps + Use timelord to set file timestamps with git-warp-time fallback for cache misses inputs: key: description: | The key to use for caching the timelord data. - This should be unique to the repository and the runner. - required: true - default: timelord-v0 + required: false + default: '' path: description: | The path to the directory to be timestamped. - This should be the root of the repository. - required: true - default: . + required: false + default: '' + +outputs: + database-path: + description: Path to timelord database + value: '${{ env.TIMELORD_CACHE_PATH }}' runs: using: composite steps: - - name: Cache timelord-cli installation - id: cache-timelord-bin - uses: actions/cache@v3 - with: - path: ~/.cargo/bin/timelord - key: timelord-cli-v3.0.1 - - name: Install timelord-cli - uses: https://github.com/cargo-bins/cargo-binstall@main - if: steps.cache-timelord-bin.outputs.cache-hit != 'true' - - run: cargo binstall timelord-cli@3.0.1 + - name: Set defaults shell: bash - if: steps.cache-timelord-bin.outputs.cache-hit != 'true' + run: | + echo "TIMELORD_KEY=${{ inputs.key || format('timelord-v1-{0}-{1}', github.repository, hashFiles('**/*.rs', '**/Cargo.toml', '**/Cargo.lock')) }}" >> $GITHUB_ENV + echo "TIMELORD_PATH=${{ inputs.path || '.' }}" >> $GITHUB_ENV + echo "TIMELORD_CACHE_PATH=$HOME/.cache/timelord" >> $GITHUB_ENV - - name: Load timelord files - uses: actions/cache/restore@v3 + - name: Restore binary cache + id: binary-cache + uses: actions/cache/restore@v4 with: - path: /timelord/ - key: ${{ inputs.key }} - - name: Run timelord to set timestamps + path: /usr/share/rust/.cargo/bin + key: timelord-binaries-v1 + + - name: Check if binaries need installation shell: bash - run: timelord sync --source-dir ${{ inputs.path }} --cache-dir /timelord/ - - name: Save timelord - uses: actions/cache/save@v3 + id: check-binaries + run: | + NEED_INSTALL=false + if [ ! -e /usr/share/rust/.cargo/bin/timelord ]; then + echo "timelord-cli not found at /usr/share/rust/.cargo/bin/timelord, needs installation" + NEED_INSTALL=true + fi + if [ ! -e /usr/share/rust/.cargo/bin/git-warp-time ]; then + echo "git-warp-time not found at /usr/share/rust/.cargo/bin/git-warp-time, needs installation" + NEED_INSTALL=true + fi + echo "need-install=$NEED_INSTALL" >> $GITHUB_OUTPUT + + - name: Install timelord-cli and git-warp-time + if: steps.check-binaries.outputs.need-install == 'true' + uses: https://github.com/taiki-e/install-action@v2 with: - path: /timelord/ - key: ${{ inputs.key }} + tool: git-warp-time,timelord-cli@3.0.1 + + - name: Save binary cache + if: steps.check-binaries.outputs.need-install == 'true' + uses: actions/cache/save@v4 + with: + path: /usr/share/rust/.cargo/bin + key: timelord-binaries-v1 + + + - name: Restore timelord cache with fallbacks + id: timelord-restore + uses: actions/cache/restore@v4 + with: + path: ${{ env.TIMELORD_CACHE_PATH }} + key: ${{ env.TIMELORD_KEY }} + restore-keys: | + timelord-v1-${{ github.repository }}- + + - name: Initialize timestamps on complete cache miss + if: steps.timelord-restore.outputs.cache-hit != 'true' + shell: bash + run: | + echo "Complete timelord cache miss - running git-warp-time" + git fetch --unshallow + if [ "${{ env.TIMELORD_PATH }}" = "." ]; then + /usr/share/rust/.cargo/bin/git-warp-time --quiet + else + /usr/share/rust/.cargo/bin/git-warp-time --quiet ${{ env.TIMELORD_PATH }} + fi + echo "Git timestamps restored" + + - name: Run timelord sync + shell: bash + run: | + mkdir -p ${{ env.TIMELORD_CACHE_PATH }} + /usr/share/rust/.cargo/bin/timelord sync --source-dir ${{ env.TIMELORD_PATH }} --cache-dir ${{ env.TIMELORD_CACHE_PATH }} + + - name: Save updated timelord cache immediately + uses: actions/cache/save@v4 + with: + path: ${{ env.TIMELORD_CACHE_PATH }} + key: ${{ env.TIMELORD_KEY }} diff --git a/.forgejo/workflows/release-image.yml b/.forgejo/workflows/release-image.yml index b7423567..22571b90 100644 --- a/.forgejo/workflows/release-image.yml +++ b/.forgejo/workflows/release-image.yml @@ -150,10 +150,18 @@ jobs: echo "Commit timestamp: $timestamp" - uses: ./.forgejo/actions/timelord - if: ${{ env.BUILDKIT_ENDPOINT == '' }} - with: - key: timelord-v0 - path: . + id: timelord + + - name: Copy timelord cache to workspace + shell: bash + run: | + mkdir -p ./timelord + if [ -d "${{ steps.timelord.outputs.database-path }}" ]; then + cp -r "${{ steps.timelord.outputs.database-path }}"/* ./timelord/ + echo "Copied timelord cache to workspace" + else + echo "No timelord cache to copy" + fi - name: Cache Rust registry if: ${{ env.BUILDKIT_ENDPOINT == '' }} @@ -217,6 +225,7 @@ jobs: GIT_COMMIT_HASH_SHORT=${{ env.COMMIT_SHORT_SHA }} GIT_REMOTE_URL=${{github.event.repository.html_url }} GIT_REMOTE_COMMIT_URL=${{github.event.head_commit.url }} + CARGO_INCREMENTAL=${{ env.BUILDKIT_ENDPOINT != '' && '1' || '0' }} platforms: ${{ matrix.platform }} labels: ${{ steps.meta.outputs.labels }} annotations: ${{ steps.meta.outputs.annotations }} diff --git a/docker/Dockerfile b/docker/Dockerfile index 17e1c6a1..4cb750e4 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -60,6 +60,7 @@ RUN <> /etc/environment +# Configure incremental compilation based on build context +ARG CARGO_INCREMENTAL=0 +RUN echo "CARGO_INCREMENTAL=${CARGO_INCREMENTAL}" >> /etc/environment # Configure pkg-config RUN <