content

I talked to a friend about the GitHub actions/checkout action failing with a 400 error (see 20250906064710) and they researched it for a bit.

They found this github repository: https://github.com/chrisliebaer/gitea-actions-fix/

In it, the repository details a few problems with using GitHub actions in Gitea (which Forgejo is a hard fork of) that it fixes, including:

  • SSH URLs for submodules and private submodules don't work due to lack of authentication
  • LFS checkout fails because the request to the server is malformed
  • Private actions cannot be checked out because the runner token can't access the repository

In general, it seems like all of these problems happen because actions/checkout doesn't do authentication properly (in particular, it sends a double auth header instead of using the credential helper) and Gitea and Forgejo are more strict about what can be done with the runner token.

Looking through the links, I find a workaround in a comment for actions/checkout#1830:

- uses: actions/checkout@v4
  with:
    persist-credentials: 'true' # Optional; should be the default

- name: Checkout lfs
  run: |
    git lfs install --local
    AUTH=$(git config --local http.${{ github.server_url }}/.extraheader)
    git config --local --unset http.${{ github.server_url }}/.extraheader
    git config --local http.${{ github.server_url }}/${{ github.repository }}.git/info/lfs/objects/batch.extraheader "$AUTH"
    git lfs pull

Updating the workflow to use this workaround fixes the problem. My workflow looked like this afterwards:

      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          lfs: false # Should be the default

      - name: Checkout LFS
        run: |
          git lfs install --local
          AUTH=$(git config --local http.${{ github.server_url }}/.extraheader)
          git config --local --unset http.${{ github.server_url }}/.extraheader
          git config --local http.${{ github.server_url }}/${{ github.repository }}.git/info/lfs/objects/batch.extraheader "$AUTH"
          git lfs pull

meta

created:

backlinks: Forgejo actions/checkout encounters a 400 error during LFS checkout

commit: ba1f8314