Skip to content

fix: pin runners to ubuntu-24.04, Python 3.10 and selenium 4.1.0 - #70

Merged
Snailedlt merged 28 commits into
masterfrom
chore/trunk-based-migration
Oct 24, 2026
Merged

Snailedlt merged 28 commits into
masterfrom
chore/trunk-based-migration

Conversation

@Snailedlt

Copy link
Copy Markdown
Owner

Fixes the failing Check Icon PR and Peek Icons runs on #69.

🤖 Generated with Claude Code

Snailedlt and others added 28 commits October 24, 2026 16:28
- auto_build_merge.yml: stripped to validate + squash merge only (no build)
- build_icons.yml: emergency fallback, commits directly to master (no PR)
- version_and_release.yml: deprecated, workflow_dispatch only
- CLAUDE.md: added project guide for Claude Code

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Artifact 'pr_num' downloads to ./pr_num/pr_num.txt, not ./peek-pr-num/pr_num.txt.
This caused step 5 to fail, skipping all comment steps.

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Remove dependency on IMGUR_CLIENT_ID secret
- Upload screenshots to 'screenshots' branch under pr-{num}/ subdirectory
- Serve images via raw.githubusercontent.com (public, no auth needed)
- Rewrite comment steps using github-script (removes jungwinter/comment
  and juliangruber/read-file-action dependencies)
- Fix pr_num reading using bash instead of read-file-action
- Fix failure comment using github-script instead of literal env.MESSAGE

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
RANGE='HEAD' gives git diff nothing to compare against.
Use 'first-commit..HEAD' to cover all history on first run.
Priority order for determining range:
1. Last 'build:' prefixed commit (normal case)
2. Last vX.Y.Z release tag (first run after migration)
3. First commit in repo (truly fresh repo with no releases)
- Add 'Install Firefox' step via apt before Icomoon build
- Add 'Make geckodriver executable' step (chmod +x)
- Auto-create 'build-failed' label if it doesn't exist before creating issue
- Fix core.setFailed message (remove em dash)
Wrap get_merged_pull_reqs_since_last_release in try-except so that
if the GitHub API call fails (e.g. in test environments where the
hardcoded devicons/devicon URL returns errors), we fall back to
find_new_icons_in_devicon_json which compares devicon.json vs icomoon.json directly.
- Replace apt-get firefox (snap, broken with geckodriver) with
  browser-actions/setup-firefox (proper .deb binary)
- Switch from icomoon_build.py to icomoon_build_githubless.py which
  needs no GitHub token and uses devicon.json vs icomoon.json diff directly
- Take screenshot on page load so we can see icomoon.io current state
- Try original 'icon-menu' selector first (6s), fall back to 'input[type=file]'
- Take screenshot when fallback is triggered and on failure
- Upload screenshots as build artifact in build_nightly.yml
element.screenshot() fails with 'Unable to capture screenshot' when
the element contains a cross-origin canvas (icomoon.io uses canvas
for icon rendering). driver.save_screenshot() bypasses this.
The Angular app on icomoon.io can be slow to initialize.
LONG_WAIT_IN_SEC (25s) was too short on slow runners.
90s gives enough headroom for the page to fully render.
select_all_icons_in_top_set and deselect_all_icons_in_top_set use
fragile icomoon.io UI selectors that fail intermittently. These are
only needed for screenshots/visual ordering, not for actual font
generation. Wrap in try-except so the build continues even if they fail.
…tion

deselect_all succeeded but select_all failed intermittently, leaving
0 icons selected and generating an empty font. Icons from uploaded
icomoon.json and new SVGs are selected by default in icomoon.io,
so deselecting is not needed for correct font generation.
Screenshots will show all icons (not just new ones) but font is correct.
Peek bot (icomoon_peek.py / PeekSeleniumRunner):
- Fix click_hamburger_input to target the first set header dynamically
  instead of the hardcoded #setH2 id, which was pointing at the wrong
  (IcoMoon Free) set and causing select_all to select the wrong icons.
- Remove new_svgs.png full-panel overview from peek_svgs — the per-SVG
  edit_svg shots (new_svg_*.png) taken during upload are already scoped
  correctly and are not affected by the set-selector bug.
- Remove new_icons.png full-panel overview from peek_icons and cap the
  glyphSet0 iteration to num_svgs entries as a hard guard against
  default-set icons bleeding into the font preview.
- PR comment no longer references the two removed overview images.

Build runner (BuildSeleniumRunner):
- Call deselect_all_icons_in_top_set before uploading new SVGs so that
  only new icons are selected for the build screenshot. download_icomoon_fonts
  calls select_all before font generation, so the full set is still used.
- Remove non-fatal try/except wrappers now that the hamburger selector fix
  makes the operations reliable.

