This is an automated email from the ASF dual-hosted git repository.
zrhoffman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git
The following commit(s) were added to refs/heads/master by this push:
new 0bc433d5ec Replace instances of hard-coded repo name with environment
variable in GitHub actions (#7818)
0bc433d5ec is described below
commit 0bc433d5ec9ae8363917494171ced4b49e150a7b
Author: ocket8888 <[email protected]>
AuthorDate: Tue Sep 26 19:35:11 2023 -0600
Replace instances of hard-coded repo name with environment variable in
GitHub actions (#7818)
Replace instances of hard-coded repo name with environment variable
---
.../assign_triage_role/constants.py | 6 +-
.../templates/apache_license.yml | 4 +-
.../assign_triage_role/templates/pr_template.md | 8 +-
.../assign_triage_role/triage_role_assigner.py | 134 +++++++++++++++------
.github/actions/assign-triage-role/setup.cfg | 2 +-
.../trafficserver-alpine/docker-compose.yml | 2 +-
.github/workflows/assign-triage-role.yml | 4 +-
.../workflows/container-trafficserver-alpine.yml | 2 +-
8 files changed, 109 insertions(+), 53 deletions(-)
diff --git a/.github/actions/assign-triage-role/assign_triage_role/constants.py
b/.github/actions/assign-triage-role/assign_triage_role/constants.py
index 238237dfe9..fc22683c96 100644
--- a/.github/actions/assign-triage-role/assign_triage_role/constants.py
+++ b/.github/actions/assign-triage-role/assign_triage_role/constants.py
@@ -14,11 +14,12 @@ Assign Triage Role
# limitations under the License.
#
import os
-from typing import Final, Optional
+from typing import Final
ENV_GIT_AUTHOR_NAME: Final[str] = "GIT_AUTHOR_NAME"
ENV_GITHUB_REPOSITORY: Final[str] = "GITHUB_REPOSITORY"
ENV_GITHUB_REPOSITORY_OWNER: Final[str] = "GITHUB_REPOSITORY_OWNER"
+ENV_GITHUB_SERVER_URL: Final[str] = "GITHUB_SERVER_URL"
ENV_GITHUB_TOKEN: Final[str] = "GITHUB_TOKEN"
ENV_PR_GITHUB_TOKEN: Final[str] = "PR_GITHUB_TOKEN"
ENV_GITHUB_REF_NAME: Final[str] = "GITHUB_REF_NAME"
@@ -42,7 +43,7 @@ def getenv(env_name: str) -> str:
"""
Gets environment variable :param env_name:
"""
- env_var: Optional[str, None] = os.environ.get(env_name)
+ env_var = os.environ.get(env_name)
if env_var is None:
raise NameError(f"Environment variable {env_name} is not
defined")
return env_var
@@ -51,6 +52,7 @@ def getenv(env_name: str) -> str:
GIT_AUTHOR_NAME: Final[str] = getenv(ENV_GIT_AUTHOR_NAME)
GITHUB_REPOSITORY: Final[str] = getenv(ENV_GITHUB_REPOSITORY)
GITHUB_REPOSITORY_OWNER: Final[str] = getenv(ENV_GITHUB_REPOSITORY_OWNER)
+GITHUB_SERVER_URL: Final[str] = getenv(ENV_GITHUB_SERVER_URL)
GITHUB_TOKEN: Final[str] = getenv(ENV_GITHUB_TOKEN)
PR_GITHUB_TOKEN: Final[str] = getenv(ENV_PR_GITHUB_TOKEN)
GITHUB_REF_NAME: Final[str] = getenv(ENV_GITHUB_REF_NAME)
diff --git
a/.github/actions/assign-triage-role/assign_triage_role/templates/apache_license.yml
b/.github/actions/assign-triage-role/assign_triage_role/templates/apache_license.yml
index 113599659c..d4a9f4f68d 100644
---
a/.github/actions/assign-triage-role/assign_triage_role/templates/apache_license.yml
+++
b/.github/actions/assign-triage-role/assign_triage_role/templates/apache_license.yml
@@ -18,8 +18,8 @@
# {DESCRIPTION}
# Collaborators are contributors, other than committers, who have had
{ISSUE_THRESHOLD} or more Issue-closing Pull Requests merged
# in the past {SINCE_DAYS_AGO} days. If you want to be an Apache Traffic
Control collaborator:
-# 1. Read our contribution guidelines at
https://github.com/apache/trafficcontrol/blob/master/CONTRIBUTING.md
-# 2. Find an Issue to work on:
https://github.com/apache/trafficcontrol/issues?q=is:issue+is:open+label:"good+first+issue"+no:assignee
+# 1. Read our contribution guidelines at {REPO_URL}/blob/master/CONTRIBUTING.md
+# 2. Find an Issue to work on:
{REPO_URL}/issues?q=is:issue+is:open+label:"good+first+issue"+no:assignee
# 3. Get coding! For questions on how to contribute, you can reach the ATC
community on
# - The #traffic-control channel of the ASF Slack (invite link:
https://s.apache.org/tc-slack-request)
# - The ATC Development mailing list:
https://trafficcontrol.apache.org/mailing_lists
diff --git
a/.github/actions/assign-triage-role/assign_triage_role/templates/pr_template.md
b/.github/actions/assign-triage-role/assign_triage_role/templates/pr_template.md
index d53378b773..c4974f0f1e 100644
---
a/.github/actions/assign-triage-role/assign_triage_role/templates/pr_template.md
+++
b/.github/actions/assign-triage-role/assign_triage_role/templates/pr_template.md
@@ -10,18 +10,18 @@ This PR uses
[`.asf.yaml`](https://s.apache.org/asfyamltriage) to assign the Git
<hr/>
{EXPIRE} If you want to be an Apache Traffic Control collaborator next month:
-1. Read our [contribution
guidelines](https://github.com/apache/trafficcontrol/blob/master/CONTRIBUTING.md)
-2. Find an Issue to work on (recommended issues have the [good first
issue](https://github.com/apache/trafficcontrol/issues?q=is:issue+is:open+label:"good+first+issue"+no:assignee)
label) and ask to be assigned
+1. Read our [contribution guidelines]({REPO_URL}/blob/master/CONTRIBUTING.md)
+2. Find an Issue to work on (recommended issues have the [good first
issue]({REPO_URL}/issues?q=is:issue+is:open+label:"good+first+issue"+no:assignee)
label) and ask to be assigned
3. Get coding! For questions on how to contribute, you can reach the ATC
community on
- The `#traffic-control` channel of the ASF Slack ([invite
link](https://s.apache.org/tc-slack-request))
- The ATC Dev [mailing
list](https://trafficcontrol.apache.org/mailing_lists)
([archives](https://lists.apache.org/[email protected]:lte=5y:))
<hr/>
## Which Traffic Control components are affected by this PR?
-- Other:
[`.asf.yaml`](https://github.com/apache/trafficcontrol/blob/master/.asf.yaml)
+- Other: [`.asf.yaml`]({REPO_URL}/blob/master/.asf.yaml)
## What is the best way to verify this PR?
-Verify that the fixed Issues listed above are linked to [PRs from the past
{SINCE_DAYS_AGO}
days](https://github.com/apache/trafficcontrol/pulls?q=is:pr+linked:issue+merged:{SINCE_DAY}..{TODAY})
+Verify that the fixed Issues listed above are linked to [PRs from the past
{SINCE_DAYS_AGO}
days]({REPO_URL}/pulls?q=is:pr+linked:issue+merged:{SINCE_DAY}..{TODAY})
## PR submission checklist
- [ ] This PR has tests
diff --git
a/.github/actions/assign-triage-role/assign_triage_role/triage_role_assigner.py
b/.github/actions/assign-triage-role/assign_triage_role/triage_role_assigner.py
index 4a5dbac241..0254aa33d0 100644
---
a/.github/actions/assign-triage-role/assign_triage_role/triage_role_assigner.py
+++
b/.github/actions/assign-triage-role/assign_triage_role/triage_role_assigner.py
@@ -18,13 +18,12 @@ import re
import sys
from datetime import date, timedelta
from http.client import NOT_FOUND
-from typing import Optional, Final
+from typing import Any, Hashable, NotRequired, Optional, Final, TypedDict
from xml.dom import minidom
-from xml.dom.minidom import Node, Element
-
+from xml.dom.minidom import Node
import yaml
+
from github.Commit import Commit
-from github.ContentFile import ContentFile
from github.GithubException import GithubException, UnknownObjectException
from github.InputGitAuthor import InputGitAuthor
from github.Issue import Issue
@@ -32,11 +31,37 @@ from github.MainClass import Github
from github.NamedUser import NamedUser
from github.Repository import Repository
-from assign_triage_role.constants import
(GH_TIMELINE_EVENT_TYPE_CROSS_REFERENCE, ASF_YAML_FILE,
- APACHE_LICENSE_YAML, GIT_AUTHOR_EMAIL_TEMPLATE, SINGLE_PR_TEMPLATE_FILE,
- SINGLE_CONTRIBUTOR_TEMPLATE_FILE, PR_TEMPLATE_FILE,
EMPTY_CONTRIB_LIST_LIST,
- EMPTY_LIST_OF_CONTRIBUTORS, CONGRATS, EXPIRE, GITHUB_REPOSITORY,
GIT_AUTHOR_NAME,
- GITHUB_REPOSITORY_OWNER, MINIMUM_COMMITS, SINCE_DAYS_AGO,
GITHUB_REF_NAME, PR_GITHUB_TOKEN)
+from assign_triage_role.constants import (
+ GH_TIMELINE_EVENT_TYPE_CROSS_REFERENCE,
+ ASF_YAML_FILE,
+ APACHE_LICENSE_YAML,
+ GIT_AUTHOR_EMAIL_TEMPLATE,
+ GITHUB_SERVER_URL,
+ SINGLE_PR_TEMPLATE_FILE,
+ SINGLE_CONTRIBUTOR_TEMPLATE_FILE,
+ PR_TEMPLATE_FILE,
+ EMPTY_CONTRIB_LIST_LIST,
+ EMPTY_LIST_OF_CONTRIBUTORS,
+ CONGRATS,
+ EXPIRE,
+ GITHUB_REPOSITORY,
+ GIT_AUTHOR_NAME,
+ GITHUB_REPOSITORY_OWNER,
+ MINIMUM_COMMITS,
+ SINCE_DAYS_AGO,
+ GITHUB_REF_NAME,
+ PR_GITHUB_TOKEN
+)
+
+class UpdateFileArgs(TypedDict):
+ path: str
+ message: str
+ content: str
+ sha: str
+ branch: str
+
+ author: NotRequired[InputGitAuthor]
+ committer: NotRequired[InputGitAuthor]
class TriageRoleAssigner(Github):
@@ -50,7 +75,7 @@ class TriageRoleAssigner(Github):
target_branch_name: str
owner: str
- def __init__(self, *args, **kwargs) -> None:
+ def __init__( self, *args: Any, **kwargs: Any) -> None:
super().__init__(*args, **kwargs)
repo_name = GITHUB_REPOSITORY
self.repo = self.get_repo(repo_name)
@@ -74,8 +99,7 @@ class TriageRoleAssigner(Github):
"""
return {user.login for user in self.repo.get_collaborators() if
user.permissions.push}
- def prs_by_contributor(self, committers: set[str]) -> dict[
- NamedUser, list[(Issue, Issue)]]:
+ def prs_by_contributor(self, committers: set[str]) -> dict[NamedUser,
list[tuple[Issue, Issue]]]:
"""
Returns a dict of Pull Requests, associated by committer,
within the last
:var self.since_day: days of :var self.today:.
@@ -86,7 +110,7 @@ class TriageRoleAssigner(Github):
query = (f"repo:{repo_name} is:issue linked:pr is:closed
closed:"
f"{self.since_day()}..{self.today}")
linked_issues = self.search_issues(query=query)
- prs_by_contributor: dict[NamedUser, list[(Issue, Issue)]] = {}
+ prs_by_contributor: dict[NamedUser, list[tuple[Issue, Issue]]]
= {}
for linked_issue in linked_issues:
timeline = linked_issue.get_timeline()
pull_request: Optional[Issue] = None
@@ -95,14 +119,14 @@ class TriageRoleAssigner(Github):
continue
if event.event !=
GH_TIMELINE_EVENT_TYPE_CROSS_REFERENCE:
continue
- pr_text: dict[str] =
event.raw_data["source"]["issue"]
+ pr_text: dict[str, Any] =
event.raw_data["source"]["issue"]
if "pull_request" not in pr_text:
continue
pull_request =
Issue(self.repo.__getattribute__("_requester"), event.raw_headers,
pr_text, completed=True)
# Do not break, in case the Issue has ever been linked
to more than 1 PR in the past
if pull_request is None:
- raise Exception(
+ raise LookupError(
f"Unable to find a linked Pull Request
for Issue {self.repo.full_name}#{linked_issue.number}")
# Skip unmerged PRs
if "merged_at" not in
pull_request.pull_request.raw_data:
@@ -116,7 +140,7 @@ class TriageRoleAssigner(Github):
return prs_by_contributor
def ones_who_meet_threshold(self, prs_by_contributor: dict[NamedUser,
- list[(Issue, Issue)]]) -> dict[str, list[(Issue, Issue)]]:
+ list[tuple[Issue, Issue]]]) -> dict[str, list[tuple[Issue, Issue]]]:
"""
Returns a dict of contributors who had at least
self.minimum_commits Issue-closing Pull
Requests merged in the past self.since_days_ago days
@@ -135,8 +159,12 @@ class TriageRoleAssigner(Github):
if len(pull_requests) >= self.minimum_commits
}
- def set_collaborators_in_asf_yaml(self, prs_by_contributor: dict[str,
list[(Issue, Issue)]],
- description: str) -> None:
+ def set_collaborators_in_asf_yaml(
+ self,
+ prs_by_contributor: dict[str, list[tuple[Issue, Issue]]],
+ description: str,
+ repo_url: str
+ ) -> None:
"""
Writes the list of collaborators to .asf.yaml
"""
@@ -144,15 +172,24 @@ class TriageRoleAssigner(Github):
with open(ASF_YAML_FILE, encoding="utf-8") as stream:
github_key: Final[str] = "github"
collaborators_key: Final[str] = "collaborators"
- asf_yaml: dict[str, dict] = yaml.safe_load(stream)
+ asf_yaml: dict[str, dict[Hashable, Any]] =
yaml.safe_load(stream)
if github_key not in asf_yaml:
- asf_yaml[github_key]: dict[str, dict]() = {}
+ asf_yaml[github_key] = {}
asf_yaml[github_key][collaborators_key] = collaborators
- with open(os.path.join(os.path.dirname(__file__),
APACHE_LICENSE_YAML),
- encoding="utf-8") as stream:
- apache_license =
stream.read().format(DESCRIPTION=description,
- ISSUE_THRESHOLD=self.minimum_commits,
SINCE_DAYS_AGO=self.since_days_ago)
+ with open(
+ os.path.join(
+ os.path.dirname(__file__),
+ APACHE_LICENSE_YAML
+ ),
+ encoding="utf-8"
+ ) as stream:
+ apache_license = stream.read().format(
+ DESCRIPTION=description,
+ ISSUE_THRESHOLD=self.minimum_commits,
+ SINCE_DAYS_AGO=self.since_days_ago,
+ REPO_URL=repo_url
+ )
with open(ASF_YAML_FILE, "w", encoding="utf-8") as stream:
stream.write(apache_license)
@@ -171,8 +208,10 @@ class TriageRoleAssigner(Github):
with open(ASF_YAML_FILE, encoding="utf-8") as stream:
asf_yaml = stream.read()
- asf_yaml_contentfile: ContentFile =
self.repo.get_contents(ASF_YAML_FILE, source_branch_ref)
- kwargs = {"path": ASF_YAML_FILE,
+ asf_yaml_contentfile = self.repo.get_contents(ASF_YAML_FILE,
source_branch_ref)
+ if isinstance(asf_yaml_contentfile, list):
+ asf_yaml_contentfile = asf_yaml_contentfile[0]
+ kwargs: UpdateFileArgs = {"path": ASF_YAML_FILE,
"message": commit_message,
"content": asf_yaml,
"sha": asf_yaml_contentfile.sha,
@@ -186,7 +225,9 @@ class TriageRoleAssigner(Github):
except KeyError:
print("Committing using the default author")
- commit: Commit = self.repo.update_file(**kwargs).get("commit")
+ commit = self.repo.update_file(**kwargs).get("commit")
+ if not isinstance(commit, Commit):
+ raise TypeError(f"expected a commit, but got:
{type(commit)}")
print(f"Updated {ASF_YAML_FILE} on {self.repo.name} branch
{source_branch_name}")
return commit
@@ -194,8 +235,10 @@ class TriageRoleAssigner(Github):
"""
Uses the GitHub API to get the contents of .asf.yaml
"""
- return self.repo.get_contents(ASF_YAML_FILE,
-
f"refs/heads/{branch}").decoded_content.rstrip().decode()
+ asf_file = self.repo.get_contents(ASF_YAML_FILE,
f"refs/heads/{branch}")
+ if isinstance(asf_file, list):
+ asf_file = asf_file[0]
+ return asf_file.decoded_content.rstrip().decode()
def branch_exists(self, branch: str) -> bool:
"""
@@ -210,7 +253,7 @@ class TriageRoleAssigner(Github):
return False
@staticmethod
- def list_of_contributors(prs_by_contributor: dict[str, list[(Issue,
Issue)]],
+ def list_of_contributors(prs_by_contributor: dict[str,
list[tuple[Issue, Issue]]],
today: date) -> tuple[str, str, str]:
"""
Returns a list of contributors in a tuple, along with :var
congrats: and :var expire:,
@@ -237,11 +280,13 @@ class TriageRoleAssigner(Github):
"""
Removes comments from the Pull Request body
"""
- body: Element =
minidom.parseString(f"<body>{pr_body}</body>").firstChild
+ body = minidom.parseString(f"<body>{pr_body}</body>").firstChild
+ if body is None:
+ raise ValueError("failed to parse PR body")
return "".join(node.toxml()
for node in body.childNodes if node.nodeType !=
Node.COMMENT_NODE)
- def get_pr_body(self, prs_by_contributor: dict[str, list[(Issue,
Issue)]]) -> str:
+ def get_pr_body(self, prs_by_contributor: dict[str, list[tuple[Issue,
Issue]]]) -> str:
"""
Renders the Pull Request template
"""
@@ -255,7 +300,7 @@ class TriageRoleAssigner(Github):
encoding="utf-8") as stream:
pr_template = stream.read()
- def contrib_list(contributor: str, pr_tuples: list[(Issue,
Issue)]) -> str:
+ def contrib_list(contributor: str, pr_tuples: list[tuple[Issue,
Issue]]) -> str:
pr_list = "\n".join(
pr_line_template.format(ISSUE_NUMBER=linked_issue.number, PR_NUMBER=pr.number
) for pr, linked_issue in pr_tuples)
@@ -270,11 +315,19 @@ class TriageRoleAssigner(Github):
list_of_contributors, congrats, expire =
self.list_of_contributors(prs_by_contributor,
self.today)
- pr_body =
pr_template.format(CONTRIB_LIST_LIST=contrib_list_list,
- MONTH=self.today.strftime("%B"), CONGRATS=congrats,
- LIST_OF_CONTRIBUTORS=list_of_contributors,
EXPIRE=expire,
- ISSUE_THRESHOLD=self.minimum_commits,
SINCE_DAYS_AGO=self.since_days_ago,
- SINCE_DAY=self.since_day(), TODAY=self.today)
+ repo_url = "/".join((GITHUB_SERVER_URL, GITHUB_REPOSITORY))
+ pr_body = pr_template.format(
+ CONTRIB_LIST_LIST=contrib_list_list,
+ MONTH=self.today.strftime("%B"),
+ CONGRATS=congrats,
+ LIST_OF_CONTRIBUTORS=list_of_contributors,
+ EXPIRE=expire,
+ ISSUE_THRESHOLD=self.minimum_commits,
+ SINCE_DAYS_AGO=self.since_days_ago,
+ SINCE_DAY=self.since_day(),
+ TODAY=self.today,
+ REPO_URL=repo_url
+ )
# If on a fork, do not ping users or reference Issues or Pull
Requests
if self.repo.parent is not None:
pr_body = re.sub(r"@(?!trafficcontrol)([A-Za-z0-9]+)",
r"@\1", pr_body)
@@ -283,7 +336,7 @@ class TriageRoleAssigner(Github):
print("Templated PR body")
return pr_body
- def create_pr(self, prs_by_contributor: dict[str, list[(Issue,
Issue)]], commit_message: str,
+ def create_pr(self, prs_by_contributor: dict[str, list[tuple[Issue,
Issue]]], commit_message: str,
source_branch_name: str) -> None:
"""
Submits a Pull Request
@@ -321,7 +374,8 @@ class TriageRoleAssigner(Github):
committers = self.get_committers()
prs_by_contributor =
self.ones_who_meet_threshold(self.prs_by_contributor(committers))
description = f"ATC Collaborators for {self.today.strftime('%B
%Y')}"
- self.set_collaborators_in_asf_yaml(prs_by_contributor,
description)
+ repo_url = "/".join((GITHUB_SERVER_URL, GITHUB_REPOSITORY))
+ self.set_collaborators_in_asf_yaml(prs_by_contributor,
description, repo_url)
source_branch_name: Final[str] =
f"collaborators-{self.today.strftime('%Y-%m')}"
commit_message = description
diff --git a/.github/actions/assign-triage-role/setup.cfg
b/.github/actions/assign-triage-role/setup.cfg
index 16ef60c00c..1766a66e60 100644
--- a/.github/actions/assign-triage-role/setup.cfg
+++ b/.github/actions/assign-triage-role/setup.cfg
@@ -21,7 +21,7 @@ author_email = [email protected]
classifiers = OSI Approved :: Apache Software License
[options]
-python_requires = >=3.10
+python_requires = >=3.11
packages = assign_triage_role
install_requires =
PyGithub
diff --git a/.github/containers/trafficserver-alpine/docker-compose.yml
b/.github/containers/trafficserver-alpine/docker-compose.yml
index 68cd428377..df0ac1f441 100644
--- a/.github/containers/trafficserver-alpine/docker-compose.yml
+++ b/.github/containers/trafficserver-alpine/docker-compose.yml
@@ -42,4 +42,4 @@ services:
- linux/amd64
- linux/arm64
# for example, ghcr.io/apache/trafficcontrol/ci/trafficserver-alpine:9.1.2
- image:
${CONTAINER:-ghcr.io/apache/trafficcontrol/ci/trafficserver-alpine}:${ATS_VERSION}
+ image:
${CONTAINER:-ghcr.io/${GITHUB_REPOSITORY}/ci/trafficserver-alpine}:${ATS_VERSION}
diff --git a/.github/workflows/assign-triage-role.yml
b/.github/workflows/assign-triage-role.yml
index 2842887078..2198b55cff 100644
--- a/.github/workflows/assign-triage-role.yml
+++ b/.github/workflows/assign-triage-role.yml
@@ -45,10 +45,10 @@ jobs:
uses: actions/checkout@master
if: ${{ (github.repository_owner == 'apache' && github.ref ==
'refs/heads/master' ) || github.event_name != 'schedule' }}
id: checkout
- - name: Install Python 3.10
+ - name: Install Python 3.11
uses: actions/setup-python@v2
if: ${{ steps.checkout.outcome == 'success' }}
- with: { python-version: '3.10' } # Must be quoted to include the
trailing 0
+ with: { python-version: '3.11' } # Must be quoted to include the
trailing 0s of versions that have them
- name: Install assign_triage_role Python module and dependencies
if: ${{ steps.checkout.outcome == 'success' }}
run: pip install .github/actions/assign-triage-role
diff --git a/.github/workflows/container-trafficserver-alpine.yml
b/.github/workflows/container-trafficserver-alpine.yml
index 7a1da09030..d59afc24d3 100644
--- a/.github/workflows/container-trafficserver-alpine.yml
+++ b/.github/workflows/container-trafficserver-alpine.yml
@@ -15,7 +15,7 @@
# specific language governing permissions and limitations
# under the License.
-name: Container ghcr.io/apache/trafficcontrol/ci/trafficserver-alpine
+name: Container ghcr.io/${{ github.repository }}/ci/trafficserver-alpine
env:
CONTAINER: ghcr.io/${{ github.repository }}/ci/trafficserver-alpine