Date: 2019-10-21
Status: Accepted
This ADR details the behavior for actions/checkout@v2
.
The new action will be written in typescript. We are moving away from runner-plugin actions.
We want to take this opportunity to make behavioral changes, from v1. This document is scoped to those differences.
repository
ref
master
token
persist-credentials
true
clean
git clean -ffdx && git reset --hard
true
lfs
false
path
github.workspace
where the repository should be createdgithub.workspace
Note:
persist-credentials
is newfetch-depth
was removed (refer below for details)path
behavior is different (refer below for details)submodules
was removed (error if specified; add later if needed)When a sufficient version of git is not in the PATH, fallback to the web API to download a tarball/zipball.
Note:
Persist the token in the git config (http.extraheader). This will allow users to script authenticated git commands, like git fetch
.
A post script will remove the credentials from the git config (cleanup for self-hosted).
Users may opt-out by specifying persist-credentials: false
Note:
git commit
may need to set the username and email. The service does not provide any reasonable default value. Users can add git config user.name <NAME>
and git config user.email <EMAIL>
. We will document this guidance.http.https://github.com/.extraheader
token
input.persist-credentials: false
), or can script the removal themselves (git config --unset-all http.https://github.com/.extraheader
).Fetch only the SHA being built and set depth=1. This significantly reduces the fetch time for large repos.
If a SHA isn't available (e.g. multi repo), then fetch only the specified ref with depth=1.
Customers can run git fetch --unshallow
to fetch all refs/commits. We will document this guidance.
Note:
fetch-depth
no longer exists. We can add this back in the future if needed.-c protocol.version=2
). We will override on the fetch command line, for transparency.For CI, checkout will create a local ref with the upstream set. This allows users to script git as they normally would.
For PR, continue to checkout detached head. The PR branch is special - the branch and merge commit are created by the server. It doesn't match a users' local workflow.
Note:
For the mainline scenario, the disk-layout behavior remains the same.
Remember, given the repo johndoe/foo
, the mainline disk layout looks like:
GITHUB_WORKSPACE=/home/runner/work/foo/foo
RUNNER_WORKSPACE=/home/runner/work/foo
V2 introduces a new contraint on the checkout path. The location must now be under github.workspace
. Whereas the checkout@v1 constraint was one level up, under runner.workspace
.
V2 no longer changes github.workspace
to follow wherever the self repo is checked-out.
These behavioral changes align better with container actions. The documented filesystem contract is:
/github/home
/github/workspace
- Note: GitHub Actions must be run by the default Docker user (root). Ensure your Dockerfile does not set the USER instruction, otherwise you will not be able to access GITHUB_WORKSPACE
./github/workflow
Note:
path
input.path
inputThe path
input will default to ./
which is rooted against github.workspace
.
This default fits the mainline scenario well: single checkout
For multi-checkout, users must specify the path
input for at least one of the repositories.
Note:
./
and other repos default to <REPO_NAME>
. However nested layout is an atypical git layout and therefore is not a good default. Users should supply the path info.The following example checks-out two repositories and creates a nested layout.
# Self repo - Checkout to $GITHUB_WORKSPACE
- uses: checkout@v2
# Other repo - Checkout to $GITHUB_WORKSPACE/myscripts
- uses: checkout@v2
with:
repository: myorg/myscripts
path: myscripts
The following example checks-out two repositories and creates a side-by-side layout.
# Self repo - Checkout to $GITHUB_WORKSPACE/foo
- uses: checkout@v2
with:
path: foo
# Other repo - Checkout to $GITHUB_WORKSPACE/myscripts
- uses: checkout@v2
with:
repository: myorg/myscripts
path: myscripts
Problem matchers associate the source files with annotations.
Today the runner verifies the source file is under the github.workspace
. Otherwise the source file property is dropped.
Multi-checkout complicates the matter. However even today submodules may cause this heuristic to be inaccurate.
A better solution is:
Given a source file path, walk up the directories until the first .git/config
is found. Check if it matches the self repo (url = https://github.com/OWNER/REPO
). If not, drop the source file path.
The checkout action should be a typescript action on the GitHub graph, for the following reasons:
Note:
releases/v1
master
preview
v2
actions/checkout@v2