3 Commits

Author SHA1 Message Date
Vanessasaurus
0969c26295 Merge pull request #100 from vsoch/update-container-base
fix bug with docker build
2023-12-07 19:40:22 -07:00
vsoch
d2ea9c206b fix bug with docker build
the alpine image no longer allows installing to system python
the fix is to target a virtual environment python3.

Signed-off-by: vsoch <vsoch@users.noreply.github.com>
2023-12-07 19:35:49 -07:00
Vanessasaurus
81b48d94ab Add LICENSE 2023-09-21 12:20:03 -06:00
4 changed files with 48 additions and 62 deletions

View File

@@ -14,6 +14,7 @@ represented by the pull requests that fixed them. Critical items to know are:
Versions correspond with GitHub releases that can be referenced with @ using actions. Versions correspond with GitHub releases that can be referenced with @ using actions.
## [master](https://github.com/vsoch/pull-request-action/tree/master) (master) ## [master](https://github.com/vsoch/pull-request-action/tree/master) (master)
- alpine cannot install to system python anymore (1.1.0)
- bugfix of missing output values (1.0.23) - bugfix of missing output values (1.0.23)
- bugfix of token handling if 401 error received (missing 401 case) (1.0.21) - bugfix of token handling if 401 error received (missing 401 case) (1.0.21)
- bugfix of writing to environment file (missing newline) (1.0.19) - bugfix of writing to environment file (missing newline) (1.0.19)

View File

