Compare commits

...

83 Commits

Author SHA1 Message Date
5f9821866a Update workflows 2019-10-06 14:52:15 +09:00
ee153ec8cf Update image version 2019-10-06 14:52:01 +09:00
e138d84114 Add variables to override the commit author name and email 2019-10-06 14:38:15 +09:00
90843d3c39 Update README 2019-10-05 09:22:43 +09:00
90ad96bd01 Update workflows 2019-10-05 09:22:35 +09:00
f8cc05d28d Update README 2019-10-04 14:53:58 +09:00
fe78afb6d7 Update README 2019-10-04 14:46:26 +09:00
af7dbce93d Merge remote-tracking branch 'origin/master' 2019-10-04 14:36:11 +09:00
2e283eddc6 Add workflow to automatically update dockerhub description 2019-10-04 14:35:58 +09:00
3e0a17d097 Update action to use pre-built container 2019-10-04 14:35:22 +09:00
7ebddff547 Merge pull request #52 from peter-evans/renovate/gitpython-3.x
Update dependency GitPython to v3.0.3
2019-10-04 14:30:27 +09:00
1397aded03 Update dependency GitPython to v3.0.3 2019-10-02 19:31:01 +00:00
40fd4990fc Update README 2019-10-02 22:38:58 +09:00
5784478398 Update README 2019-10-02 19:28:30 +09:00
6e9abd8a8d Add action.yml 2019-10-02 19:20:07 +09:00
ef76e27efb Replace fixed-name branch rebase with stash merge 2019-10-02 19:05:46 +09:00
6be23859c3 Update README 2019-09-30 23:24:16 +09:00
aa09d77c75 Update README
Update README


Update README


