From 8143b459ffd7dc963a9eaaa6dad3314f4c996d64 Mon Sep 17 00:00:00 2001 From: Roger Chapman Date: Sun, 22 Sep 2019 21:36:05 +1000 Subject: [PATCH] Build V8 as part of CI (#11) --- .github/scripts/create-pull-request.py | 154 +++++++++++++++++++++++++ .github/scripts/requirements.txt | 2 + .github/workflows/v8build.yml | 33 ++++++ 3 files changed, 189 insertions(+) create mode 100755 .github/scripts/create-pull-request.py create mode 100644 .github/scripts/requirements.txt create mode 100644 .github/workflows/v8build.yml diff --git a/.github/scripts/create-pull-request.py b/.github/scripts/create-pull-request.py new file mode 100755 index 000000000..466741293 --- /dev/null +++ b/.github/scripts/create-pull-request.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python3 +''' Create Pull Request ''' +import json +import os +import time +from git import Repo +from github import Github + + +def get_github_event(github_event_path): + with open(github_event_path) as f: + github_event = json.load(f) + if os.environ.get('DEBUG_EVENT') is not None: + print(os.environ['GITHUB_EVENT_NAME']) + print(json.dumps(github_event, sort_keys=True, indent=2)) + 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 pr_branch_exists(repo, branch): + for ref in repo.remotes.origin.refs: + if ref.name == ("origin/%s" % branch): + return True + return False + + +def get_head_author(event_name, event_data): + if event_name == "push": + 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 + + +def get_head_short_sha1(repo): + return repo.git.rev_parse('--short', 'HEAD') + + +def set_git_config(git, email, name): + git.config('--global', 'user.email', '"%s"' % email) + git.config('--global', 'user.name', '"%s"' % 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)) + + +def commit_changes(git, branch, commit_message): + git.checkout('HEAD', b=branch) + git.add('-A') + git.commit(m=commit_message) + return git.push('--set-upstream', 'origin', branch) + + +def create_pull_request(token, repo, head, base, title, body): + return Github(token).get_repo(repo).create_pull( + title=title, + body=body, + base=base, + head=head) + + +def process_event(event_name, event_data, repo, branch, base): + # Fetch required environment variables + github_token = os.environ['GITHUB_TOKEN'] + github_repository = os.environ['GITHUB_REPOSITORY'] + # Fetch remaining optional environment variables + commit_message = os.getenv( + 'COMMIT_MESSAGE', + "Auto-committed changes by create-pull-request action") + title = os.getenv( + 'PULL_REQUEST_TITLE', + "Auto-generated by create-pull-request action") + body = os.getenv( + 'PULL_REQUEST_BODY', "Auto-generated pull request by " + "[create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub Action") + + # 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) + # Update URL for the 'origin' remote + set_git_remote_url(repo.git, github_token, github_repository) + + # Commit the repository changes + print("Committing changes.") + commit_result = commit_changes(repo.git, branch, commit_message) + print(commit_result) + + # Create the pull request + print("Creating a request to pull %s into %s." % (branch, base)) + pull_request = create_pull_request( + github_token, + github_repository, + branch, + base, + title, + body + ) + print("Created pull request %d." % pull_request.number) + + +# Get the JSON event data +event_name = os.environ['GITHUB_EVENT_NAME'] +event_data = get_github_event(os.environ['GITHUB_EVENT_PATH']) +# Check if this event should be ignored +if 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:] + + # Skip if the current branch is a PR branch created by this action + if not base.startswith(branch): + # Suffix with the short SHA1 hash + branch = "%s-%s" % (branch, int(time.time())) + + # Check if a PR branch already exists for this HEAD commit + if not pr_branch_exists(repo, 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) + else: + print("Repository has no modified or untracked files. Skipping.") + else: + print( + "Pull request branch '%s' already exists for this commit. Skipping." % + branch) + else: + print( + "Branch '%s' was created by this action. Skipping." % base) diff --git a/.github/scripts/requirements.txt b/.github/scripts/requirements.txt new file mode 100644 index 000000000..85ad43cc0 --- /dev/null +++ b/.github/scripts/requirements.txt @@ -0,0 +1,2 @@ +GitPython==3.0.2 +PyGithub==1.43.8 diff --git a/.github/workflows/v8build.yml b/.github/workflows/v8build.yml new file mode 100644 index 000000000..7e371406f --- /dev/null +++ b/.github/workflows/v8build.yml @@ -0,0 +1,33 @@ +name: V8 Build + +on: repository_dispatch + +jobs: + build: + name: Build V8 for ${{ matrix.platform }} + strategy: + matrix: + platform: [ubuntu-latest, macos-latest] + runs-on: ${{ matrix.platform }} + steps: + - name: Checkout + uses: actions/checkout@v1 + with: + submodules: true + fetch-depth: 1 + - name: Build V8 + run: cd deps && ./build.py + - name: Install Python3 setup tools + if: matrix.platform == 'ubuntu-latest' + run: sudo apt-get install python3-setuptools + - name: Create PR + run: | + pip3 install --requirement ./.github/scripts/requirements.txt + ./.github/scripts/create-pull-request.py + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PULL_REQUEST_BRANCH: v8-lib + COMMIT_MESSAGE: Update V8 static library for ${{ matrix.platform }} + PULL_REQUEST_TITLE: V8 static library for ${{ matrix.platform }} + PULL_REQUEST_BODY: Auto-generated pull request to build V8 for ${{ matrix.platform }} +