actions / actions/runner-container-hooks

The hash of the directory does not match the expected value in post job step

Open
#290 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
TypeScript
Stars
153
Forks
112
Avg merge
6m
Merged PRs (30d)
1

Description

I noticed an issue related to the actions/checkout action in combination with the new copy functionality. I am using the latest main of runner-container-hooks.

The bug results in the hash validation mechanism failing after copying files from the workflow pod to the runner pod. This only occurs in the 'Post' step of the job.

There are a couple of requirements that need to be met before you trigger the bug.

  • You need to call a reusable action (can be local or in a different repository).
  • That reusable action needs to do a checkout using actions/checkout, but it needs to use v6.
  • That reusable action also needs to perform any action on your git directory, for example setting the safe dir.

Once all these requirements are met, the 'Post' step of job will indicate that there is different hash on the runner pod then on the workflow pod.

As mentioned before, using actions/checkout@v6 is a requirement as actions/checkout@v5 does not trigger the issue.
If we look into the changes done in v6, we can see the following:

Updated persist-credentials to store the credentials under $RUNNER_TEMP instead of directly in the local git config.

This requires a minimum Actions Runner version of [v2.329.0](https://github.com/actions/runner/releases/tag/v2.329.0) to 
access the persisted credentials for [Docker container action](https://docs.github.com/en/actions/tutorials/use-containerized-services/create-a-docker-container-action) scenarios.

This is the workflow used to reproduce the issue.

name: Showcase issue
on:
  workflow_dispatch:

jobs:
  test:
    runs-on: default-staging
    container:
      image: ubuntu:24.04
    steps:
      - name: Install git
        run: |
          apt-get update && apt-get install -y git

      - name: Call action
        uses: TrendMiner/tm-pnt-dummy@main # cannot reference local actions due to https://github.com/actions/runner-container-hooks/issues/260

This is the reusable action used in the workflow. I used a local reusable action for ease, but the same occurs if your reusable action is in a separate repository.

---
name: Hello
description: Hello
runs:
  using: composite
  steps:
    - name: Checkout repository
      uses: actions/checkout@v6

    - name: Set git safe directory
      shell: bash
      run: git config --global --add safe.directory "$GITHUB_WORKSPACE"

Below are the logs of the 'Post Call action' step that showcase the mismatch in hash.

##[debug]Evaluating condition for step: 'Post Call action'
##[debug]Evaluating: always()
##[debug]Evaluating always:
##[debug]=> true
##[debug]Result: true
##[debug]Starting: Post Call action
##[debug]Loading inputs
##[debug]Loading env
Post job cleanup.
##[debug]Evaluating condition for step: 'run'
##[debug]Evaluating: always()
##[debug]Evaluating always:
##[debug]=> true
##[debug]Result: true
##[debug]Starting: run
##[debug]Loading inputs
##[debug]Evaluating: github.repository
##[debug]Evaluating Index:
##[debug]..Evaluating github:
##[debug]..=> Object
##[debug]..Evaluating String:
##[debug]..=> 'repository'
##[debug]=> 'mycompany/tm-pnt-dummy'
##[debug]Result: 'mycompany/tm-pnt-dummy'
##[debug]Evaluating: github.token
##[debug]Evaluating Index:
##[debug]..Evaluating github:
##[debug]..=> Object
##[debug]..Evaluating String:
##[debug]..=> 'token'
##[debug]=> '***'
##[debug]Result: '***'
##[debug]Loading env
Post job cleanup.
##[debug]Running JavaScript Action with default external tool: node24
Run '/home/runner/k8s/index.js'
##[debug]/home/runner/externals/node20/bin/node /home/runner/k8s/index.js
##[debug]Copying /home/runner/_work/_temp to pod default-staging-xjndr-runner-hnpxv-workflow at /__w/_temp
(node:424) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]execPodStep response: {"metadata":{},"status":"Success"}
##[debug]Getting git version
/usr/bin/git version
git version 2.43.0
##[debug]0
##[debug]git version 2.43.0
##[debug]
##[debug]Set git useragent to: git/2.43.0 (github-actions-checkout)
::add-mask::***
Copying '/root/.gitconfig' to '/__w/_temp/0469fab8-c4c2-435c-ae26-513ada0b2849/.gitconfig'
Temporarily overriding HOME='/__w/_temp/0469fab8-c4c2-435c-ae26-513ada0b2849' before making global git config changes
Adding repository directory to the temporary git global config as a safe directory
/usr/bin/git config --global --add safe.directory /__w/tm-pnt-dummy/tm-pnt-dummy
##[debug]0
##[debug]
Removing SSH command configuration
/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
##[debug]1
##[debug]
/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
##[debug]0
##[debug]
Removing HTTP extra header
/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
##[debug]1
##[debug]
/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
##[debug]0
##[debug]
Removing includeIf entries pointing to credentials config files
/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
includeif.gitdir:/__w/tm-pnt-dummy/tm-pnt-dummy/.git.path
includeif.gitdir:/github/workspace/.git.path
##[debug]0
##[debug]includeif.gitdir:/__w/tm-pnt-dummy/tm-pnt-dummy/.git.path
##[debug]includeif.gitdir:/github/workspace/.git.path
##[debug]
/usr/bin/git config --local --get-all includeif.gitdir:/__w/tm-pnt-dummy/tm-pnt-dummy/.git.path
/__w/_temp/git-credentials-08a51a8f-a532-4af2-9653-32c5a0e88715.config
##[debug]0
##[debug]/__w/_temp/git-credentials-08a51a8f-a532-4af2-9653-32c5a0e88715.config
##[debug]
/usr/bin/git config --local --unset includeif.gitdir:/__w/tm-pnt-dummy/tm-pnt-dummy/.git.path /__w/_temp/git-credentials-08a51a8f-a532-4af2-9653-32c5a0e88715.config
##[debug]0
##[debug]
/usr/bin/git config --local --get-all includeif.gitdir:/github/workspace/.git.path
/github/runner_temp/git-credentials-08a51a8f-a532-4af2-9653-32c5a0e88715.config
##[debug]0
##[debug]/github/runner_temp/git-credentials-08a51a8f-a532-4af2-9653-32c5a0e88715.config
##[debug]
/usr/bin/git config --local --unset includeif.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-08a51a8f-a532-4af2-9653-32c5a0e88715.config
##[debug]0
##[debug]
/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
##[debug]0
##[debug]
Removing credentials config '/__w/_temp/git-credentials-08a51a8f-a532-4af2-9653-32c5a0e88715.config'
##[debug]Skipping removal of credentials config '/github/runner_temp/git-credentials-08a51a8f-a532-4af2-9653-32c5a0e88715.config' - not under RUNNER_TEMP
##[debug]Unsetting HOME override
##[debug]execPodStep response: {"metadata":{},"status":"Success"}
##[debug]Copying from job pod 'default-staging-xjndr-runner-hnpxv-workflow' /__w/_temp to /home/runner/_work/_temp
##[debug]Copying from pod default-staging-xjndr-runner-hnpxv-workflow /__w/_temp to /home/runner/_work/_temp
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]internalExecOutput response: {"metadata":{},"status":"Success"}
##[debug]The hash of the directory does not match the expected value; want='31be5782b03b197e2fb8839448edeb9dcc053bed027135014891087f66b55861' got='f729dc2ea97570b3cadc50558e05a8c893054fee2c8c3558f8fd10f639f781c0'
##[debug]Node Action run completed with exit code 0
##[debug]Finished: run
##[debug]Finishing: Post Call action

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the post-job cleanup flow, especially copying /home/runner/_work/_temp to the workflow pod and the directory hash validation. Reproduce the workflow with actions/checkout@v6 and the git safe-directory step, then trace why the copied temporary directory differs; done means the cleanup completes without repeated hash-mismatch messages.

Written by the indexing model from the issue text.

Assessment

Tech stack
git, github-actions, typescript
Domain
ci-cd, devops, infrastructure
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.