Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

prepare-workspace: make an empty commit for actions/checkout #30

Merged
merged 1 commit into from
Nov 10, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cleanup/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Setup environment
# Clean up the workspace

Action cleans workspace directory after previous run. The main reason to add
this action is [tarantool/tarantool-qa#145](https://github.com/tarantool/tarantool-qa/issues/145).
ylobankov marked this conversation as resolved.
Show resolved Hide resolved
Expand Down
57 changes: 57 additions & 0 deletions prepare-checkout/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Prepare workspace for checkout action

This action creates and checks out an empty detached commit.
It helps subsequent [`actions/checkout`](https://github.com/actions/checkout) action
correctly clean the workspace.

## Usage

Add the following line to your workflow before the `actions/checkout` action:

```diff
+ - uses: tarantool/actions/prepare-checkout@master
- uses: actions/checkout@v3
...
```

## Explanation and rationale

This action is a solution for
[tarantool/tarantool-qa#145](https://github.com/tarantool/tarantool-qa/issues/145).
First attempt to solve this was the `tarantool/actions/cleanup` action.
The `tarantool/actions/prepare-checkout` action is a softer alternative to it.

When submodules change, `actions/checkout` can fail with git errors.
It's a well-known problem and the related issues are still open:
actions/checkout#354,
actions/checkout#385,
actions/checkout#418, and
actions/checkout#590.

Before checking out a new revision, `actions/checkout` runs the following code:

```bash
# removes ignored and non-versioned files
git clean -ffdx
# resets workspace to the commit, on which it was left
# after the last job run
git reset --hard
```

The problem is that when a workflow fails because of a particular commit,
the repository still stays on that commit. On the next job run,
`actions/checkout` will run the above code, restore that particular commit,
and fail to make a proper code checkout.

By creating a detached empty commit, this actions forces `actions/checkout`
to clean up the project's workspace entirely, removing any files that could
break checkout. Meanwhile, the `.git` directory stays intact, so full checkout
isn't required and the workflow does not waste much time.

If this is a first job run on a particular runner and there's no repository yet,
the command in this action will silently fail, thanks to `|| :`,
but the action itself will succeed.

This action uses a solution proposed in a
[comment](https://github.com/actions/checkout/issues/590#issuecomment-970586842)
at actions/checkout#590.
13 changes: 13 additions & 0 deletions prepare-checkout/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
name: 'Prepare workspace for checkout'
description: 'Prepare workspace for the actions/checkout action'
runs:
using: 'composite'
steps:
- run: |
set -e
NickVolynkin marked this conversation as resolved.
Show resolved Hide resolved
git checkout -f \
$(git -c user.name=TarantoolBot -c [email protected] \
commit-tree $(git hash-object -t tree /dev/null) -m 'Empty commit' \
< /dev/null) || :
shell: bash