Compare commits

...

22 Commits

Author SHA1 Message Date
Stefan Zweifel
8040434425 Merge pull request #197 from cmbuckley/skip-checkout
Add `skip_checkout` option
2022-01-10 20:11:32 +01:00
Chris Buckley
fc174e2406 Add skip_checkout option 2022-01-10 00:17:58 +00:00
Stefan Zweifel
8c3ed373fb Merge pull request #180 from ericcornelissen/docs/permissions
Add note on minimum permissions to the docs
2021-10-04 08:19:11 +02:00
Eric Cornelissen
797544dbd2 Update README.md
Add note on minimum required permission.
2021-10-03 22:18:07 +02:00
Stefan Zweifel
0d6c97e470 Update README.md 2021-09-26 11:39:31 +02:00
Stefan Zweifel
f6048aa2ac Add Test to Cover #177
refs #177
2021-09-25 16:06:43 +02:00
Stefan Zweifel
983386a337 Add update-changelog Workflow 2021-09-10 19:54:41 +02:00
Stefan Zweifel
b8ff4cd716 Add release-drafter Workflow 2021-09-10 19:53:48 +02:00
Stefan Zweifel
abd87b7d94 Release v4.12.0 2021-09-10 19:47:39 +02:00
Stefan Zweifel
54cc2186d1 Remove unwanted chars from tests 2021-09-10 19:47:01 +02:00
Stefan Zweifel
216b25a401 Merge pull request #172 from webignition/issue-171
Output hash of created commit
2021-09-10 19:41:23 +02:00
Jon Cram
05aea7e2d9 Add commit_hash output description to readme 2021-09-10 14:37:45 +01:00
Jon Cram
68fd92dd9c Output hash of created commit 2021-09-10 14:37:45 +01:00
Stefan Zweifel
0426839718 Merge pull request #173 from webignition/run-checks-on-pull-request
Run git-auto-commit, linter and tests checks on pull requests
2021-09-10 15:32:18 +02:00
Stefan Zweifel
97badfaf41 Revert Linter to only run on push event 2021-09-10 15:31:37 +02:00
Jon Cram
10257e2994 Run git-auto-commit, linter and tests checks on pull requests 2021-09-10 13:49:19 +01:00
Stefan Zweifel
e107e28c4e Update README.md 2021-08-19 08:37:15 +02:00
Stefan Zweifel
6834afe239 Update README.md 2021-08-18 20:49:52 +02:00
Stefan Zweifel
27ac2f0a7b Update README 2021-08-18 20:43:30 +02:00
Stefan Zweifel
3568db7bbc Add note about bash dependency 2021-07-13 20:18:17 +02:00
Stefan Zweifel
053f356774 Improve amend section in README
refs #159
2021-05-22 11:34:55 +02:00
Stefan Zweifel
46af2f08b3 Add Example for —amend to README
refs #159
2021-05-20 20:30:05 +02:00
11 changed files with 245 additions and 23 deletions

45
.github/release-drafter.yml vendored Normal file
View File

@@ -0,0 +1,45 @@
ame-template: 'v$RESOLVED_VERSION'
tag-template: 'v$RESOLVED_VERSION'
template: |
# What's Changed
$CHANGES
categories:
- title: Added
labels:
- 'changelog:added'
- title: Changed
labels:
- 'changelog:changed'
- title: Deprecated
labels:
- 'changelog:deprecated '
- title: Removed
labels:
- 'changelog:removed'
- title: Fixed
labels:
- 'changelog:fixed'
- title: Security
labels:
- security
- changelog:security
- title: 'Dependency Updates'
labels:
- dependencies
version-resolver:
major:
labels:
- 'changelog:removed'
minor:
labels:
- 'changelog:added'
- 'changelog:deprecated'
patch:
labels:
- 'changelog:fixed'
- 'changelog:security'
- 'dependency'
exclude-labels:
- 'skip-changelog'

View File

@@ -1,6 +1,10 @@
name: git-auto-commit
on: push
on:
push:
branches:
- master
pull_request:
jobs:
git-auto-commit:

View File

@@ -1,4 +1,5 @@
name: Lint Code Base
on: push
jobs:

14
.github/workflows/release-drafter.yml vendored Normal file
View File

@@ -0,0 +1,14 @@
name: Release Drafter
on:
push:
branches:
- master
jobs:
update_release_draft:
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,6 +1,10 @@
name: tests
on: push
on:
push:
branches:
- master
pull_request:
jobs:
tests:
@@ -14,4 +18,3 @@ jobs:
- name: Run Tests
run: yarn test

28
.github/workflows/update-changelog.yaml vendored Normal file
View File

@@ -0,0 +1,28 @@
name: "Update Changelog"
on:
release:
types: [released]
jobs:
update:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
ref: master
- name: Update Changelog
uses: stefanzweifel/changelog-updater-action@v1
with:
release-notes: ${{ github.event.release.body }}
latest-version: ${{ github.event.release.name }}
- name: Commit updated CHANGELOG
uses: stefanzweifel/git-auto-commit-action@v4
with:
branch: master
commit_message: Update CHANGELOG
file_pattern: CHANGELOG.md

View File

@@ -4,11 +4,17 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
## [Unreleased](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4.11.0...HEAD)
## [Unreleased](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4.12.0...HEAD)
> TBD
## [v4.12.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4.11.0...v4.12.0) - 2021-09-10
### Added
- Add `commit_hash` output [#172](https://github.com/stefanzweifel/git-auto-commit-action/pull/172)
## [v4.11.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4.10.0...v4.11.0) - 2021-05-03
### Added

View File

@@ -20,6 +20,9 @@ Add the following step at the end of your job, after other steps that might add
- uses: stefanzweifel/git-auto-commit-action@v4
```
Note that the Action has to be used in a Job that runs on a UNIX system (eg. `ubuntu-latest`).
If you don't use the default permission of the GITHUB_TOKEN, give the Job or Workflow at least the `contents: write` permission.
The following is an extended example with all possible options available for this Action.
```yaml
@@ -34,10 +37,10 @@ The following is an extended example with all possible options available for thi
branch: feature-123
# Optional. Used by `git-commit`.
# See https://git-scm.com/docs/git-commit#_options
# See https://git-scm.com/docs/git-commit#_options
commit_options: '--no-verify --signoff'
# Optional glob pattern of files which should be added to the commit
# Optional glob pattern of files which should be added to the commit
# Defaults to all (.)
# See the `pathspec`-documentation for git
# - https://git-scm.com/docs/git-add#Documentation/git-add.txt-ltpathspecgt82308203
@@ -57,8 +60,8 @@ The following is an extended example with all possible options available for thi
# Action will create and push a new tag to the remote repository and the defined branch
tagging_message: 'v1.0.0'
# Optional. Used by `git-status`
# See https://git-scm.com/docs/git-status#_options
# Optional. Used by `git-status`
# See https://git-scm.com/docs/git-status#_options
status_options: '--untracked-files=no'
# Optional. Used by `git-add`
@@ -75,11 +78,16 @@ The following is an extended example with all possible options available for thi
# Optional. Skip internal call to `git fetch`
skip_fetch: true
# Optional. Skip internal call to `git checkout`
skip_checkout: true
# Optional. Prevents the shell from expanding filenames.
# Details: https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html
disable_globbing: true
```
Please note that the Action depends on `bash`. If you're using the Action in a job in combination with a custom Docker container, make sure that `bash` is installed.
## Example Workflow
In this example, we're running `php-cs-fixer` in a PHP project to fix the codestyle automatically, then commit possible changed files back to the repository.
@@ -122,6 +130,7 @@ Checkout [`action.yml`](https://github.com/stefanzweifel/git-auto-commit-action/
You can use these outputs to trigger other Actions in your Workflow run based on the result of `git-auto-commit-action`.
- `changes_detected`: Returns either "true" or "false" if the repository was dirty and files have changed.
- `commit_hash`: Returns the full hash of the commit if one was created.
### Example
@@ -137,6 +146,18 @@ You can use these outputs to trigger other Actions in your Workflow run based on
## Limitations & Gotchas
The goal of this Action is to be "the Action for committing files for the 80% use case". Therefore you might run into issues if your Workflow falls into the not supported 20% portion.
The following is a list of edge cases the Action knowingly does not support:
**No `git pull` when the repository is out of the date with remote.** The will not do a `git pull` before doing the `git push`. **You** are responsible for keeping the repository up to date in your Workflow runs.
**No support for running the Action in build matrices**. For example, if your Workflow is using build matrices, and you want that each job commits and pushes files to the remote, you will run into the issue, that the repository in the workflow will become out of date. As the Action will not do a `git pull` for you, you have to do that yourself.
**No support for `git rebase` or `git merge`**. There are many strategies on how to integrate remote upstream changes to a local repository. `git-auto-commit` does not want to be responsible for doing that.
If this Action doesn't work for your workflow, check out [EndBug/add-and-commit](https://github.com/EndBug/add-and-commit).
### Checkout the correct branch
You must use `action/checkout@v2` or later versions to checkout the repository.
@@ -168,8 +189,10 @@ storing the token as a secret in your repository and then passing the new token
If you work in an organization and don't want to create a PAT from your personal account, we recommend using a [robot account](https://docs.github.com/en/github/getting-started-with-github/types-of-github-accounts) for the token.
## Advanced Uses
### Using the Action in forks from public repositories
<details>
<summary>Use in forks from public repositories</summary>
**☝️ Important Notice**: This Action technically works with forks. However, please note that the combination of triggers and their options can cause issues. Please read [the documentation](https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows) on which triggers GitHub Actions support.\
If you use this Action in combination with a linter/fixer, it's easier if you run the Action on `push` on your `main`-branch.
@@ -223,18 +246,71 @@ As you can see, your contributors have to go through hoops to make this work. **
For more information about running Actions on forks, see [this announcement from GitHub](https://github.blog/2020-08-03-github-actions-improvements-for-fork-and-pull-request-workflows/).
### Push to forks from private repositories
</details>
<details>
<summary>Push to forks from private repositories</summary>
By default, GitHub Actions doesn't run Workflows on forks from private repositories. To enable Actions for **private** repositories enable "Run workflows from pull requests" in your repository settings.
See [this announcement from GitHub](https://github.blog/2020-08-03-github-actions-improvements-for-fork-and-pull-request-workflows/) or the [GitHub docs](https://docs.github.com/en/github/administering-a-repository/disabling-or-limiting-github-actions-for-a-repository#enabling-workflows-for-private-repository-forks) for details.
### Signing Commits & Other Git Command Line Options
</details>
<details>
<summary>
Signing Commits & Other Git Command Line Options
</summary>
Using command lines options needs to be done manually for each workflow which you require the option enabled. So for example signing commits requires you to import the gpg signature each and every time. The following list of actions are worth checking out if you need to automate these tasks regulary.
- [Import GPG Signature](https://github.com/crazy-max/ghaction-import-gpg) (Suggested by [TGTGamer](https://github.com/tgtgamer))
</details>
<details>
<summary>
Using `--amend` and `--no-edit` as commit options
</summary>
If you would like to use this Action to create a commit using [`--amend`](https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---amend) and [`--no-edit`](https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---no-edit) you need to make some adjustments.
**☝️ Important Notice:** You should understand the implications of rewriting history if you amend a commit that has already been published. [See rebasing](https://git-scm.com/docs/git-rebase#_recovering_from_upstream_rebase)
First, you need to extract the previous commit message by using `git log -1 --pretty=%s`.
Then you need to provide this last commit message to the Action through the `commit_message` input option.
Finally, you have to use `push_options: '--force'` to overwrite the git history on the GitHub remote repository. (git-auto-commit will not do a `git-rebase` for you!)
The steps in your workflow might look like this:
```yaml
- uses: actions/checkout@master
with:
# Fetch the last 2 commits instead of just 1. (Fetching just 1 commit would overwrite the whole history)
fetch-depth: 2
# Other steps in your workflow to trigger a changed file
- name: Get last commit message
id: last-commit-message
run: |
echo "::set-output name=msg::$(git log -1 --pretty=%s)"
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: ${{ steps.last-commit-message.outputs.msg }}
commit_options: '--amend --no-edit'
push_options: '--force'
skip_fetch: true
```
See discussion in [#159](https://github.com/stefanzweifel/git-auto-commit-action/issues/159#issuecomment-845347950) for details.
</details>
## Troubleshooting
### Action does not push commit to repository

View File

@@ -60,6 +60,10 @@ inputs:
description: Skip the call to git-fetch.
required: false
default: false
skip_checkout:
description: Skip the call to git-checkout.
required: false
default: false
disable_globbing:
description: Stop the shell from expanding filenames (https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html)
default: false
@@ -67,6 +71,8 @@ inputs:
outputs:
changes_detected:
description: Value is "true", if the repository was dirty and file changes have been detected. Value is "false", if no changes have been detected.
commit_hash:
description: Full hash of the created commit. Only present if the "changes_detected" output is "true".
runs:
using: 'node12'

View File

@@ -55,9 +55,13 @@ _switch_to_branch() {
git fetch --depth=1;
fi
# Switch to branch from current Workflow run
# shellcheck disable=SC2086
git checkout $INPUT_BRANCH;
if "$INPUT_SKIP_CHECKOUT"; then
echo "::debug::git-checkout has not been executed";
else
# Switch to branch from current Workflow run
# shellcheck disable=SC2086
git checkout $INPUT_BRANCH;
fi
}
_add_files() {
@@ -86,6 +90,8 @@ _local_commit() {
commit -m "$INPUT_COMMIT_MESSAGE" \
--author="$INPUT_COMMIT_AUTHOR" \
${INPUT_COMMIT_OPTIONS:+"${INPUT_COMMIT_OPTIONS_ARRAY[@]}"};
echo "::set-output name=commit_hash::$(git rev-parse HEAD)";
}
_tag_commit() {

View File

@@ -24,9 +24,10 @@ setup() {
export INPUT_PUSH_OPTIONS=""
export INPUT_SKIP_DIRTY_CHECK=false
export INPUT_SKIP_FETCH=false
export INPUT_SKIP_CHECKOUT=false
export INPUT_DISABLE_GLOBBING=false
# Configure Git
# Configure Git
if [[ -z $(git config user.name) ]]; then
git config --global user.name "Test Suite"
git config --global user.email "test@github.com"
@@ -43,7 +44,7 @@ teardown() {
rm -rf "${FAKE_TEMP_LOCAL_REPOSITORY}"
}
# Create a fake remote repository which tests can push against
# Create a fake remote repository which tests can push against
_setup_fake_remote_repository() {
# Create the bare repository, which will act as our remote/origin
rm -rf "${FAKE_REMOTE}";
@@ -72,7 +73,7 @@ _setup_local_repository() {
cd "${FAKE_LOCAL_REPOSITORY}";
}
# Run the main code related to this GitHub Action
# Run the main code related to this GitHub Action
git_auto_commit() {
bash "${BATS_TEST_DIRNAME}"/../entrypoint.sh
}
@@ -86,6 +87,7 @@ git_auto_commit() {
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "::set-output name=changes_detected::true"
assert_line -e "::set-output name=commit_hash::[0-9a-f]{40}$"
assert_line "INPUT_BRANCH value: master"
assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: "
@@ -106,6 +108,7 @@ git_auto_commit() {
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "::set-output name=changes_detected::true"
assert_line -e "::set-output name=commit_hash::[0-9a-f]{40}$"
assert_line "INPUT_BRANCH value: master"
assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: "
@@ -128,6 +131,7 @@ git_auto_commit() {
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "::set-output name=changes_detected::false"
refute_line -e "::set-output name=commit_hash::[0-9a-f]{40}$"
assert_line "Working tree clean. Nothing to commit."
}
@@ -138,6 +142,7 @@ git_auto_commit() {
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "::set-output name=changes_detected::false"
refute_line -e "::set-output name=commit_hash::[0-9a-f]{40}$"
assert_line "Working tree clean. Nothing to commit."
}
@@ -150,8 +155,7 @@ git_auto_commit() {
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "::set-output name=changes_detected::true"
assert_line "::set-output name=changes_detected::true"
refute_line -e "::set-output name=commit_hash::[0-9a-f]{40}$"
assert_line "INPUT_BRANCH value: master"
assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: "
@@ -303,7 +307,7 @@ git_auto_commit() {
}
@test "It can checkout a different branch" {
# Create foo-branch and then immediately switch back to master
# Create foo-branch and then immediately switch back to master
git checkout -b foo
git checkout master
@@ -318,7 +322,7 @@ git_auto_commit() {
assert_line "INPUT_BRANCH value: foo"
assert_line "::debug::Push commit to remote branch foo"
# Assert a new branch "foo" exists on remote
# Assert a new branch "foo" exists on remote
run git ls-remote --heads
assert_output --partial refs/heads/foo
}
@@ -378,6 +382,19 @@ git_auto_commit() {
assert_line "::debug::git-fetch has not been executed"
}
@test "If SKIP_CHECKOUT is true git-checkout will not be called" {
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
INPUT_SKIP_CHECKOUT=true
run git_auto_commit
assert_success
assert_line "::debug::git-checkout has not been executed"
}
@test "It pushes generated commit and tag to remote and actually updates the commit shas" {
INPUT_BRANCH=""
INPUT_TAGGING_MESSAGE="v2.0.0"
@@ -408,7 +425,7 @@ git_auto_commit() {
}
@test "It pushes generated commit and tag to remote branch and updates commit sha" {
# Create "a-new-branch"-branch and then immediately switch back to master
# Create "a-new-branch"-branch and then immediately switch back to master
git checkout -b a-new-branch
git checkout master
@@ -448,7 +465,7 @@ git_auto_commit() {
mkdir "${FAKE_LOCAL_REPOSITORY}"/nested
touch "${FAKE_LOCAL_REPOSITORY}"/nested/new-file-b.py
# Commit changes
# Commit changes
echo "Commit changes before running git_auto_commit";
cd "${FAKE_LOCAL_REPOSITORY}";
git add . > /dev/null;
@@ -474,3 +491,19 @@ git_auto_commit() {
run git status
refute_output --partial 'nested/new-file-b.py'
}
@test "it does not throw an error if not changes are detected and SKIP_DIRTY_CHECK is false" {
INPUT_FILE_PATTERN="."
INPUT_SKIP_DIRTY_CHECK=false
INPUT_SKIP_FETCH=false
run git_auto_commit
assert_success
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "::set-output name=changes_detected::false"
run git status
assert_output --partial 'nothing to commit, working tree clean'
}