Skip to content

Commit

Permalink
revert bundle_cron to match main. update circuitpython_bundle with ch…
Browse files Browse the repository at this point in the history
…anges from main. add test build bundle logic. remove unneeded if statement. allow RuntimeError to be raised.
  • Loading branch information
FoamyGuy committed Oct 5, 2024
1 parent 1d5fde8 commit 1b16665
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 54 deletions.
46 changes: 8 additions & 38 deletions .github/workflows/bundle_cron.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ name: Update Bundles
on:
schedule:
- cron: 0 5 * * *
workflow_dispatch:

jobs:
check-repo-owner:
Expand All @@ -20,52 +21,22 @@ jobs:
run: |
echo "This workflow will only run if Adafruit is the repository owner."
echo "Repository owner is Adafruit: $OWNER_IS_ADAFRUIT"
test-bundle-builds:
runs-on: ubuntu-latest
steps:
- name: Set up Python 3.12
uses: actions/setup-python@v4
with:
python-version: 3.12
- name: Versions
run: |
python3 --version
- uses: actions/checkout@v3
with:
submodules: true
- name: Install deps
run: |
pip install -r requirements.txt
- name: Test Building Community Bundle
run: |
git clone --recurse-submodules https://github.com/adafruit/CircuitPython_Community_Bundle.git
cd CircuitPython_Community_Bundle
circuitpython-build-bundles --filename_prefix test-community-bundle --library_location libraries --library_depth 2
- name: Test Building Adafruit Bundle
run: |
git clone --recurse-submodules https://github.com/adafruit/Adafruit_CircuitPython_Bundle.git
cd Adafruit_CircuitPython_Bundle
circuitpython-build-bundles --filename_prefix test-adafruit-bundle --library_location libraries --library_depth 2
update-bundles:
runs-on: ubuntu-latest
# Only run if test-bundle-builds succeeds
needs: test-bundle-builds
# Only run the build on Adafruit's repository. Forks won't have the secrets.
# Its necessary to do this here, since 'schedule' events cannot (currently)
# be limited (they run on all forks' default branches).
if: startswith(github.repository, 'adafruit/')
services:
redis:
image: redis
ports:
- 6379/tcp
options: --entrypoint redis-server
steps:
- name: Set up Python 3.9
- name: Set up Python 3.12
uses: actions/setup-python@v4
with:
python-version: 3.9
python-version: 3.12
- name: Load contributor cache
uses: actions/cache@v4
with:
key: "contributor-cache"
path: "contributors.json"
- name: Versions
run: |
python3 --version
Expand All @@ -80,7 +51,6 @@ jobs:
ADABOT_EMAIL: ${{ secrets.ADABOT_EMAIL }}
ADABOT_GITHUB_USER: ${{ secrets.ADABOT_GITHUB_USER }}
ADABOT_GITHUB_ACCESS_TOKEN: ${{ secrets.ADABOT_GITHUB_ACCESS_TOKEN }}
REDIS_PORT: ${{ job.services.redis.ports[6379] }}
BIGQUERY_PRIVATE_KEY: ${{ secrets.BIGQUERY_PRIVATE_KEY }}
BIGQUERY_CLIENT_EMAIL: ${{ secrets.BIGQUERY_CLIENT_EMAIL }}
run: |
Expand Down
61 changes: 45 additions & 16 deletions adabot/circuitpython_bundle.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,30 +6,28 @@
If updates are found the bundle is updated, updates are pushed to the
remote, and a new release is made.
"""

import contextlib
from datetime import date
from io import StringIO
import json
import os
import pathlib
import shlex
import subprocess

import redis as redis_py

import sh
from circuitpython_build_tools.scripts.build_bundles import build_bundles
from sh.contrib import git

from adabot import github_requests as gh_reqs
from adabot.lib import common_funcs
from adabot import circuitpython_library_download_stats as dl_stats

REDIS = None
if "GITHUB_WORKSPACE" in os.environ:
REDIS = redis_py.StrictRedis(port=os.environ["REDIS_PORT"])
else:
REDIS = redis_py.StrictRedis()

BUNDLES = ["Adafruit_CircuitPython_Bundle", "CircuitPython_Community_Bundle"]

CONTRIBUTOR_CACHE = {}


def fetch_bundle(bundle, bundle_path):
"""Clones `bundle` to `bundle_path`"""
Expand Down Expand Up @@ -380,20 +378,17 @@ def get_contributors(repo, commit_range):
return contributors
for log_line in output.split("\n"):
sha, author_email, committer_email = log_line.split(",")
author = REDIS.get("github_username:" + author_email)
committer = REDIS.get("github_username:" + committer_email)
author = CONTRIBUTOR_CACHE.get("github_username:" + author_email, None)
committer = CONTRIBUTOR_CACHE.get("github_username:" + committer_email, None)
if not author or not committer:
github_commit_info = gh_reqs.get("/repos/" + repo + "/commits/" + sha)
github_commit_info = github_commit_info.json()
if github_commit_info["author"]:
author = github_commit_info["author"]["login"]
REDIS.set("github_username:" + author_email, author)
CONTRIBUTOR_CACHE["github_username:" + author_email] = author
if github_commit_info["committer"]:
committer = github_commit_info["committer"]["login"]
REDIS.set("github_username:" + committer_email, committer)
else:
author = author.decode("utf-8")
committer = committer.decode("utf-8")
CONTRIBUTOR_CACHE["github_username:" + committer_email] = committer

if committer_email == "[email protected]":
committer = None
Expand Down Expand Up @@ -425,6 +420,26 @@ def add_contributors(master_list, additions):
master_list[contributor] += additions[contributor]


def test_bundle_build(bundle_dir):
"""
Attempts to build the bundle at the given location.
Returns exit code 0 if success.
Returns exit code >0 if failed to build.
"""
with contextlib.chdir(bundle_dir):
build_bundles(
[
"--filename_prefix",
"test-build-bundle",
"--library_location",
"libraries",
"--library_depth",
"2",
],
standalone_mode=False,
)


# pylint: disable=too-many-locals,too-many-branches,too-many-statements
def new_release(bundle, bundle_path):
"""Creates a new release for `bundle`."""
Expand Down Expand Up @@ -506,7 +521,7 @@ def new_release(bundle, bundle_path):
release_description.append(
"The libraries in each release are compiled for all recent major versions of CircuitPython."
" Please download the one that matches the major version of your CircuitPython. For example"
", if you are running 8.2.6 you should download the `8.x` bundle.\n"
", if you are running 9.1.1 you should download the `9.x` bundle.\n"
)

release_description.append(
Expand Down Expand Up @@ -554,6 +569,10 @@ def new_release(bundle, bundle_path):


if __name__ == "__main__":
contributor_cache_fn = pathlib.Path("contributors.json").resolve()
if contributor_cache_fn.exists():
CONTRIBUTOR_CACHE = json.loads(contributor_cache_fn.read_text())

bundles_dir = os.path.abspath(".bundles")
if "GITHUB_WORKSPACE" in os.environ:
git.config("--global", "user.name", "adabot")
Expand All @@ -563,10 +582,20 @@ def new_release(bundle, bundle_path):
try:
fetch_bundle(cp_bundle, bundle_dir)
updates, release_required = update_bundle(bundle_dir)

# test bundle build and stop if it does not succeed
try:
test_bundle_build(bundle_dir)
except SystemExit as e:
if e.code != 0:
raise RuntimeError("Test Build of Bundle Failed") from e
if release_required:
commit_updates(bundle_dir, updates)
push_updates(bundle_dir)
new_release(cp_bundle, bundle_dir)
except RuntimeError as e:
print("Failed to update and release:", cp_bundle)
print(e)
raise e
finally:
contributor_cache_fn.write_text(json.dumps(CONTRIBUTOR_CACHE))

0 comments on commit 1b16665

Please sign in to comment.