diff --git a/.forgejo/actions/timelord/action.yml b/.forgejo/actions/timelord/action.yml index bb9766d5..4b084eae 100644 --- a/.forgejo/actions/timelord/action.yml +++ b/.forgejo/actions/timelord/action.yml @@ -1,46 +1,84 @@ 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 - with: - path: /timelord/ - key: ${{ inputs.key }} - - name: Run timelord to set timestamps + - 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 [ ! -f ~/.cargo/bin/timelord ]; then + echo "timelord-cli not found at ~/.cargo/bin/timelord, needs installation" + NEED_INSTALL=true + fi + if [ ! -f ~/.cargo/bin/git-warp-time ]; then + echo "git-warp-time not found at ~/.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: 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 + ~/.cargo/bin/git-warp-time --quiet + else + ~/.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 }} + ~/.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 <