Compare commits

...

78 Commits

Author SHA1 Message Date
Peter Evans
30d1717e23 Merge branch 'multi-platform' into multi-platform-release 2019-11-04 11:09:33 +09:00
Peter Evans
7776199bb3 Merge branch 'master' into multi-platform 2019-11-04 11:09:15 +09:00
Peter Evans
b72489d629 Update image version 2019-11-04 11:08:47 +09:00
Peter Evans
1461de7c9d Update README 2019-11-04 11:01:08 +09:00
Peter Evans
3061b7bc6e Update workflows 2019-11-04 11:01:00 +09:00
Peter Evans
98ee7d63d3 Improvements to updating pull requests 2019-11-04 11:00:38 +09:00
Peter Evans
066b4398c0 Merge pull request #66 from staabm/patch-2
Link ::set-output
2019-11-03 18:42:49 +09:00
Markus Staab
028e1bbdd5 Link ::set-output 2019-11-03 10:38:30 +01:00
Peter Evans
8b8594e5e4 Update examples 2019-11-03 18:29:46 +09:00
Peter Evans
cefb562076 Merge pull request #63 from peter-evans/documentation
Update documentation
2019-11-03 17:46:08 +09:00
Peter Evans
9eccdd1603 Update README 2019-11-03 17:44:22 +09:00
Peter Evans
f429dfef59 Update examples 2019-11-03 17:41:42 +09:00
Peter Evans
963e38fd7d Add examples documentation 2019-11-03 17:37:39 +09:00
Peter Evans
f411b5902d Merge pull request #62 from peter-evans/asset-location
Update location of assets
2019-11-03 15:47:02 +09:00
Peter Evans
97dd1f3ef4 Update location of assets 2019-11-03 15:46:11 +09:00
Peter Evans
3413a77ac7 Update README 2019-10-30 16:10:02 +09:00
Peter Evans
95ff720144 Merge branch 'multi-platform' into multi-platform-release 2019-10-30 16:09:06 +09:00
Peter Evans
2fef6095be Merge branch 'master' into multi-platform 2019-10-30 16:08:52 +09:00
Peter Evans
206756cd93 Update image version 2019-10-30 16:04:28 +09:00
Peter Evans
263b5927d1 Remove ignore event logic 2019-10-30 15:27:54 +09:00
Peter Evans
a0ad81c6c7 Merge pull request #58 from peter-evans/renovate/gitpython-3.x
Update dependency GitPython to v3.0.4
2019-10-29 13:31:52 +09:00
Renovate Bot
23846c7f83 Update dependency GitPython to v3.0.4 2019-10-22 11:43:55 +00:00
Peter Evans
96ac64ddca Update README 2019-10-22 11:05:42 +09:00
Peter Evans
506b48a892 Merge branch 'multi-platform' into multi-platform-release 2019-10-22 11:04:12 +09:00
Peter Evans
030b718f27 Merge branch 'master' into multi-platform 2019-10-22 11:03:56 +09:00
Peter Evans
a2ed0052e5 Update image version 2019-10-22 11:01:54 +09:00
Peter Evans
6e7e889e01 Minor fixes and refactor 2019-10-22 10:55:33 +09:00
Peter Evans
7e18a60b72 Merge pull request #57 from peter-evans/renovate/docker-alpine-3.x
Update alpine Docker tag to v3.10.3
2019-10-22 10:53:31 +09:00
Renovate Bot
0be4e396cf Update alpine Docker tag to v3.10.3 2019-10-21 17:57:06 +00:00
Peter Evans
b86bbce924 Update README 2019-10-21 20:36:01 +09:00
Peter Evans
bf9134205d Merge branch 'multi-platform' into multi-platform-release 2019-10-21 20:34:05 +09:00
Peter Evans
3ebb3e5c35 Merge branch 'master' into multi-platform 2019-10-21 20:33:52 +09:00
Peter Evans
e1e9dd3f1c Update image version 2019-10-21 20:32:02 +09:00
Peter Evans
9e4b07e38d Merge branch 'multi-platform' into multi-platform-release 2019-10-21 20:23:12 +09:00
Peter Evans
6b66a45740 Merge branch 'master' into multi-platform 2019-10-21 20:22:27 +09:00
Peter Evans
8c2a43987b Add an override for the base branch 2019-10-21 20:17:31 +09:00
Peter Evans
c5ff844b40 Update README 2019-10-21 18:42:39 +09:00
Peter Evans
1f47cf3861 Update workflows 2019-10-21 18:31:14 +09:00
Peter Evans
bcdc7ae6f9 Merge pull request #55 from peter-evans/renovate/pygithub-1.x
Update dependency PyGithub to v1.44
2019-10-19 22:58:42 +09:00
Renovate Bot
91ca84eab5 Update dependency PyGithub to v1.44 2019-10-19 08:44:24 +00:00
Peter Evans
875d189c30 Update README 2019-10-14 18:09:59 +09:00
Peter Evans
7c3f5f4833 Update README 2019-10-14 16:12:27 +09:00
Peter Evans
7a7e797068 Update README 2019-10-14 16:11:09 +09:00
Peter Evans
a41f37fc96 Update README 2019-10-14 16:09:58 +09:00
Peter Evans
10554ac6c3 Update README 2019-10-14 15:59:21 +09:00
Peter Evans
2439726cfe Update README 2019-10-14 15:51:08 +09:00
Peter Evans
4f04f4efd9 Update workflows 2019-10-14 15:50:52 +09:00
Peter Evans
32d0abbc7c Update README 2019-10-14 15:07:11 +09:00
Peter Evans
ed5b8b1eea Update README 2019-10-14 12:38:52 +09:00
Peter Evans
ea241dfc79 Update README 2019-10-14 12:37:36 +09:00
Peter Evans
0e70fec054 Update README 2019-10-14 12:36:55 +09:00
Peter Evans
5077e8d6bd Rename dockerhub description workflow 2019-10-14 10:26:25 +09:00
Peter Evans
901e854f30 Update README 2019-10-14 02:02:55 +09:00
Peter Evans
83c11ef20d Merge branch 'multi-platform' into multi-platform-release 2019-10-14 02:01:51 +09:00
Peter Evans
4fce601813 Merge branch 'master' into multi-platform 2019-10-14 02:01:37 +09:00
Peter Evans
f3b1bd6331 Update image version 2019-10-14 01:58:42 +09:00
Peter Evans
51ade9f54b Fix for pull refs 2019-10-14 01:39:53 +09:00
Peter Evans
3c86dbf9e6 Update README 2019-10-06 15:13:32 +09:00
Peter Evans
b2d426ea4e Update README 2019-10-06 15:06:49 +09:00
Peter Evans
fbe0cd3d1a Update README 2019-10-06 14:59:45 +09:00
Peter Evans
234d8686a5 Merge branch 'multi-platform' into multi-platform-release 2019-10-06 14:58:05 +09:00
Peter Evans
b39e1dc4cf Merge branch 'master' into multi-platform 2019-10-06 14:57:52 +09:00
Peter Evans
5f9821866a Update workflows 2019-10-06 14:52:15 +09:00
Peter Evans
ee153ec8cf Update image version 2019-10-06 14:52:01 +09:00
Peter Evans
e138d84114 Add variables to override the commit author name and email 2019-10-06 14:38:15 +09:00
Peter Evans
90843d3c39 Update README 2019-10-05 09:22:43 +09:00
Peter Evans
90ad96bd01 Update workflows 2019-10-05 09:22:35 +09:00
Peter Evans
f8cc05d28d Update README 2019-10-04 14:53:58 +09:00
Peter Evans
fe78afb6d7 Update README 2019-10-04 14:46:26 +09:00
Peter Evans
a0c4cfcf18 Merge branch 'multi-platform' into multi-platform-release 2019-10-04 14:45:05 +09:00
Peter Evans
8c223b540a Merge branch 'master' into multi-platform 2019-10-04 14:44:44 +09:00
Peter Evans
af7dbce93d Merge remote-tracking branch 'origin/master' 2019-10-04 14:36:11 +09:00
Peter Evans
2e283eddc6 Add workflow to automatically update dockerhub description 2019-10-04 14:35:58 +09:00
Peter Evans
3e0a17d097 Update action to use pre-built container 2019-10-04 14:35:22 +09:00
Peter Evans
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
Renovate Bot
1397aded03 Update dependency GitPython to v3.0.3 2019-10-02 19:31:01 +00:00
Peter Evans
40fd4990fc Update README 2019-10-02 22:38:58 +09:00
Peter Evans
5784478398 Update README 2019-10-02 19:28:30 +09:00
11 changed files with 436 additions and 138 deletions

View File

@@ -1,7 +1,7 @@
name: create-pull-request workflow
on:
repository_dispatch:
types: [create-pull-request-multi]
name: create-pull-request workflow
jobs:
createPullRequest:
name: Testing on ${{ matrix.platform }}
@@ -22,10 +22,15 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMMIT_MESSAGE: Add report file
PULL_REQUEST_BODY: >
This PR is auto-generated by
[create-pull-request](https://github.com/peter-evans/create-pull-request).
COMMIT_AUTHOR_EMAIL: peter-evans@users.noreply.github.com
COMMIT_AUTHOR_NAME: Peter Evans
PULL_REQUEST_TITLE: '[Example] Add report file'
PULL_REQUEST_BODY: |
New report
- Contains *today's* date
- Auto-generated by [create-pull-request][1]
[1]: https://github.com/peter-evans/create-pull-request
PULL_REQUEST_LABELS: report, automated pr
PULL_REQUEST_ASSIGNEES: peter-evans
PULL_REQUEST_REVIEWERS: peter-evans
@@ -33,8 +38,4 @@ jobs:
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%
run: echo "Pull Request Number - ${{ env.PULL_REQUEST_NUMBER }}"

View File

@@ -1,7 +1,7 @@
name: create-pull-request workflow
on:
repository_dispatch:
types: [create-pull-request]
name: create-pull-request workflow
jobs:
createPullRequest:
runs-on: ubuntu-latest
@@ -14,10 +14,15 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMMIT_MESSAGE: Add report file
PULL_REQUEST_BODY: >
This PR is auto-generated by
[create-pull-request](https://github.com/peter-evans/create-pull-request).
COMMIT_AUTHOR_EMAIL: peter-evans@users.noreply.github.com
COMMIT_AUTHOR_NAME: Peter Evans
PULL_REQUEST_TITLE: '[Example] Add report file'
PULL_REQUEST_BODY: |
New report
- Contains *today's* date
- Auto-generated by [create-pull-request][1]
[1]: https://github.com/peter-evans/create-pull-request
PULL_REQUEST_LABELS: report, automated pr
PULL_REQUEST_ASSIGNEES: peter-evans
PULL_REQUEST_REVIEWERS: peter-evans
@@ -25,4 +30,4 @@ jobs:
PULL_REQUEST_BRANCH: example-patches
BRANCH_SUFFIX: short-commit-hash
- name: Check output environment variable
run: echo "Pull Request Number - $PULL_REQUEST_NUMBER"
run: echo "Pull Request Number - ${{ env.PULL_REQUEST_NUMBER }}"

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

View File

@@ -1,4 +1,4 @@
FROM alpine:3.10.2
FROM alpine:3.10.3
LABEL maintainer="Peter Evans <mail@peterevans.dev>"
LABEL repository="https://github.com/peter-evans/create-pull-request"

View File

@@ -1,4 +1,4 @@
# <img width="24" height="24" src="logo.svg"> Create Pull Request
# <img width="24" height="24" src="assets/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)
A GitHub action to create a pull request for changes to your repository in the actions workspace.
@@ -10,15 +10,17 @@ The changes will be automatically committed to a new branch and a pull request c
Create Pull Request action will:
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, or update an existing pull request 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.
3. Create a pull request to merge the new branch into the currently active branch executing the workflow.
## Usage
See [examples](examples.md) for detailed use cases.
Linux
```yml
- name: Create Pull Request
uses: peter-evans/create-pull-request@v1.4.0
uses: peter-evans/create-pull-request@v1.6.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```
@@ -26,34 +28,43 @@ Linux
Multi platform - Linux, MacOS, Windows (beta)
```yml
- name: Create Pull Request
uses: peter-evans/create-pull-request@v1.4.0-multi
uses: peter-evans/create-pull-request@v1.6.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](https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line) 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, sensible default values will be used.
- `COMMIT_MESSAGE` - The message to use when committing changes.
- `PULL_REQUEST_TITLE` - The title 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.
| Name | Description | Default |
| --- | --- | --- |
| `COMMIT_MESSAGE` | The message to use when committing changes. | `Auto-committed changes by create-pull-request action` |
| `COMMIT_AUTHOR_EMAIL` | The email address of the commit author. | For `push` events, the HEAD commit author. Otherwise, <GITHUB_ACTOR>@users.noreply.github.com, where `GITHUB_ACTOR` is the GitHub user that initiated the event. |
| `COMMIT_AUTHOR_NAME` | The name of the commit author. | For `push` events, the HEAD commit author. Otherwise, <GITHUB_ACTOR>, the GitHub user that initiated the event. |
| `PULL_REQUEST_TITLE` | The title of the pull request. | `Auto-generated by create-pull-request action` |
| `PULL_REQUEST_BODY` | The body of the pull request. | `Auto-generated pull request by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub Action` |
| `PULL_REQUEST_LABELS` | A comma separated list of labels. | none |
| `PULL_REQUEST_ASSIGNEES` | A comma separated list of assignees (GitHub usernames). | none |
| `PULL_REQUEST_REVIEWERS` | A comma separated list of reviewers (GitHub usernames) to request a review from. | none |
| `PULL_REQUEST_TEAM_REVIEWERS` | A comma separated list of GitHub teams to request a review from. | none |
| `PULL_REQUEST_MILESTONE` | The number of the milestone to associate this pull request with. | none |
| `PULL_REQUEST_BRANCH` | The branch name. See **Branch naming** below for details. | `create-pull-request/patch` |
| `PULL_REQUEST_BASE` | Overrides the base branch. **Use with caution!** | Defaults to the currently checked out branch. |
| `BRANCH_SUFFIX` | The branch suffix type. Valid values are `short-commit-hash`, `timestamp`, `random` and `none`. See **Branch naming** below for details. | `short-commit-hash` |
Output environment variables
**Output environment variables**
- `PULL_REQUEST_NUMBER` - The number of the pull request created.
The following parameters are available for debugging and troubleshooting.
**Debug environment variables**
The following parameter is available for debugging and troubleshooting.
- `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
@@ -78,15 +89,15 @@ To use this strategy, set `BRANCH_SUFFIX` to the value `none`. The variable `PUL
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
## Reference Example
Here is an example that sets all the main environment variables.
The following workflow is a reference example that sets all the main environment variables.
See [examples](examples.md) for more realistic use cases.
```yml
on:
repository_dispatch:
types: [create-pull-request]
name: create-pull-request workflow
name: Create Pull Request
on: push
jobs:
createPullRequest:
runs-on: ubuntu-latest
@@ -95,14 +106,19 @@ jobs:
- name: Create report file
run: date +%s > report.txt
- name: Create Pull Request
uses: peter-evans/create-pull-request@v1.4.0
uses: peter-evans/create-pull-request@v1.6.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMMIT_MESSAGE: Add report file
PULL_REQUEST_BODY: >
This PR is auto-generated by
[create-pull-request](https://github.com/peter-evans/create-pull-request).
COMMIT_AUTHOR_EMAIL: peter-evans@users.noreply.github.com
COMMIT_AUTHOR_NAME: Peter Evans
PULL_REQUEST_TITLE: '[Example] Add report file'
PULL_REQUEST_BODY: |
New report
- Contains *today's* date
- Auto-generated by [create-pull-request][1]
[1]: https://github.com/peter-evans/create-pull-request
PULL_REQUEST_LABELS: report, automated pr
PULL_REQUEST_ASSIGNEES: peter-evans
PULL_REQUEST_REVIEWERS: peter-evans
@@ -110,12 +126,12 @@ jobs:
PULL_REQUEST_BRANCH: example-patches
BRANCH_SUFFIX: short-commit-hash
- name: Check output environment variable
run: echo "Pull Request Number - $PULL_REQUEST_NUMBER"
run: echo "Pull Request Number - ${{ env.PULL_REQUEST_NUMBER }}"
```
This configuration will create pull requests that look like this:
This reference configuration will create pull requests that look like this:
![Pull Request Example](pull-request-example.png?raw=true)
![Pull Request Example](assets/pull-request-example.png)
## License

View File

Before

Width:  |  Height:  |  Size: 416 B

After

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 KiB

View File

@@ -8,6 +8,7 @@ import sys
import time
from git import Repo
from github import Github
from github import GithubException
def get_github_event(github_event_path):
@@ -19,24 +20,6 @@ def get_github_event(github_event_path):
return github_event
def ignore_event(event_name, event_data):
if event_name == "push":
# Ignore push events on deleted branches
# The event we want to ignore occurs when a PR is created but the repository owner decides
# not to commit the changes. They close the PR and delete the branch. This creates a
# "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
def get_head_short_sha1(repo):
return repo.git.rev_parse('--short', 'HEAD')
@@ -52,7 +35,7 @@ def remote_branch_exists(repo, branch):
return False
def get_head_author(event_name, event_data):
def get_author_default(event_name, event_data):
if event_name == "push":
email = "{head_commit[author][email]}".format(**event_data)
name = "{head_commit[author][name]}".format(**event_data)
@@ -68,7 +51,9 @@ def set_git_config(git, email, name):
def set_git_remote_url(git, token, github_repository):
git.remote('set-url', 'origin', "https://x-access-token:%s@github.com/%s" % (token, github_repository))
git.remote(
'set-url', 'origin', "https://x-access-token:%s@github.com/%s" %
(token, github_repository))
def checkout_branch(git, remote_exists, branch):
@@ -77,7 +62,7 @@ def checkout_branch(git, remote_exists, branch):
git.checkout(branch)
try:
git.stash('pop')
except:
except BaseException:
git.checkout('--theirs', '.')
git.reset()
else:
@@ -97,10 +82,7 @@ def cs_string_to_list(str):
return list(filter(None, l))
def process_event(event_name, event_data, repo, branch, base, remote_exists):
# Fetch required environment variables
github_token = os.environ['GITHUB_TOKEN']
github_repository = os.environ['GITHUB_REPOSITORY']
def process_event(github_token, github_repository, repo, branch, base):
# Fetch optional environment variables with default values
commit_message = os.getenv(
'COMMIT_MESSAGE',
@@ -118,29 +100,37 @@ def process_event(event_name, event_data, repo, branch, base, remote_exists):
pull_request_reviewers = os.environ.get('PULL_REQUEST_REVIEWERS')
pull_request_team_reviewers = os.environ.get('PULL_REQUEST_TEAM_REVIEWERS')
# Update URL for the 'origin' remote
set_git_remote_url(repo.git, github_token, github_repository)
# Push the local changes to the remote branch
print("Pushing changes.")
push_result = push_changes(repo.git, branch, commit_message)
print(push_result)
# If the remote existed then a PR likely exists and we can finish here
if remote_exists:
print("Updated pull request branch %s." % branch)
sys.exit()
# Create the pull request
print("Creating a request to pull %s into %s." % (branch, base))
github_repo = Github(github_token).get_repo(github_repository)
pull_request = github_repo.create_pull(
title=title,
body=body,
base=base,
head=branch)
print("Created pull request %d." % pull_request.number)
os.system('echo ::set-env name=PULL_REQUEST_NUMBER::%d' % pull_request.number)
try:
pull_request = github_repo.create_pull(
title=title,
body=body,
base=base,
head=branch)
print("Created pull request #%d (%s => %s)" %
(pull_request.number, branch, base))
except GithubException as e:
if e.status == 422:
pull_request = github_repo.get_pulls(
state='open',
base=base,
head=branch)[1]
print("Updated pull request #%d (%s => %s)" %
(pull_request.number, branch, base))
else:
print(str(e))
sys.exit(1)
# Set the output variable
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:
@@ -154,65 +144,116 @@ def process_event(event_name, event_data, repo, branch, base, remote_exists):
milestone = github_repo.get_milestone(int(pull_request_milestone))
pull_request.as_issue().edit(milestone=milestone)
# Set pull request reviewers and team reviewers
# Set pull request reviewers
if pull_request_reviewers is not None:
print("Requesting reviewers")
pull_request.create_review_request(reviewers=cs_string_to_list(pull_request_reviewers))
try:
pull_request.create_review_request(
reviewers=cs_string_to_list(pull_request_reviewers))
except GithubException as e:
# Likely caused by "Review cannot be requested from pull request author."
if e.status == 422:
print("Requesting reviewers failed - %s" % e.data["message"])
# Set pull request team 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))
pull_request.create_review_request(
team_reviewers=cs_string_to_list(pull_request_team_reviewers))
# Get the JSON event data
# Fetch environment variables
github_token = os.environ['GITHUB_TOKEN']
github_repository = os.environ['GITHUB_REPOSITORY']
github_ref = os.environ['GITHUB_REF']
event_name = os.environ['GITHUB_EVENT_NAME']
# Get the JSON event data
event_data = get_github_event(os.environ['GITHUB_EVENT_PATH'])
# Check if this event should be ignored
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
repo = Repo(os.getcwd())
# Fetch/Set the branch name
branch = os.getenv('PULL_REQUEST_BRANCH', 'create-pull-request/patch')
# Set the current branch as the target base branch
base = os.environ['GITHUB_REF'][11:]
# Set the repo to the working directory
repo = Repo(os.getcwd())
# 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)
# Update URL for the 'origin' remote
set_git_remote_url(repo.git, github_token, github_repository)
# Skip if the current branch is a PR branch created by this action
if base.startswith(branch):
print("Branch '%s' was created by this action. Skipping." % base)
# Fetch/Set the branch name
branch_prefix = os.getenv(
'PULL_REQUEST_BRANCH',
'create-pull-request/patch')
# Fetch an optional base branch override
base_override = os.environ.get('PULL_REQUEST_BASE')
# Set the base branch
if base_override is not None:
base = base_override
checkout_branch(repo.git, True, base)
elif github_ref.startswith('refs/pull/'):
# Switch to the merging branch instead of the merge commit
base = os.environ['GITHUB_HEAD_REF']
repo.git.checkout(base)
else:
base = github_ref[11:]
# Skip if the current branch is a PR branch created by this action.
# This may occur when using a PAT instead of GITHUB_TOKEN.
if base.startswith(branch_prefix):
print("Branch '%s' was created by this action. Skipping." % base)
sys.exit()
# Fetch an optional environment variable to determine the branch suffix
branch_suffix = os.getenv('BRANCH_SUFFIX', 'short-commit-hash')
if branch_suffix == "short-commit-hash":
# Suffix with the short SHA1 hash
branch = "%s-%s" % (branch_prefix, get_head_short_sha1(repo))
elif branch_suffix == "timestamp":
# Suffix with the current timestamp
branch = "%s-%s" % (branch_prefix, int(time.time()))
elif branch_suffix == "random":
# Suffix with the current timestamp
branch = "%s-%s" % (branch_prefix, get_random_suffix())
elif branch_suffix == "none":
# Fixed branch name
branch = branch_prefix
else:
print(
"Branch suffix '%s' is not a valid value." %
branch_suffix)
sys.exit(1)
# Check if the remote branch exists
remote_exists = remote_branch_exists(repo, branch)
if remote_exists:
if branch_suffix == 'short-commit-hash':
# A remote branch already exists for the HEAD commit
print(
"Pull request branch '%s' already exists for this commit. Skipping." %
branch)
sys.exit()
elif branch_suffix in ['timestamp', 'random']:
# Generated branch name clash with an existing branch
print(
"Pull request branch '%s' already exists. Please re-run." %
branch)
sys.exit(1)
# Fetch an optional environment variable to determine the branch suffix
branch_suffix = os.getenv('BRANCH_SUFFIX', 'short-commit-hash')
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())
# Checkout branch
checkout_branch(repo.git, remote_exists, branch)
# 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 HEAD committer's email and name
author_email, author_name = get_head_author(event_name, event_data)
# 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:
print("Repository has no modified or untracked files. Skipping.")
# 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(
github_token,
github_repository,
repo,
branch,
base)
else:
print("Repository has no modified or untracked files. Skipping.")

219
examples.md Normal file
View File

@@ -0,0 +1,219 @@
# Examples
- [Use case: Create a pull request to update X periodically](#use-case-create-a-pull-request-to-update-x-periodically)
- [Update NPM dependencies](#update-npm-dependencies)
- [Keep Go up to date](#keep-go-up-to-date)
- [Spider and download a website](#spider-and-download-a-website)
- [Use case: Create a pull request to modify/fix pull requests](#use-case-create-a-pull-request-to-modifyfix-pull-requests)
- [autopep8](#autopep8)
- [Misc workflow tips](#misc-workflow-tips)
- [Filtering push events](#filtering-push-events)
- [Dynamic configuration using variables](#dynamic-configuration-using-variables)
## Use case: Create a pull request to update X periodically
This pattern will work well for updating any kind of static content from an external source. The workflow executes on a schedule and raises a pull request when there are changes.
### Update NPM dependencies
```yml
name: Update Dependencies
on:
schedule:
- cron: '0 10 * * 1'
jobs:
update-deps:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: actions/setup-node@v1
with:
node-version: '10.x'
- name: Update dependencies
id: vars
run: |
npm install -g npm-check-updates
ncu -u
npm install
- name: Create Pull Request
uses: peter-evans/create-pull-request@v1.6.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMMIT_MESSAGE: update dependencies
PULL_REQUEST_TITLE: Automated Dependency Updates
PULL_REQUEST_BODY: This is an auto-generated PR with dependency updates.
PULL_REQUEST_BRANCH: dep-updates
BRANCH_SUFFIX: none
```
### Keep Go up to date
Keep Go up to date with [ensure-latest-go](https://github.com/jmhodges/ensure-latest-go) action.
```yml
name: Keeping Go up to date
on:
schedule:
- cron: 47 4 * * *
push:
branches:
- master
jobs:
fresh_go:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
with:
ref: master
- uses: jmhodges/ensure-latest-go@v1.0.2
id: ensure_go
- run: echo "##[set-output name=pr_title;]update to latest Go release ${{ steps.ensure_go.outputs.go_version}}"
id: pr_title_maker
- name: Create pull request
uses: peter-evans/create-pull-request@v1.6.0
env:
PULL_REQUEST_TITLE: ${{ steps.pr_title_maker.outputs.pr_title }}
PULL_REQUEST_BODY: Auto-generated pull request created by the GitHub Actions [create-pull-request](https://github.com/peter-evans/create-pull-request) and [ensure-latest-go](https://github.com/jmhodges/ensure-latest-go).
COMMIT_MESSAGE: ${{ steps.pr_title_maker.outputs.pr_title }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_SUFFIX: none
PULL_REQUEST_BRANCH: ensure-latest-go/patch-${{ steps.ensure_go.outputs.go_version }}
```
### Spider and download a website
```yml
name: Download Website
on:
schedule:
- cron: '0 10 * * *'
jobs:
format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Download website
run: |
wget \
--recursive \
--level=2 \
--wait=1 \
--no-clobber \
--page-requisites \
--html-extension \
--convert-links \
--domains quotes.toscrape.com \
http://quotes.toscrape.com/
- name: Create Pull Request
uses: peter-evans/create-pull-request@v1.6.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMMIT_MESSAGE: update local website copy
PULL_REQUEST_TITLE: Automated Updates to Local Website Copy
PULL_REQUEST_BODY: This is an auto-generated PR with website updates.
PULL_REQUEST_BRANCH: website-updates
BRANCH_SUFFIX: none
```
## Use case: Create a pull request to modify/fix pull requests
This is a pattern that works well for any automated code linting and fixing. A pull request can be created to fix or modify something during an `on: pull_request` workflow. The pull request containing the fix will be raised with the original pull request as the base. This can be then be merged to update the original pull request and pass any required tests.
### autopep8
The following is an example workflow for a use case where [autopep8 action](https://github.com/peter-evans/autopep8) runs as both a check on pull requests and raises a further pull request to apply code fixes.
How it works:
1. When a pull request is raised the workflow executes as a check
2. If autopep8 makes any fixes a pull request will be raised for those fixes to be merged into the current pull request branch. The workflow then deliberately causes the check to fail.
3. When the pull request containing the fixes is merged the workflow runs again. This time autopep8 makes no changes and the check passes.
4. The original pull request can now be merged.
```yml
name: autopep8
on: pull_request
jobs:
autopep8:
if: startsWith(github.head_ref, 'autopep8-patches') == false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: autopep8
id: autopep8
uses: peter-evans/autopep8@v1.1.0
with:
args: --exit-code --recursive --in-place --aggressive --aggressive .
- name: Set autopep8 branch name
id: vars
run: echo ::set-output name=branch-name::"autopep8-patches/$GITHUB_HEAD_REF"
- name: Create Pull Request
if: steps.autopep8.outputs.exit-code == 2
uses: peter-evans/create-pull-request@v1.6.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMMIT_MESSAGE: autopep8 action fixes
PULL_REQUEST_TITLE: Fixes by autopep8 action
PULL_REQUEST_BODY: This is an auto-generated PR with fixes by autopep8.
PULL_REQUEST_LABELS: autopep8, automated pr
PULL_REQUEST_BRANCH: ${{ steps.vars.outputs.branch-name }}
BRANCH_SUFFIX: none
- name: Fail if autopep8 made changes
if: steps.autopep8.outputs.exit-code == 2
run: exit 1
```
## Misc workflow tips
### Filtering push events
For workflows using `on: push` you may want to ignore push events for tags and remotes.
These can be filtered out with the following `if` condition.
```yml
name: Create Pull Request
on: push
jobs:
createPullRequest:
if: startsWith(github.ref, 'refs/heads/')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
...
```
### 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`](https://help.github.com/en/github/automating-your-workflow-with-github-actions/development-tools-for-github-actions#set-an-output-parameter-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.6.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.6.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 KiB

View File

@@ -1,2 +1,2 @@
GitPython==3.0.2
PyGithub==1.43.8
GitPython==3.0.4
PyGithub==1.44