Update README
2019-09-30 19:16:55 +09:00
b86b066e8c Update README 2019-09-30 18:58:24 +09:00
7556cef424 Update workflows 2019-09-30 18:57:49 +09:00
ff7ec1c208 Fixed branch, random suffix and output pr number 2019-09-30 18:57:37 +09:00
6f333b4ebc Update README 2019-09-30 10:08:06 +09:00
65682597a6 Update workflows 2019-09-30 10:07:58 +09:00
fc9f1a6380 Update image 2019-09-26 19:06:44 +09:00
4bb662aed6 Update README 2019-09-26 19:03:42 +09:00
a5c1d5b56d Update README 2019-09-26 18:19:51 +09:00
dc7361b29a Update image 2019-09-26 18:14:05 +09:00
3c9fba7af9 Update README 2019-09-26 18:07:43 +09:00
ae3acffc2b Merge pull request #46 from peter-evans/issue-params
Issue params
2019-09-26 17:54:10 +09:00
f3f5770a0e Update workflows 2019-09-26 17:49:23 +09:00
64178c87e0 Add new optional parameters 2019-09-26 17:48:53 +09:00
b1a0d5fc24 Update README 2019-09-26 13:35:59 +09:00
7beba58e42 Merge pull request #45 from peter-evans/git-lfs
Update Docker Image to include support for git-lfs
2019-09-26 13:27:02 +09:00
062968931c Update Docker Image to include support for git-lfs 2019-09-26 12:34:25 +09:00
76116b7f39 Update README 2019-09-25 23:58:47 +09:00
e635c55400 Update README 2019-09-25 09:42:45 +09:00
9e25487be4 Update workflows 2019-09-25 09:25:52 +09:00
39529236f7 Update README 2019-09-24 20:35:00 +09:00
f0728e6543 Update README 2019-09-24 20:27:25 +09:00
188c998f8f Update README 2019-09-24 20:23:49 +09:00
1fc2947eb6 Merge pull request #42 from peter-evans/new-params
New parameters
2019-09-24 20:13:43 +09:00
4e47f5e151 Add branch suffix parameter 2019-09-24 20:00:49 +09:00
e543bbd98a Merge pull request #41 from ScriptAutomate/master
Add skip_ignore arg to ignore_event function
2019-09-24 19:21:12 +09:00
4fb3c76ad7 Introduced SKIP_IGNORE env variable option
If the SKIP_IGNORE env var is present, the ignore_event function will not run
2019-09-24 01:08:16 -07:00
fcc56736a6 Add skip_ignore arg to ignore_event function
During testing, I found it useful to have this function skipped so I added a simple check for SKIP_IGNORE env variable
2019-09-24 00:56:53 -07:00
014d447f0c Update README 2019-09-20 10:23:15 +09:00
9d998cbb4c Remove need for repo scoped token 2019-09-20 10:14:51 +09:00
baab1666cc Update README 2019-09-20 09:47:11 +09:00
f639d94f5e Fix ignore_event for all non-push events 2019-09-20 09:39:09 +09:00
fd4e62ed7d Update README 2019-09-12 16:18:12 +09:00
21aff96eee Fix author email and name for scheduled jobs 2019-09-12 16:03:46 +09:00
f4703cdc23 Update README 2019-09-10 18:06:54 +09:00
7980880191 Fix missing colon 2019-09-10 17:58:01 +09:00
4efcea62da Merge pull request #30 from stefanbuck/fix-29-scheduled-jobs
Do not break Action when using schedule jobs
2019-09-10 17:50:03 +09:00
580fc69c02 Fix scheduled events issue 2019-09-10 09:14:39 +02:00
facb42d776 Merge pull request #26 from peter-evans/renovate/gitpython-3.x
Update dependency GitPython to v3.0.2
2019-08-22 13:50:04 +09:00
37fd4d3558 Update dependency GitPython to v3.0.2 2019-08-22 04:38:51 +00:00
bc78d4cf02 Merge pull request #23 from peter-evans/renovate/gitpython-3.x
Update dependency GitPython to v3.0.1
2019-08-15 12:41:54 +09:00
91ff2766bf Update dependency GitPython to v3.0.1 2019-08-15 03:27:28 +00:00
c216905beb Update README 2019-08-13 19:07:24 +09:00
045ccaa641 Ignore events for tags and remotes 2019-08-13 19:00:56 +09:00
a26e9f2362 Update README 2019-08-13 18:26:08 +09:00
860dc038c0 Update for actions v2 2019-08-13 18:14:51 +09:00
c0be263859 Merge pull request #16 from peter-evans/renovate/gitpython-3.x
Update dependency GitPython to v3
2019-08-12 14:43:52 +09:00
0f3781327e Convert main.workflow to v2 yml 2019-08-12 14:32:59 +09:00
9b034ebd2d Update dependency GitPython to v3 2019-08-12 03:30:45 +00:00
9a709f0173 Merge pull request #13 from peter-evans/renovate/gitpython-2.x
Update dependency GitPython to v2.1.13
2019-07-29 10:55:57 +09:00
cddd8048c2 Update dependency GitPython to v2.1.13 2019-07-29 01:27:39 +00:00
8fe03d2026 Add explanation for ignoring the push event on deleted branches 2019-07-23 11:26:05 +09:00
a5bdb09ebe Update README 2019-07-23 10:52:44 +09:00
ed39fe9b45 Merge pull request #4 from peter-evans/renovate/gitpython-2.x
Update dependency GitPython to v2.1.12
2019-07-21 17:07:13 +09:00
f7b04aed2a Update dependency GitPython to v2.1.12 2019-07-21 08:04:14 +00:00
d9e4270c6c Merge pull request #3 from peter-evans/renovate/pygithub-1.x
Update dependency PyGithub to v1.43.8
2019-07-21 17:01:09 +09:00
e7637f96b8 Update dependency PyGithub to v1.43.8 2019-07-21 07:59:08 +00:00
dc019ec39e Update main.workflow 2019-07-21 13:36:09 +09:00
abaaf77b6e Update main.workflow 2019-07-21 13:31:41 +09:00
16d0603e20 Merge pull request #1 from peter-evans/renovate/configure
Configure Renovate
2019-07-18 18:47:19 +09:00
5ffebf4a64 Add CODEOWNERS 2019-07-18 18:46:39 +09:00
ab526929c6 Add renovate.json 2019-07-18 09:44:25 +00:00
754ec11bc0 Update entrypoint 2019-07-18 18:37:30 +09:00
d73557c33a Update README 2019-07-16 22:56:36 +09:00
f03950e9c3 Update README 2019-07-16 20:43:33 +09:00
83e2ff790e Update README 2019-07-16 20:42:29 +09:00
13 changed files with 399 additions and 100 deletions

1
.github/CODEOWNERS vendored Normal file
View File

@ -0,0 +1 @@
* @peter-evans

View File

