mcpField
A
asc-appstore-release

asc-appstore-release

github.com/tddworksCloud & DevOps591 installsUpdated 5w ago
Repository

About asc-appstore-release

A skill for automating App Store releases with the `asc` CLI in GitHub Actions. It covers building and uploading from source or uploading a prebuilt IPA/PKG, then managing TestFlight and submission checks.

Key features

  1. 01Build, export, and upload from source
  2. 02Upload prebuilt IPA or PKG
  3. 03Assign builds to TestFlight groups
  4. 04Set beta release notes
  5. 05Check readiness and submit versions

Use cases

  1. 01Automating App Store releases in GitHub Actions
  2. 02Uploading signed iOS or macOS builds
  3. 03Distributing builds through TestFlight
  4. 04Submitting versions with in-app purchases

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/tddworks/asc-cli-skills --skill asc-appstore-release

After installing, type/asc-appstore-releasein Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

.DS_Store
references/
workflow-template.md
scripts/
setup-mas-certs.sh

Details

From the project README

App Store Release with asc in GitHub Actions

Two paths depending on your build setup:

Option A: Archive from source — asc handles everything (archive + export + upload)

Xcode project
  → asc builds next-number            # auto-resolve build number
  → asc builds archive --upload        # archive, export, upload in one step
  → asc builds add-beta-group          # optional: TestFlight distribution
  → asc builds update-beta-notes       # optional: "What's New" text
  → asc versions set-build             # link build to App Store version
  → asc versions check-readiness       # gate: verify all checks pass
  → asc versions submit                # submit for App Store review (--with-products for new IAPs/subscriptions)

Option B: Upload pre-built IPA — you already have a signed binary (from Xcode, Fastlane, etc.)

Signed IPA/PKG (from your build step)
  → asc builds next-number            # auto-resolve build number
  → asc builds upload --wait           # upload + wait for Apple processing
  → asc builds add-beta-group          # optional: TestFlight distribution
  → asc builds update-beta-notes       # optional: "What's New" text
  → asc versions set-build             # link build to App Store version
  → asc versions check-readiness       # gate: verify all checks pass
  → asc versions submit                # submit for App Store review (--with-products for new IAPs/subscriptions)

See workflow-template.md for complete copy-paste workflows.

Mac App Store Certificate Setup

Before the first CI run, you need APPLE_MAS_CERTIFICATE_P12 and APPLE_MAS_CERTIFICATE_PASSWORD. Run the interactive setup script:

.claude/skills/asc-appstore-release/scripts/setup-mas-certs.sh

The script walks through the full mental model:

Generate CSR
  → asc certificates create MAC_APP_DISTRIBUTION  (automated)
  → Apple portal: Mac Installer Distribution cert  (one browser step)
  → Export both as P12 via Keychain Access
  → Print base64 values ready to paste into GitHub Secrets

Install asc in GitHub Actions

- name: Install asc CLI
  run: |
    brew tap tddworks/tap
    brew install asccli

Or download a specific version directly:

- name: Install asc CLI
  run: |
    VERSION="0.1.3"
    ARCH=$(uname -m | sed 's/x86_64/x86_64/;s/arm64/arm64/')
    curl -sL "https://github.com/tddworks/asc-cli/releases/download/v${VERSION}/asc_${VERSION}_macOS_${ARCH}" \
      -o /usr/local/bin/asc && chmod +x /usr/local/bin/asc

Auth Setup

asc reads credentials from environment variables automatically:

env:
  ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }}
  ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }}
  ASC_PRIVATE_KEY: ${{ secrets.ASC_PRIVATE_KEY }}   # PEM content, NOT a path

Required GitHub Secrets:

SecretValue
ASC_KEY_IDApp Store Connect API Key ID (e.g. 6X3CMK22CY)
ASC_ISSUER_IDIssuer ID (UUID format)
ASC_PRIVATE_KEYFull PEM content of the .p8 file

To get the PEM content from your .p8 file:

cat AuthKey_XXXXXX.p8 | pbcopy   # paste as the secret value

Core Commands

Option A: Archive from source (recommended for asc-only workflows)
# 1. Get the next build number
BUILD_NUMBER=$(asc builds next-number --app-id $APP_ID --version $VERSION --platform ios)

# 2. Archive, export, and upload in one command
asc builds archive \
  --scheme $SCHEME \
  --platform ios \
  --upload \
  --app-id $APP_ID \
  --version $VERSION \
  --build-number $BUILD_NUMBER

# 3. Get the processed build ID
BUILD_ID=$(asc builds list --app-id $APP_ID --version $VERSION --platform ios | jq -r '.data[0].id')
Option B: Upload pre-built IPA/PKG
# 1. Get the next build number
BUILD_NUMBER=$(asc builds next-number --app-id $APP_ID --version $VERSION --platform ios)

# 2. Upload IPA (auto-detects iOS from .ipa, macOS from .pkg)
asc builds upload \
  --app-id $APP_ID \
  --file MyApp.ipa \
  --version $VERSION \
  --build-number $BUILD_NUMBER \
  --wait

# 3. Get the processed build ID
BUILD_ID=$(asc builds list --app-id $APP_ID --version $VERSION --platform ios | jq -r '.data[0].id')
Common steps (after either option)
# 4. TestFlight: add to beta group
asc builds add-beta-group --build-id $BUILD_ID --beta-group-id $GROUP_ID

# 5. TestFlight: set "What's New" notes
asc builds update-beta-notes \
  --build-id $BUILD_ID \
  --locale en-US \
  --notes "Bug fixes and improvements."

# 6. App Store: link build to version
VERSION_ID=$(asc versions list --app-id $APP_ID --pretty | jq -r '.data[0].id')
asc versions set-build --version-id $VERSION_ID --build-id $BUILD_ID

# 7. App Store: gate — verify all checks pass before submitting
READINESS=$(asc versions check-readiness --version-id $VERSION_ID)
IS_READY=$(echo "$READINESS" | jq -r '.data[0].isReadyToSubmit')
if [ "$IS_READY" != "true" ]; then
  echo "Version is NOT ready to submit:"
  echo "$READINESS" | jq '.data[0] | {stateCheck, buildCheck, pricingCheck}'
  exit 1
fi

# 8. App Store: submit for review. --with-products also sends every READY_TO_SUBMIT
#    in-app purchase and subscription in the same submission — required for first-time
#    products, harmless otherwise. Preview with --dry-run.
asc versions submit --version-id $VERSION_ID --with-products

First-time IAPs and subscriptions must be reviewed with an app version; see submit-with-products.md for the dry run, step-by-step control, and reading Apple's refusal reasons.

Finding Your IDs

# App ID (do this once, store as a secret or env var)
asc apps list --pretty | jq -r '.data[] | "\(.name): \(.id)"'

# Beta group ID
asc testflight groups list --app-id $APP_ID --pretty | jq -r '.data[0].id'

# Current version ID (latest editable version)
asc versions list --app-id $APP_ID --pretty | jq -r '.data[0].id'

Comments

Markdown supported