adding PR_BRANCH_FROM to support null use case

Signed-off-by: vsoch <vsochat@stanford.edu>
This commit is contained in:
vsoch
2020-03-17 10:45:52 -06:00
parent a3c90d58a7
commit d0c1b9ddb0
2 changed files with 84 additions and 32 deletions

View File

@@ -22,24 +22,69 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: pull-request-action - name: pull-request-action
uses: vsoch/pull-request-action@master uses: vsoch/pull-request-action@1.0.2
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: "update/" BRANCH_PREFIX: "update/"
PULL_REQUEST_BRANCH: "master" PULL_REQUEST_BRANCH: "master"
``` ```
Environment variables include: ## Environment Variables
- **BRANCH_PREFIX**: the prefix to filter to. If the branch doesn't start with the prefix, it will be ignored Unlike standard actions, this action just uses variables from the environment.
- **PULL_REQUEST_BRANCH**: the branch to issue the pull request to. Defaults to master.
- **PULL_REQUEST_BODY**: the body for the pull request (optional) | Name | Description | Required | Default |
- **PULL_REQUEST_TITLE**: the title for the pull request (optional) |------|-------------|----------|---------|
- **PULL_REQUEST_DRAFT**: should the pull request be a draft PR? (optional; unset defaults to `false`) | BRANCH_PREFIX | the prefix to filter to. If the branch doesn't start with the prefix, it will be ignored | false | "" |
| PULL_REQUEST_BRANCH | open pull request against this branch | false | master |
| PULL_REQUEST_FROM_BRANCH | if a branch isn't found in your GitHub payload, use this branch | false | |
| PULL_REQUEST_BODY | the body for the pull request | false | |
| PULL REQUEST_TITLE | the title for the pull request | false | |
| PULL REQUEST_DRAFT | should this be a draft PR? | false | false |
All booleans should be lowercase.
The `GITHUB_TOKEN` secret is required to interact and authenticate with the GitHub API to open The `GITHUB_TOKEN` secret is required to interact and authenticate with the GitHub API to open
the pull request. The example is [deployed here](https://github.com/vsoch/pull-request-action-example) with an example opened (and merged) [pull request here](https://github.com/vsoch/pull-request-action-example/pull/1) if needed. the pull request. The example is [deployed here](https://github.com/vsoch/pull-request-action-example) with an example opened (and merged) [pull request here](https://github.com/vsoch/pull-request-action-example/pull/1) if needed.
## Examples
Let's say that we are opening a pull request on the [publish]() event. This would mean
that the payload's branch variable would be null. We would need to define `PULL_REQUEST_FROM`. How would
we do that? We can [set environment variables](https://help.github.com/en/actions/reference/development-tools-for-github-actions#set-an-environment-variable-set-env) for next steps. Here is an example:
```yaml
name: Pull Request on Branch Push
on: [release]
jobs:
pull-request-on-release:
name: PullRequestAction
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v2
- name: Derive from branch name
run: |
# do custom parsing of your code / date to derive a branch from
PR_BRANCH_FROM=release-v$(cat VERSION)
::set-env name=PULL_REQUEST_FROM_BRANCH::${PR_BRANCH_FROM}
- name: pull-request-action
uses: vsoch/pull-request-action@1.0.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PULL_REQUEST_BRANCH: "master"
```
The above workflow is triggered on a release, so the branch will be null in the GItHub
payload. Since we want the release PR to come from a special branch, we derive it
in the second step, and then set the `PULL_REQUEST_FROM_BRANCH` variable in the environment
for the next step. In the Pull Request Action step, the pull request
will be opened from `PULL_REQUEST_FROM_BRANCH` against `PULL_REQUEST_BRANCH`, which is
master. If we do not set this variable, the job will exit in an error,
as it is not clear what action to take.
## Example use Case: Update Registry ## Example use Case: Update Registry
As an example, I created this action to be intended for an As an example, I created this action to be intended for an

View File

@@ -26,7 +26,7 @@ PULLS_URL=$REPO_URL/pulls
check_credentials() { check_credentials() {
if [[ -z "${GITHUB_TOKEN}" ]]; then if [[ -z "${GITHUB_TOKEN}" ]]; then
echo "You must include the GITHUB_TOKEN as an environment variable." printf "You must include the GITHUB_TOKEN as an environment variable.\n"
exit 1 exit 1
fi fi
@@ -35,10 +35,10 @@ check_credentials() {
check_events_json() { check_events_json() {
if [[ ! -f "${GITHUB_EVENT_PATH}" ]]; then if [[ ! -f "${GITHUB_EVENT_PATH}" ]]; then
echo "Cannot find Github events file at ${GITHUB_EVENT_PATH}"; printf "Cannot find Github events file at ${GITHUB_EVENT_PATH}\n";
exit 1; exit 1;
fi fi
echo "Found ${GITHUB_EVENT_PATH}"; printf "Found ${GITHUB_EVENT_PATH}\n";
} }
@@ -52,9 +52,9 @@ create_pull_request() {
# JSON boolean # JSON boolean
if [[ "${5}" == "true" ]]; then # if PRs are draft if [[ "${5}" == "true" ]]; then # if PRs are draft
DRAFT="true"; DRAFT="true";
else else
DRAFT="false"; DRAFT="false";
fi fi
# Check if the branch already has a pull request open # Check if the branch already has a pull request open
@@ -62,17 +62,17 @@ create_pull_request() {
DATA="{\"base\":${TARGET}, \"head\":${SOURCE}, \"body\":${BODY}}" DATA="{\"base\":${TARGET}, \"head\":${SOURCE}, \"body\":${BODY}}"
RESPONSE=$(curl -sSL -H "${AUTH_HEADER}" -H "${HEADER}" --user "${GITHUB_ACTOR}" -X GET --data "${DATA}" ${PULLS_URL}) RESPONSE=$(curl -sSL -H "${AUTH_HEADER}" -H "${HEADER}" --user "${GITHUB_ACTOR}" -X GET --data "${DATA}" ${PULLS_URL})
PR=$(echo "${RESPONSE}" | jq --raw-output '.[] | .head.ref') PR=$(echo "${RESPONSE}" | jq --raw-output '.[] | .head.ref')
echo "Response ref: ${PR}" printf "Response ref: ${PR}\n"
# Option 1: The pull request is already open # Option 1: The pull request is already open
if [[ "${PR}" == "${SOURCE}" ]]; then if [[ "${PR}" == "${SOURCE}" ]]; then
echo "Pull request from ${SOURCE} to ${TARGET} is already open!" printf "Pull request from ${SOURCE} to ${TARGET} is already open!\n"
# Option 2: Open a new pull request # Option 2: Open a new pull request
else else
# Post the pull request # Post the pull request
DATA="{\"title\":${TITLE}, \"body\":${BODY}, \"base\":${TARGET}, \"head\":${SOURCE}, \"draft\":${DRAFT}}" DATA="{\"title\":${TITLE}, \"body\":${BODY}, \"base\":${TARGET}, \"head\":${SOURCE}, \"draft\":${DRAFT}}"
echo "curl --user ${GITHUB_ACTOR} -X POST --data ${DATA} ${PULLS_URL}" printf "curl --user ${GITHUB_ACTOR} -X POST --data ${DATA} ${PULLS_URL}\n"
curl -sSL -H "${AUTH_HEADER}" -H "${HEADER}" --user "${GITHUB_ACTOR}" -X POST --data "${DATA}" ${PULLS_URL} curl -sSL -H "${AUTH_HEADER}" -H "${HEADER}" --user "${GITHUB_ACTOR}" -X POST --data "${DATA}" ${PULLS_URL}
echo $? echo $?
fi fi
@@ -88,38 +88,45 @@ main () {
# User specified branch to PR to, and check # User specified branch to PR to, and check
if [ -z "${BRANCH_PREFIX}" ]; then if [ -z "${BRANCH_PREFIX}" ]; then
echo "No branch prefix is set, all branches will be used." printf "No branch prefix is set, all branches will be used.\n"
BRANCH_PREFIX="" BRANCH_PREFIX=""
echo "Branch prefix is $BRANCH_PREFIX" printf "Branch prefix is $BRANCH_PREFIX\n"
fi fi
if [ -z "${PULL_REQUEST_BRANCH}" ]; then if [ -z "${PULL_REQUEST_BRANCH}" ]; then
PULL_REQUEST_BRANCH=master PULL_REQUEST_BRANCH=master
fi fi
echo "Pull requests will go to ${PULL_REQUEST_BRANCH}" printf "Pull requests will go to ${PULL_REQUEST_BRANCH}\n"
if [ -z "${PULL_REQUEST_DRAFT}" ]; then if [ -z "${PULL_REQUEST_DRAFT}" ]; then
echo "No explicit preference for draft PR: created PRs will be normal PRs." printf "No explicit preference for draft PR: created PRs will be normal PRs.\n"
PULL_REQUEST_DRAFT="false" PULL_REQUEST_DRAFT="false"
else else
echo "Environment variable PULL_REQUEST_DRAFT set to a value: created PRs will be draft PRs." printf "Environment variable PULL_REQUEST_DRAFT set to a value: created PRs will be draft PRs.\n"
PULL_REQUEST_DRAFT="true" PULL_REQUEST_DRAFT="true"
fi fi
# Get the name of the action that was triggered # The user is allowed to explicitly set the name of the branch
BRANCH=$(jq --raw-output .ref "${GITHUB_EVENT_PATH}"); if [ -z "${PULL_REQUEST_FROM_BRANCH}" ]; then
BRANCH=$(echo "${BRANCH/refs\/heads\//}") printf "PULL_REQUEST_FROM_BRANCH is not set, checking branch in payload.\n"
BRANCH=$(jq --raw-output .ref "${GITHUB_EVENT_PATH}");
if [[ "$BRANCH" != "null" ]]; then BRANCH=$(echo "${BRANCH/refs\/heads\//}")
echo "Found branch $BRANCH"
else else
echo "No trigger branch found in event data. Using '$BRANCH_PREFIX' as BRANCH instead." printf "PULL_REQUEST_FROM_BRANCH is set.\n"
BRANCH="$BRANCH_PREFIX" BRANCH="${PULL_REQUEST_FROM_BRANCH}"
fi
# At this point, we must have a branch
if [[ "$BRANCH" != "null" ]]; then
printf "Found branch $BRANCH to open PR from\n"
else
printf "No branch in payload, you are required to define PULL_REQUEST_FROM_BRANCH in the environment.\n"
exit 1
fi fi
# If it's to the target branch, ignore it # If it's to the target branch, ignore it
if [[ "${BRANCH}" == "${PULL_REQUEST_BRANCH}" ]]; then if [[ "${BRANCH}" == "${PULL_REQUEST_BRANCH}" ]]; then
echo "Target and current branch are identical (${BRANCH}), skipping." printf "Target and current branch are identical (${BRANCH}), skipping.\n"
else else
# If the prefix for the branch matches # If the prefix for the branch matches
@@ -133,14 +140,14 @@ main () {
echo "No pull request body is set, will use default." echo "No pull request body is set, will use default."
PULL_REQUEST_BODY="This is an automated pull request to update the container collection ${BRANCH}" PULL_REQUEST_BODY="This is an automated pull request to update the container collection ${BRANCH}"
fi fi
echo "Pull request body is ${PULL_REQUEST_BODY}" printf "Pull request body is ${PULL_REQUEST_BODY}\n"
# Pull request title (optional) # Pull request title (optional)
if [ -z "${PULL_REQUEST_TITLE}" ]; then if [ -z "${PULL_REQUEST_TITLE}" ]; then
echo "No pull request title is set, will use default." printf "No pull request title is set, will use default.\n"
PULL_REQUEST_TITLE="Update container ${BRANCH}" PULL_REQUEST_TITLE="Update container ${BRANCH}"
fi fi
echo "Pull request title is ${PULL_REQUEST_TITLE}" printf "Pull request title is ${PULL_REQUEST_TITLE}\n"
create_pull_request "${BRANCH}" "${PULL_REQUEST_BRANCH}" "${PULL_REQUEST_BODY}" "${PULL_REQUEST_TITLE}" "${PULL_REQUEST_DRAFT}" create_pull_request "${BRANCH}" "${PULL_REQUEST_BRANCH}" "${PULL_REQUEST_BODY}" "${PULL_REQUEST_TITLE}" "${PULL_REQUEST_DRAFT}"