@ -0,0 +1,42 @@
on:
repository_dispatch:
types: [create-pull-request-multi]
name: create-pull-request workflow
jobs:
createPullRequest:
name: Testing on ${{ matrix.platform }}
strategy:
matrix:
platform: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v1
- name: Create report file
if: matrix.platform == 'ubuntu-latest' || matrix.platform == 'macos-latest'
run: date +%s > report.txt
- name: Create report file (windows)
if: matrix.platform == 'windows-latest'
run: echo %DATE% %TIME% > report.txt
- name: Create Pull Request
uses: peter-evans/create-pull-request@multi-platform-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMMIT_MESSAGE: Add report file
COMMIT_AUTHOR_EMAIL: peter-evans@users.noreply.github.com
COMMIT_AUTHOR_NAME: Peter Evans
PULL_REQUEST_TITLE: '[Example] Add report file'
PULL_REQUEST_BODY: >
This PR is auto-generated by
[create-pull-request](https://github.com/peter-evans/create-pull-request).
PULL_REQUEST_LABELS: report, automated pr
PULL_REQUEST_ASSIGNEES: peter-evans
PULL_REQUEST_REVIEWERS: peter-evans
PULL_REQUEST_MILESTONE: 1
PULL_REQUEST_BRANCH: example-patches
BRANCH_SUFFIX: 'random'
- name: Check output environment variable
if: matrix.platform == 'ubuntu-latest' || matrix.platform == 'macos-latest'
run: echo "Pull Request Number - $PULL_REQUEST_NUMBER"
- name: Check output environment variable (windows)
if: matrix.platform == 'windows-latest'
run: echo Pull Request Number - %PULL_REQUEST_NUMBER%

View File

@ -0,0 +1,30 @@
on:
repository_dispatch:
types: [create-pull-request]
name: create-pull-request workflow
jobs:
createPullRequest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Create report file
run: date +%s > report.txt
- name: Create Pull Request
uses: ./
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMMIT_MESSAGE: Add report file
COMMIT_AUTHOR_EMAIL: peter-evans@users.noreply.github.com
COMMIT_AUTHOR_NAME: Peter Evans
PULL_REQUEST_TITLE: '[Example] Add report file'
PULL_REQUEST_BODY: >
This PR is auto-generated by
[create-pull-request](https://github.com/peter-evans/create-pull-request).
PULL_REQUEST_LABELS: report, automated pr
PULL_REQUEST_ASSIGNEES: peter-evans
PULL_REQUEST_REVIEWERS: peter-evans
PULL_REQUEST_MILESTONE: 1
PULL_REQUEST_BRANCH: example-patches
BRANCH_SUFFIX: short-commit-hash
- name: Check output environment variable
run: echo "Pull Request Number - $PULL_REQUEST_NUMBER"

16
.github/workflows/push.yml vendored Normal file
View File

@ -0,0 +1,16 @@
name: Update Docker Hub Description
on:
push:
branches:
- master
jobs:
dockerHubDescription:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Docker Hub Description
uses: peter-evans/dockerhub-description@v2.1.0
env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }}
DOCKERHUB_REPOSITORY: peterevans/create-pull-request

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.DS_Store

View File

@ -1,4 +1,4 @@
FROM python:3.7.3 FROM alpine:3.10.2
LABEL maintainer="Peter Evans <mail@peterevans.dev>" LABEL maintainer="Peter Evans <mail@peterevans.dev>"
LABEL repository="https://github.com/peter-evans/create-pull-request" LABEL repository="https://github.com/peter-evans/create-pull-request"
@ -11,8 +11,10 @@ LABEL com.github.actions.color="gray-dark"
COPY LICENSE README.md / COPY LICENSE README.md /
RUN apk add python3-dev git git-lfs
COPY requirements.txt /tmp/ COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt RUN pip3 install --requirement /tmp/requirements.txt
COPY create-pull-request.py /create-pull-request.py COPY create-pull-request.py /create-pull-request.py
ENTRYPOINT [ "python", "/create-pull-request.py" ] ENTRYPOINT [ "/create-pull-request.py" ]

162
README.md
View File

