Skip to content

Streamline Android release workflow - #243

Merged
maxistar merged 1 commit into
devfrom
codex/streamline-android-release-workflow
Oct 3, 2026
Merged

maxistar merged 1 commit into
devfrom
codex/streamline-android-release-workflow

Conversation

@maxistar

@maxistar maxistar commented Oct 3, 2026

Copy link
Copy Markdown
Owner

Summary

  • trigger guarded release publication from merged release/hotfix PRs
  • derive immutable release identity across publication, sync, and promotion
  • audit repository protections and document recovery paths
  • run release tooling tests in regular CI

Validation

  • 38 release tooling/workflow/protection tests pass locally
  • Android test, lint, APK/AAB assembly, and release identity checks passed locally
  • live GitHub protection audit is compliant

This PR changes release automation only; it does not publish a release by itself.

@maxistar
maxistar merged commit 0503060 into dev Oct 3, 2026
1 of 3 checks passed
@maxistar
maxistar deleted the codex/streamline-android-release-workflow branch October 3, 2026 16:58

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b2e6b6407f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +101 to +104
if expected.get("requirePullRequest") and not actual.get("required_pull_request_reviews"):
errors.append(f"branch {name} does not require pull requests")
contexts = set((actual.get("required_status_checks") or {}).get("contexts", []))
missing_checks = sorted(set(expected.get("requiredChecks", [])) - contexts)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Reject protection rules that prevent the dev sync

When dev requires pull requests or has any required status check, this audit still reports success because requirePullRequest: false is never compared and an expected empty check set can never produce missing_checks. The release workflow later creates a new merge commit locally and pushes it directly to dev, so either live restriction can reject that push after publication and leave the development branch unsynchronized; validate the false/empty expectations as well.

Useful? React with 👍 / 👎.

Comment on lines +137 to +141
actual_policies = policy_keys(bundle.get("policies", {}))
for required in expected.get("allowedRefs", []):
key = (required["name"], required.get("type"))
legacy_key = (required["name"], None)
if key not in actual_policies and legacy_key not in actual_policies:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Reject unexpected environment deployment policies

If either environment contains the expected master and v* policies plus an additional branch or wildcard policy, this one-way membership check returns no error even though the environment is no longer limited to the configured refs. That makes the advertised protection audit pass while workflows from unintended refs can enter the release or production environment, undermining the trust boundary this audit is intended to verify; compare the complete policy set instead.

Useful? React with 👍 / 👎.

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