Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,34 +1,40 @@
name: Publish Beta Build
name: Deploy Beta

on:
schedule:
- cron: "0 4 * * 1" # Every Monday at 04:00 UTC
workflow_dispatch:
push:
branches:
- "release/**"

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job.name}}
cancel-in-progress: true

permissions:
contents: write
pull-requests: write
contents: read

jobs:
publish:
name: Publish Beta Build
deploy:
name: Deploy Beta Build
runs-on: macos-26
timeout-minutes: 60
steps:
- name: Generate GitHub App Token
id: github_app_token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ vars.TECHPRIMATE_RELEASE_BOT_APP_ID }}
private-key: ${{ secrets.TECHPRIMATE_RELEASE_BOT_PRIVATE_KEY }}

- name: Checkout Code
uses: actions/checkout@v6
with:
submodules: true
token: ${{ secrets.GITHUB_TOKEN }}
token: ${{ steps.github_app_token.outputs.token }}

- name: Configure Git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git config user.name "techprimate-release-bot"
git config user.email "techprimate-release-bot@users.noreply.github.com"

- name: Install Dependencies
run: brew bundle --file Brewfile-ci
Expand All @@ -50,20 +56,12 @@ jobs:
--arg key "$APP_STORE_CONNECT_API_PRIVATE_KEY" \
'{key_id: $key_id, issuer_id: $issuer_id, key: $key}' > fastlane/api-key.json

- name: Generate GitHub App Token
id: github_app_token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ vars.TECHPRIMATE_RELEASE_BOT_APP_ID }}
private-key: ${{ secrets.TECHPRIMATE_RELEASE_BOT_PRIVATE_KEY }}

- run: bundle exec fastlane beta_ci
- run: bundle exec fastlane deploy_beta
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
MATCH_GIT_PRIVATE_KEY: ${{ secrets.MATCH_GIT_PRIVATE_KEY }}
LICENSE_PLIST_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_APP_TOKEN: ${{ steps.github_app_token.outputs.token }}
LICENSE_PLIST_GITHUB_TOKEN: ${{ steps.github_app_token.outputs.token }}

- name: Run CI Diagnostics
if: failure()
Expand Down
67 changes: 67 additions & 0 deletions .github/workflows/prepare-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
name: Prepare Release

on:
schedule:
- cron: "0 4 * * 1" # Every Monday at 04:00 UTC
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job.name}}
Copy link

Copilot AI Feb 2, 2026

Choose a reason for hiding this comment

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

github.job.name is not a valid GitHub Actions context property; the job id is available as github.job. As written, this expression may evaluate unexpectedly (or to an empty string), which can cause unrelated runs to share the same concurrency group. Consider switching to ${{ github.job }} (or remove the job component if you intentionally want a workflow-wide lock).

Suggested change
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job.name}}
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job }}

Copilot uses AI. Check for mistakes.
cancel-in-progress: true

permissions:
contents: write
pull-requests: write

jobs:
prepare:
name: Prepare Release
runs-on: macos-26
timeout-minutes: 15
steps:
- name: Generate GitHub App Token
id: github_app_token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ vars.TECHPRIMATE_RELEASE_BOT_APP_ID }}
private-key: ${{ secrets.TECHPRIMATE_RELEASE_BOT_PRIVATE_KEY }}

- name: Checkout Code
uses: actions/checkout@v6
with:
submodules: true
token: ${{ steps.github_app_token.outputs.token }}

- name: Configure Git
run: |
git config user.name "techprimate-release-bot"
git config user.email "techprimate-release-bot@users.noreply.github.com"

- name: Install Dependencies
run: brew bundle --file Brewfile-ci

- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true

- name: Create App Store Connect API Key
env:
APP_STORE_CONNECT_API_KEY_ID: ${{ vars.APP_STORE_CONNECT_API_KEY_ID }}
APP_STORE_CONNECT_API_ISSUER_ID: ${{ vars.APP_STORE_CONNECT_API_ISSUER_ID }}
APP_STORE_CONNECT_API_PRIVATE_KEY: ${{ secrets.APP_STORE_CONNECT_API_PRIVATE_KEY }}
run: |
jq -n \
--arg key_id "$APP_STORE_CONNECT_API_KEY_ID" \
--arg issuer_id "$APP_STORE_CONNECT_API_ISSUER_ID" \
--arg key "$APP_STORE_CONNECT_API_PRIVATE_KEY" \
'{key_id: $key_id, issuer_id: $issuer_id, key: $key}' > fastlane/api-key.json

- run: bundle exec fastlane prepare_release
env:
LICENSE_PLIST_GITHUB_TOKEN: ${{ steps.github_app_token.outputs.token }}
GITHUB_APP_TOKEN: ${{ steps.github_app_token.outputs.token }}

- name: Run CI Diagnostics
if: failure()
run: ./Scripts/ci-diagnostics.sh
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ gem "ostruct" # Required by Ruby v3.5.X
gem "benchmark" # Required by Ruby v3.5.X

gem "fastlane"
gem "octokit" # GitHub API client for REST and GraphQL operations

plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)
7 changes: 7 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,9 @@ GEM
nanaimo (0.4.0)
naturally (2.3.0)
nkf (0.2.0)
octokit (10.0.0)
faraday (>= 1, < 3)
sawyer (~> 0.9)
optparse (0.8.1)
os (1.1.4)
ostruct (0.6.3)
Expand All @@ -195,6 +198,9 @@ GEM
rouge (3.28.0)
ruby2_keywords (0.0.5)
rubyzip (2.4.1)
sawyer (0.9.3)
addressable (>= 2.3.5)
faraday (>= 0.17.3, < 3)
security (0.1.5)
signet (0.21.0)
addressable (~> 2.8)
Expand Down Expand Up @@ -238,6 +244,7 @@ DEPENDENCIES
fastlane
fastlane-plugin-appicon
fastlane-plugin-sentry (= 2.0.0.pre.rc.2)
octokit
ostruct

BUNDLED WITH
Expand Down
Loading
Loading