@ -1,68 +1,160 @@
# Create Pull Request # <img width="24" height="24" src="logo.svg"> Create Pull Request
[![GitHub Marketplace](https://img.shields.io/badge/Marketplace-Create%20Pull%20Request-blue.svg?colorA=24292e&colorB=0366d6&style=flat&longCache=true&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAM6wAADOsB5dZE0gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAERSURBVCiRhZG/SsMxFEZPfsVJ61jbxaF0cRQRcRJ9hlYn30IHN/+9iquDCOIsblIrOjqKgy5aKoJQj4O3EEtbPwhJbr6Te28CmdSKeqzeqr0YbfVIrTBKakvtOl5dtTkK+v4HfA9PEyBFCY9AGVgCBLaBp1jPAyfAJ/AAdIEG0dNAiyP7+K1qIfMdonZic6+WJoBJvQlvuwDqcXadUuqPA1NKAlexbRTAIMvMOCjTbMwl1LtI/6KWJ5Q6rT6Ht1MA58AX8Apcqqt5r2qhrgAXQC3CZ6i1+KMd9TRu3MvA3aH/fFPnBodb6oe6HM8+lYHrGdRXW8M9bMZtPXUji69lmf5Cmamq7quNLFZXD9Rq7v0Bpc1o/tp0fisAAAAASUVORK5CYII=)](https://github.com/marketplace/actions/create-pull-request) [![GitHub Marketplace](https://img.shields.io/badge/Marketplace-Create%20Pull%20Request-blue.svg?colorA=24292e&colorB=0366d6&style=flat&longCache=true&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAM6wAADOsB5dZE0gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAERSURBVCiRhZG/SsMxFEZPfsVJ61jbxaF0cRQRcRJ9hlYn30IHN/+9iquDCOIsblIrOjqKgy5aKoJQj4O3EEtbPwhJbr6Te28CmdSKeqzeqr0YbfVIrTBKakvtOl5dtTkK+v4HfA9PEyBFCY9AGVgCBLaBp1jPAyfAJ/AAdIEG0dNAiyP7+K1qIfMdonZic6+WJoBJvQlvuwDqcXadUuqPA1NKAlexbRTAIMvMOCjTbMwl1LtI/6KWJ5Q6rT6Ht1MA58AX8Apcqqt5r2qhrgAXQC3CZ6i1+KMd9TRu3MvA3aH/fFPnBodb6oe6HM8+lYHrGdRXW8M9bMZtPXUji69lmf5Cmamq7quNLFZXD9Rq7v0Bpc1o/tp0fisAAAAASUVORK5CYII=)](https://github.com/marketplace/actions/create-pull-request)
A GitHub action to create a pull request for changes to your repository in the actions workspace. A GitHub action to create a pull request for changes to your repository in the actions workspace.
Changes to a repository in the actions workspace persist between actions in a workflow. Changes to a repository in the Actions workspace persist between steps in a workflow.
This action is useful to pair with other actions that modify or add files to your repository. This action is designed to be used in conjunction with other steps that modify or add files to your repository.
The changes will be automatically committed to a new branch and a pull request created. The changes will be automatically committed to a new branch and a pull request created.
Create Pull Request action will: Create Pull Request action will:
1. Check for repository changes in the actions workspace. This includes untracked (new) files as well as modified files. 1. Check for repository changes in the Actions workspace. This includes untracked (new) files as well as modified files.
2. Commit all changes to a new branch. The commit will be made using the name and email of the `HEAD` commit author. 2. Commit all changes to a new branch, or update an existing pull request branch. The commit will be made using the name and email of the `HEAD` commit author.
3. Create a pull request to merge the new branch into the currently active branch executing the workflow. 3. Create a pull request to merge the new branch into the currently active branch executing the workflow.
## Usage ## Usage
```hcl Linux
action "Create Pull Request" { ```yml
uses = "peter-evans/create-pull-request@v1.0.0" - name: Create Pull Request
secrets = ["GITHUB_TOKEN"] uses: peter-evans/create-pull-request@v1.5.0
} env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
``` ```
#### Environment variables Multi platform - Linux, MacOS, Windows (beta)
```yml
- name: Create Pull Request
uses: peter-evans/create-pull-request@v1.5.0-multi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```
**Note**: If you want pull requests created by this action to trigger an `on: pull_request` workflow then you must use a Personal Access Token instead of the default `GITHUB_TOKEN`.
See [this issue](https://github.com/peter-evans/create-pull-request/issues/48) for further details.
### Environment variables
These variables are all optional. If not set, a default value will be used. These variables are all optional. If not set, a default value will be used.
- `PULL_REQUEST_BRANCH` - The branch name. See **Branch naming** below for details.
- `COMMIT_MESSAGE` - The message to use when committing changes. - `COMMIT_MESSAGE` - The message to use when committing changes.
- `PULL_REQUEST_TITLE` - The title of the pull request. - `PULL_REQUEST_TITLE` - The title of the pull request.
- `PULL_REQUEST_BODY` - The body of the pull request. - `PULL_REQUEST_BODY` - The body of the pull request.
- `PULL_REQUEST_LABELS` - A comma separated list of labels.
- `PULL_REQUEST_ASSIGNEES` - A comma separated list of assignees (GitHub usernames).
- `PULL_REQUEST_REVIEWERS` - A comma separated list of reviewers (GitHub usernames) to request a review from.
- `PULL_REQUEST_TEAM_REVIEWERS` - A comma separated list of GitHub teams to request a review from.
- `PULL_REQUEST_MILESTONE` - The number of the milestone to associate this pull request with.
- `PULL_REQUEST_BRANCH` - The branch name. See **Branch naming** below for details.
- `BRANCH_SUFFIX` - The branch suffix type. Valid values are `short-commit-hash` (default), `timestamp`, `random` and `none`. See **Branch naming** below for details.
#### Branch naming Output environment variables
The variable `PULL_REQUEST_BRANCH` defaults to `create-pull-request/patch`. - `PULL_REQUEST_NUMBER` - The number of the pull request created.
Commits will be made to a branch with this name and suffixed with the short SHA1 commit hash.
e.g. The following parameters are available for debugging and troubleshooting.
```
create-pull-request/patch-fcdfb59
create-pull-request/patch-394710b
```
#### Ignoring files - `DEBUG_EVENT` - If present, outputs the event data that triggered the workflow.
- `SKIP_IGNORE` - If present, the `ignore_event` function will be skipped.
### Branch naming
For branch naming there are two strategies. Always create a new branch each time there are changes to be committed, OR, create a fixed-name pull request branch that will be updated with any new commits until it is merged or closed.
#### Strategy A - Always create a new pull request branch (default)
For this strategy there are three options to suffix the branch name.
The branch name is defined by the variable `PULL_REQUEST_BRANCH` and defaults to `create-pull-request/patch`. The following options are values for `BRANCH_SUFFIX`.
- `short-commit-hash` (default) - Commits will be made to a branch suffixed with the short SHA1 commit hash. e.g. `create-pull-request/patch-fcdfb59`, `create-pull-request/patch-394710b`
- `timestamp` - Commits will be made to a branch suffixed by a timestamp. e.g. `create-pull-request/patch-1569322532`, `create-pull-request/patch-1569322552`
- `random` - Commits will be made to a branch suffixed with a random alpha-numeric string. This option should be used if multiple pull requests will be created during the execution of a workflow. e.g. `create-pull-request/patch-6qj97jr`, `create-pull-request/patch-5jrjhvd`
#### Strategy B - Create and update a pull request branch
To use this strategy, set `BRANCH_SUFFIX` to the value `none`. The variable `PULL_REQUEST_BRANCH` defaults to `create-pull-request/patch`. Commits will be made to this branch and a pull request created. Any subsequent changes will be committed to the *same* branch and reflected in the existing pull request.
### Ignoring files
If there are files or directories you want to ignore you can simply add them to a `.gitignore` file at the root of your repository. The action will respect this file. If there are files or directories you want to ignore you can simply add them to a `.gitignore` file at the root of your repository. The action will respect this file.
## Example ## Examples
Here is an example that sets all the environment variables. Here is an example that sets all the main environment variables.
```hcl ```yml
action "Create Pull Request" { on:
uses = "peter-evans/create-pull-request@v1.0.0" repository_dispatch:
secrets = ["GITHUB_TOKEN"] types: [create-pull-request]
env = { name: create-pull-request workflow
PULL_REQUEST_BRANCH = "auto-branch" jobs:
COMMIT_MESSAGE = "Auto-modify files by my-file-modifier-action" createPullRequest:
PULL_REQUEST_TITLE = "Changes from my-file-modifier-action" runs-on: ubuntu-latest
PULL_REQUEST_BODY = "This is an auto-generated PR with changes from my-file-modifier-action" steps:
} - uses: actions/checkout@v1
} - name: Create report file
run: date +%s > report.txt
- name: Create Pull Request
uses: peter-evans/create-pull-request@v1.5.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMMIT_MESSAGE: Add report file
PULL_REQUEST_TITLE: '[Example] Add report file'
PULL_REQUEST_BODY: >
This PR is auto-generated by
[create-pull-request](https://github.com/peter-evans/create-pull-request).
PULL_REQUEST_LABELS: report, automated pr
PULL_REQUEST_ASSIGNEES: peter-evans
PULL_REQUEST_REVIEWERS: peter-evans
PULL_REQUEST_MILESTONE: 1
PULL_REQUEST_BRANCH: example-patches
BRANCH_SUFFIX: short-commit-hash
- name: Check output environment variable
run: echo "Pull Request Number - $PULL_REQUEST_NUMBER"
```
This configuration will create pull requests that look like this:
![Pull Request Example](https://github.com/peter-evans/create-pull-request/blob/master/pull-request-example.png?raw=true)
### Dynamic configuration using variables
The following examples show how configuration for the action can be dynamically defined in a previous workflow step.
The recommended method is to use `set-output`. Note that the step where output variables are defined must have an id.
```yml
- name: Set output variables
id: vars
run: |
echo ::set-output name=pr_title::"[Test] Add report file $(date +%d-%m-%Y)"
echo ::set-output name=pr_body::"This PR was auto-generated on $(date +%d-%m-%Y) \
by [create-pull-request](https://github.com/peter-evans/create-pull-request)."
- name: Create Pull Request
uses: peter-evans/create-pull-request@v1.5.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PULL_REQUEST_TITLE: ${{ steps.vars.outputs.pr_title }}
PULL_REQUEST_BODY: ${{ steps.vars.outputs.pr_body }}
```
Since the action reads environment variables from the system, it's technically not necessary to explicitly pass them as long as they exist in the environment. So the following method using `set-env` *also* works, but explicitly passing the configuration parameters using the previous method is perferred for its clarity.
```yml
- name: Set environment variables
run: |
echo ::set-env name=PULL_REQUEST_TITLE::"[Test] Add report file $(date +%d-%m-%Y)"
echo ::set-env name=PULL_REQUEST_BODY::"This PR was auto-generated on $(date +%d-%m-%Y) \
by [create-pull-request](https://github.com/peter-evans/create-pull-request)."
- name: Create Pull Request
uses: peter-evans/create-pull-request@v1.5.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
``` ```
## License ## License
MIT License - see the [LICENSE](LICENSE) file for details [MIT](LICENSE)

9
action.yml Normal file
View File

@ -0,0 +1,9 @@
name: 'Create Pull Request'
author: 'Peter Evans'
description: 'Creates a pull request for changes to your repository in the actions workspace'
runs:
using: 'docker'
image: 'docker://peterevans/create-pull-request:1.5.1'
branding:
icon: 'git-pull-request'
color: 'gray-dark'

215
create-pull-request.py Normal file → Executable file
View File

@ -1,6 +1,11 @@
''' create-pull-request.py ''' #!/usr/bin/env python3
''' Create Pull Request '''
import json import json
import os import os
import random
import string
import sys
import time
from git import Repo from git import Repo
from github import Github from github import Github
@ -8,62 +13,95 @@ from github import Github
def get_github_event(github_event_path): def get_github_event(github_event_path):
with open(github_event_path) as f: with open(github_event_path) as f:
github_event = json.load(f) github_event = json.load(f)
if os.environ.get('DEBUG_EVENT') is not None: if bool(os.environ.get('DEBUG_EVENT')):
print(os.environ['GITHUB_EVENT_NAME'])
print(json.dumps(github_event, sort_keys=True, indent=2)) print(json.dumps(github_event, sort_keys=True, indent=2))
return github_event return github_event
def ignore_event(github_event): def ignore_event(event_name, event_data):
# Ignore push events on deleted branches if event_name == "push":
deleted = "{deleted}".format(**github_event) # Ignore push events on deleted branches
if deleted == "True": # The event we want to ignore occurs when a PR is created but the repository owner decides
print("Ignoring delete branch event.") # not to commit the changes. They close the PR and delete the branch. This creates a
return True # "push" event that we want to ignore, otherwise it will create another branch and PR on
# the same commit.
deleted = "{deleted}".format(**event_data)
if deleted == "True":
print("Ignoring delete branch event.")
return True
ref = "{ref}".format(**event_data)
if not ref.startswith('refs/heads/'):
print("Ignoring events for tags and remotes.")
return True
return False return False
def pr_branch_exists(repo, branch): def get_head_short_sha1(repo):
return repo.git.rev_parse('--short', 'HEAD')
def get_random_suffix(size=7, chars=string.ascii_lowercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
def remote_branch_exists(repo, branch):
for ref in repo.remotes.origin.refs: for ref in repo.remotes.origin.refs:
if ref.name == ("origin/%s" % branch): if ref.name == ("origin/%s" % branch):
return True return True
return False return False
def get_head_author(github_event): def get_author_default(event_name, event_data):
email = "{head_commit[author][email]}".format(**github_event) if event_name == "push":
name = "{head_commit[author][name]}".format(**github_event) email = "{head_commit[author][email]}".format(**event_data)
name = "{head_commit[author][name]}".format(**event_data)
else:
email = os.environ['GITHUB_ACTOR'] + '@users.noreply.github.com'
name = os.environ['GITHUB_ACTOR']
return email, name return email, name
def get_head_short_sha1(repo):
return repo.git.rev_parse('--short', 'HEAD')
def set_git_config(git, email, name): def set_git_config(git, email, name):
git.config('--global', 'user.email', '"%s"' % email) git.config('--global', 'user.email', '"%s"' % email)
git.config('--global', 'user.name', '"%s"' % name) git.config('--global', 'user.name', '"%s"' % name)
def commit_changes(git, branch, commit_message): def set_git_remote_url(git, token, github_repository):
git.checkout('HEAD', b=branch) git.remote('set-url', 'origin', "https://x-access-token:%s@github.com/%s" % (token, github_repository))
def checkout_branch(git, remote_exists, branch):
if remote_exists:
git.stash('--include-untracked')
git.checkout(branch)
try:
git.stash('pop')
except:
git.checkout('--theirs', '.')
git.reset()
else:
git.checkout('HEAD', b=branch)
def push_changes(git, branch, commit_message):
git.add('-A') git.add('-A')
git.commit(m=commit_message) git.commit(m=commit_message)
return git.push('--set-upstream', 'origin', branch) return git.push('-f', '--set-upstream', 'origin', branch)
def create_pull_request(token, repo, head, base, title, body): def cs_string_to_list(str):
return Github(token).get_repo(repo).create_pull( # Split the comma separated string into a list
title=title, l = [i.strip() for i in str.split(',')]
body=body, # Remove empty strings
base=base, return list(filter(None, l))
head=head)
def process_event(github_event, repo, branch): def process_event(event_name, event_data, repo, branch, base, remote_exists):
# Fetch required environment variables # Fetch required environment variables
github_token = os.environ['GITHUB_TOKEN'] github_token = os.environ['GITHUB_TOKEN']
github_repository = os.environ['GITHUB_REPOSITORY'] github_repository = os.environ['GITHUB_REPOSITORY']
# Fetch remaining optional environment variables # Fetch optional environment variables with default values
commit_message = os.getenv( commit_message = os.getenv(
'COMMIT_MESSAGE', 'COMMIT_MESSAGE',
"Auto-committed changes by create-pull-request action") "Auto-committed changes by create-pull-request action")
@ -73,54 +111,111 @@ def process_event(github_event, repo, branch):
body = os.getenv( body = os.getenv(
'PULL_REQUEST_BODY', "Auto-generated pull request by " 'PULL_REQUEST_BODY', "Auto-generated pull request by "
"[create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub Action") "[create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub Action")
# Fetch optional environment variables with no default values
pull_request_labels = os.environ.get('PULL_REQUEST_LABELS')
pull_request_assignees = os.environ.get('PULL_REQUEST_ASSIGNEES')
pull_request_milestone = os.environ.get('PULL_REQUEST_MILESTONE')
pull_request_reviewers = os.environ.get('PULL_REQUEST_REVIEWERS')
pull_request_team_reviewers = os.environ.get('PULL_REQUEST_TEAM_REVIEWERS')
# Get the HEAD committer's email and name # Update URL for the 'origin' remote
author_email, author_name = get_head_author(github_event) set_git_remote_url(repo.git, github_token, github_repository)
# Set git configuration
set_git_config(repo.git, author_email, author_name)
# Set the target base branch of the pull request # Push the local changes to the remote branch
base = repo.active_branch.name print("Pushing changes.")
push_result = push_changes(repo.git, branch, commit_message)
print(push_result)
# Commit the repository changes # If the remote existed then a PR likely exists and we can finish here
print("Committing changes.") if remote_exists:
commit_result = commit_changes(repo.git, branch, commit_message) print("Updated pull request branch %s." % branch)
print(commit_result) sys.exit()
# Create the pull request # Create the pull request
print("Creating a request to pull %s into %s." % (branch, base)) print("Creating a request to pull %s into %s." % (branch, base))
pull_request = create_pull_request( github_repo = Github(github_token).get_repo(github_repository)
github_token, pull_request = github_repo.create_pull(
github_repository, title=title,
branch, body=body,
base, base=base,
title, head=branch)
body
)
print("Created pull request %d." % pull_request.number) print("Created pull request %d." % pull_request.number)
os.system('echo ::set-env name=PULL_REQUEST_NUMBER::%d' % pull_request.number)
# Set labels, assignees and milestone
if pull_request_labels is not None:
print("Applying labels")
pull_request.as_issue().edit(labels=cs_string_to_list(pull_request_labels))
if pull_request_assignees is not None:
print("Applying assignees")
pull_request.as_issue().edit(assignees=cs_string_to_list(pull_request_assignees))
if pull_request_milestone is not None:
print("Applying milestone")
milestone = github_repo.get_milestone(int(pull_request_milestone))
pull_request.as_issue().edit(milestone=milestone)
# Set pull request reviewers and team reviewers
if pull_request_reviewers is not None:
print("Requesting reviewers")
pull_request.create_review_request(reviewers=cs_string_to_list(pull_request_reviewers))
if pull_request_team_reviewers is not None:
print("Requesting team reviewers")
pull_request.create_review_request(team_reviewers=cs_string_to_list(pull_request_team_reviewers))
# Get the JSON event data # Get the JSON event data
github_event = get_github_event(os.environ['GITHUB_EVENT_PATH']) event_name = os.environ['GITHUB_EVENT_NAME']
event_data = get_github_event(os.environ['GITHUB_EVENT_PATH'])
# Check if this event should be ignored # Check if this event should be ignored
if not ignore_event(github_event): skip_ignore_event = bool(os.environ.get('SKIP_IGNORE'))
if skip_ignore_event or not ignore_event(event_name, event_data):
# Set the repo to the working directory # Set the repo to the working directory
repo = Repo(os.getcwd()) repo = Repo(os.getcwd())
# Fetch/Set the branch name # Fetch/Set the branch name
branch = os.getenv('PULL_REQUEST_BRANCH', 'create-pull-request/patch') branch = os.getenv('PULL_REQUEST_BRANCH', 'create-pull-request/patch')
# Suffix with the short SHA1 hash # Set the current branch as the target base branch
branch = "%s-%s" % (branch, get_head_short_sha1(repo)) base = os.environ['GITHUB_REF'][11:]
# Check if a PR branch already exists for this HEAD commit # Skip if the current branch is a PR branch created by this action
if not pr_branch_exists(repo, branch): if base.startswith(branch):
# Check if there are changes to pull request print("Branch '%s' was created by this action. Skipping." % base)
if repo.is_dirty() or len(repo.untracked_files) > 0: sys.exit()
print("Repository has modified or untracked files.")
process_event(github_event, repo, branch) # Fetch an optional environment variable to determine the branch suffix
else: branch_suffix = os.getenv('BRANCH_SUFFIX', 'short-commit-hash')
print("Repository has no modified or untracked files. Skipping.") if branch_suffix == "short-commit-hash":
# Suffix with the short SHA1 hash
branch = "%s-%s" % (branch, get_head_short_sha1(repo))
elif branch_suffix == "timestamp":
# Suffix with the current timestamp
branch = "%s-%s" % (branch, int(time.time()))
elif branch_suffix == "random":
# Suffix with the current timestamp
branch = "%s-%s" % (branch, get_random_suffix())
# Check if the remote branch exists
remote_exists = remote_branch_exists(repo, branch)
# If using short commit hash prefixes, check if a remote
# branch already exists for this HEAD commit
if branch_suffix == 'short-commit-hash' and remote_exists:
print("Pull request branch '%s' already exists for this commit. Skipping." % branch)
sys.exit()
# Get the default for author email and name
author_email, author_name = get_author_default(event_name, event_data)
# Set commit author overrides
author_email = os.getenv('COMMIT_AUTHOR_EMAIL', author_email)
author_name = os.getenv('COMMIT_AUTHOR_NAME', author_name)
# Set git configuration
set_git_config(repo.git, author_email, author_name)
# Checkout branch
checkout_branch(repo.git, remote_exists, branch)
# Check if there are changes to pull request
if repo.is_dirty() or len(repo.untracked_files) > 0:
print("Repository has modified or untracked files.")
process_event(event_name, event_data, repo, branch, base, remote_exists)
else: else:
print( print("Repository has no modified or untracked files. Skipping.")
"Pull request branch '%s' already exists for this commit. Skipping." %
branch)

6
logo.svg Normal file
View File

@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="43%" height="43%" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="color: #000000;"><title>git-pull-request</title>
<circle cx="18" cy="18" r="3"></circle>
<circle cx="6" cy="6" r="3"></circle>
<path d="M13 6h3a2 2 0 0 1 2 2v7"></path>
<line x1="6" y1="9" x2="6" y2="21"></line>
</svg>

After

Width:  |  Height:  |  Size: 416 B

BIN
pull-request-example.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

5
renovate.json Normal file
View File

@ -0,0 +1,5 @@
{
"extends": [
"config:base"
]
}

View File

@ -1,2 +1,2 @@
GitPython==2.1.11 GitPython==3.0.3
PyGithub==1.43.7 PyGithub==1.43.8