@@ -7,9 +7,11 @@ LABEL "com.github.actions.description"="Create a pull request when a branch is c
LABEL "com.github.actions.icon"="activity" LABEL "com.github.actions.icon"="activity"
LABEL "com.github.actions.color"="yellow" LABEL "com.github.actions.color"="yellow"
RUN apk --no-cache add python3 py3-pip git bash && \ # Newer alpine we are not allowed to install to system python
pip3 install requests RUN apk --no-cache add python3 py3-pip py3-virtualenv git bash && \
python3 -m venv /opt/env && \
/opt/env/bin/pip3 install requests
COPY pull-request.py /pull-request.py COPY pull-request.py /pull-request.py
RUN chmod u+x /pull-request.py RUN chmod u+x /pull-request.py
ENTRYPOINT ["python3", "/pull-request.py"] ENTRYPOINT ["/opt/env/bin/python3", "/pull-request.py"]

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019-2023 Vanessa Sochat
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,10 +1,9 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import json
import os
import requests
import sys import sys
import time import os
import json
import requests
################################################################################ ################################################################################
# Helper Functions # Helper Functions
@@ -36,28 +35,6 @@ def check_events_json():
return events return events
def retry(attempts=5, timeout=30):
"""
A simple retry decorator
We assume rate limiting is in minutes, so we set timeout to 30.
"""
def decorator(func):
def inner(*args, **kwargs):
attempt = 0
while attempt < attempts:
try:
return func(*args, **kwargs)
except Exception as e:
sleep = timeout * 2**attempt
print(f"Retrying in {sleep} seconds - error: {e}")
time.sleep(sleep)
attempt += 1
return func(*args, **kwargs)
return inner
return decorator
def abort_if_fail(response, reason): def abort_if_fail(response, reason):
"""If PASS_ON_ERROR, don't exit. Otherwise exit with an error and print """If PASS_ON_ERROR, don't exit. Otherwise exit with an error and print
the reason. the reason.
@@ -80,8 +57,7 @@ def abort_if_fail(response, reason):
def parse_into_list(values): def parse_into_list(values):
""" """A list of reviewers or assignees to parse from a string to a list
A list of reviewers or assignees to parse from a string to a list
Parameters: Parameters:
values (str) : a list of space separated, quoted values to parse to a list values (str) : a list of space separated, quoted values to parse to a list
@@ -94,8 +70,7 @@ def parse_into_list(values):
def set_env_and_output(name, value): def set_env_and_output(name, value):
""" """helper function to echo a key/value pair to the environement file
Helper function to echo a key/value pair to the environement file
Parameters: Parameters:
name (str) : the name of the environment variable name (str) : the name of the environment variable
@@ -109,10 +84,8 @@ def set_env_and_output(name, value):
environment_file.write("%s=%s\n" % (name, value)) environment_file.write("%s=%s\n" % (name, value))
@retry(attempts=5, timeout=60)
def open_pull_request(title, body, target, source, is_draft=False, can_modify=True): def open_pull_request(title, body, target, source, is_draft=False, can_modify=True):
""" """Open pull request opens a pull request with a given body and content,
Open pull request opens a pull request with a given body and content,
and sets output variables. An unparsed response is returned. and sets output variables. An unparsed response is returned.
Parameters: Parameters:
@@ -143,10 +116,8 @@ def open_pull_request(title, body, target, source, is_draft=False, can_modify=Tr
return response return response
@retry()
def update_pull_request(entry, title, body, target, state=None): def update_pull_request(entry, title, body, target, state=None):
""" """Given an existing pull request, update it.
Given an existing pull request, update it.
Parameters: Parameters:
entry (dict) : the pull request metadata entry (dict) : the pull request metadata
@@ -174,8 +145,7 @@ def update_pull_request(entry, title, body, target, state=None):
def set_pull_request_groups(response): def set_pull_request_groups(response):
""" """Given a response for an open or updated PR, set metadata
Given a response for an open or updated PR, set metadata
Parameters: Parameters:
response (requests.Response) : a requests response, unparsed response (requests.Response) : a requests response, unparsed
@@ -196,7 +166,6 @@ def set_pull_request_groups(response):
set_env_and_output("PULL_REQUEST_URL", html_url) set_env_and_output("PULL_REQUEST_URL", html_url)
@retry(attempts=5, timeout=30)
def list_pull_requests(target, source): def list_pull_requests(target, source):
"""Given a target and source, return a list of pull requests that match """Given a target and source, return a list of pull requests that match
(or simply exit given some kind of error code) (or simply exit given some kind of error code)
@@ -219,10 +188,8 @@ def list_pull_requests(target, source):
return response.json() return response.json()
@retry(attempts=5, timeout=30)
def add_assignees(entry, assignees): def add_assignees(entry, assignees):
""" """Given a pull request metadata (from create or update) add assignees
Given a pull request metadata (from create or update) add assignees
Parameters: Parameters:
entry (dict) : the pull request metadata entry (dict) : the pull request metadata
@@ -251,8 +218,7 @@ def add_assignees(entry, assignees):
def find_pull_request(listing, source): def find_pull_request(listing, source):
""" """Given a listing and a source, find a pull request based on the source
Given a listing and a source, find a pull request based on the source
(the branch name). (the branch name).
Parameters: Parameters:
@@ -266,11 +232,8 @@ def find_pull_request(listing, source):
return entry return entry
@retry(attempts=5, timeout=30)
def find_default_branch(): def find_default_branch():
""" """Find default branch for a repo (only called if branch not provided)"""
Find default branch for a repo (only called if branch not provided)
"""
response = requests.get(REPO_URL) response = requests.get(REPO_URL)
# Case 1: 401, 404 might need a token # Case 1: 401, 404 might need a token
@@ -284,10 +247,8 @@ def find_default_branch():
return default_branch return default_branch
@retry(attempts=5, timeout=30)
def add_reviewers(entry, reviewers, team_reviewers): def add_reviewers(entry, reviewers, team_reviewers):
""" """Given regular or team reviewers, add them to a PR.
Given regular or team reviewers, add them to a PR.
Parameters: Parameters:
entry (dict) : the pull request metadata entry (dict) : the pull request metadata
@@ -473,6 +434,7 @@ def main():
# If the prefix for the branch matches # If the prefix for the branch matches
if not branch_prefix or from_branch.startswith(branch_prefix): if not branch_prefix or from_branch.startswith(branch_prefix):
# Pull request body (optional) # Pull request body (optional)
pull_request_body = os.environ.get( pull_request_body = os.environ.get(
"PULL_REQUEST_BODY", "PULL_REQUEST_BODY",