build_nightly.yml:
- Split single job into build + release. The release job targets the
  production GitHub Environment so maintainers receive an approval request
  before the version bump and GitHub release are published.
- Release is now published (not draft) once approved.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
….json diff

icomoon_build_githubless.py: when devicon.json has no icons absent from
icomoon.json, return cleanly (exit 0) instead of calling sys.exit with a
message string (which exits 1 and triggers a false build-failure alert).

build_nightly.yml: change build_ok to require that icomoon.json was actually
modified during the run. The build script only writes to icomoon.json when new
icons are processed, so a clean git diff on that file is a reliable signal
that something was built. This prevents a version bump + release when commits
touch icons/ but contain no new icons (e.g. SVG attribute tweaks).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Drop in-develop issue closing from icomoon_build.py (GitHub closes
  linked issues when PRs merge to master) and its unused arg getter
- Replace README develop vs master section with trunk-based workflow
  description; point Gitpod and PR template links at master
- Upgrade codeql-action to v3, fix stale Node.js step name
- Update docs/comments to reflect the weekly build schedule

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e helpers

The workflow runs weekly, so the file name now matches. label_issues,
close_issues and get_issues_by_labels in api_handler.py were only used
by the removed in-develop flow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…from the release

- Add workflow_dispatch 'mode' input: build and release / build only /
  release only. Replaces build_icons.yml and version_and_release.yml.
- Derive the version bump in the release job from PRs merged since the
  last v* tag, so it also works for release-only runs.
- Release job checks out master explicitly so it includes the build:
  commit pushed by the build job; build job rebases before pushing.
- Call npm_publish.yml as a reusable workflow: releases created with
  GITHUB_TOKEN don't trigger 'release' events, so npm was never published.
- Serialize runs with a concurrency group.
- Update CONTRIBUTING release section and CLAUDE.md; add TODO for a local
  (non-icomoon) font build.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…token

- Remove auto_build_merge.yml: on fork PRs pull_request_review only gets
  a read-only token, so it couldn't merge. Merging is now governed by a
  ruleset on master (1 approval, squash only).
- build_weekly.yml: push build/version commits with a GitHub App token
  (vars.BOT_APP_ID, secrets.BOT_APP_PRIVATE_KEY) so it can bypass master
  protection; falls back to GITHUB_TOKEN when not configured. Releases
  are still created with GITHUB_TOKEN to avoid a double npm publish.
- npm_publish.yml: dry run outside devicons/devicon.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…anged

Build:
- Rebuild an icon's glyphs when its non-alias font versions in
  devicon.json don't match icomoon.json, or one of its font SVGs changed
  since the last build commit. Previously only icons missing from
  icomoon.json were built, so 'update icon' PRs never reached the font.
- Match glyphs by exact icon name when removing them from icomoon.json.

Release:
- Release when icons, devicon.json, CSS or fonts changed since the last
  tag, instead of only when icomoon.json changed. Decided in the build
  job so weeks with nothing to ship don't request an approval.
- Remove the manual 'mode' input; a manual run does what the weekly run
  does (reject the approval to build without releasing).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…PR titles

check_icon_pr.yml and peek_icons.yml only worked out which icon a PR is
about from its title, and the check only ran for titles starting with
'new icon'/'update icon'. Icon PRs titled e.g. 'feat: add verilog icon'
skipped SVG validation and peek entirely.

- util.get_pr_icon_changes: diff the PR merge commit against HEAD^1 to
  find changed icon SVGs and devicon.json entries.
- check_icon_pr.py: validate every touched icon. When SVGs change,
  require one icon per PR and a title matching it: 'new icon:' vs
  'update icon:' (from the target branch's devicon.json), the folder
  name, and the added/changed SVG versions. Errors include the expected
  title. devicon.json-only PRs have no title requirement.
- check_icon_pr.yml: run on every icon PR (no title gate), re-run when
  the title is edited.
- icomoon_peek.py: peek the icon whose SVGs changed; skip quietly when
  none did. post_peek_screenshot.yml posts nothing in that case.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ubuntu-latest is now Ubuntu 26.04, which has no Python 3.8 build, so
  the check and peek jobs failed in setup-python. Pin the Python jobs to
  ubuntu-24.04 (as upstream develop did in devicons#2769).
- requests 2.34.2 needs Python >= 3.10: move check/peek from 3.8 to 3.10
  (the weekly build already uses 3.10).
- selenium 4.51.0 (from devicons#2766) removed the find_element_by_* API the
  Selenium runners use; go back to 4.1.0, which earlier builds used.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Snailedlt
Snailedlt merged commit d959f2d into master Oct 24, 2026
4 checks passed
@Snailedlt
Snailedlt deleted the chore/trunk-based-migration branch October 24, 2026 17:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant