ci: use app store signing for mobile ios
This commit is contained in:
@@ -185,11 +185,79 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
VERSION_NAME: ${{ needs.resolve-version.outputs.version_name }}
|
VERSION_NAME: ${{ needs.resolve-version.outputs.version_name }}
|
||||||
BUILD_NUMBER: ${{ needs.resolve-version.outputs.build_number }}
|
BUILD_NUMBER: ${{ needs.resolve-version.outputs.build_number }}
|
||||||
|
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||||
|
IOS_APP_PROFILE_NAME: ${{ secrets.IOS_APP_PROFILE_NAME }}
|
||||||
|
IOS_WIDGET_PROFILE_NAME: ${{ secrets.IOS_WIDGET_PROFILE_NAME }}
|
||||||
|
IOS_NSE_PROFILE_NAME: ${{ secrets.IOS_NSE_PROFILE_NAME }}
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
/usr/libexec/PlistBuddy -c "Set :aps-environment production" App/App.entitlements
|
/usr/libexec/PlistBuddy -c "Set :aps-environment production" App/App.entitlements
|
||||||
xcrun agvtool new-marketing-version "$VERSION_NAME"
|
xcrun agvtool new-marketing-version "$VERSION_NAME"
|
||||||
xcrun agvtool new-version -all "$BUILD_NUMBER"
|
xcrun agvtool new-version -all "$BUILD_NUMBER"
|
||||||
|
|
||||||
|
node --input-type=module <<'NODE'
|
||||||
|
import { readFileSync, writeFileSync } from 'node:fs';
|
||||||
|
|
||||||
|
const projectPath = 'App.xcodeproj/project.pbxproj';
|
||||||
|
let project = readFileSync(projectPath, 'utf8');
|
||||||
|
const replacements = [
|
||||||
|
{
|
||||||
|
bundle: 'com.openchamber.app',
|
||||||
|
profile: process.env.IOS_APP_PROFILE_NAME,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
bundle: 'com.openchamber.app.OpenChamberWidget',
|
||||||
|
profile: process.env.IOS_WIDGET_PROFILE_NAME,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
bundle: 'com.openchamber.app.OpenChamberNotificationService',
|
||||||
|
profile: process.env.IOS_NSE_PROFILE_NAME,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
for (const { bundle, profile } of replacements) {
|
||||||
|
if (!profile) throw new Error(`Missing provisioning profile name for ${bundle}`);
|
||||||
|
const marker = `PRODUCT_BUNDLE_IDENTIFIER = ${bundle};`;
|
||||||
|
let markerIndex = -1;
|
||||||
|
let searchFrom = 0;
|
||||||
|
while (true) {
|
||||||
|
const candidate = project.indexOf(marker, searchFrom);
|
||||||
|
if (candidate === -1) break;
|
||||||
|
const candidateEnd = project.indexOf('\n\t\t\t\t};', candidate);
|
||||||
|
const configEnd = project.indexOf('\n\t\t};', candidateEnd);
|
||||||
|
const config = project.slice(candidateEnd, configEnd);
|
||||||
|
if (config.includes('name = Release;')) {
|
||||||
|
markerIndex = candidate;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
searchFrom = candidate + marker.length;
|
||||||
|
}
|
||||||
|
if (markerIndex === -1) throw new Error(`Could not find ${bundle} Release build settings`);
|
||||||
|
|
||||||
|
const blockStart = project.lastIndexOf('buildSettings = {', markerIndex);
|
||||||
|
const blockEnd = project.indexOf('\n\t\t\t\t};', markerIndex);
|
||||||
|
if (blockStart === -1 || blockEnd === -1) throw new Error(`Could not find ${bundle} build settings block`);
|
||||||
|
|
||||||
|
const before = project.slice(0, blockStart);
|
||||||
|
let block = project.slice(blockStart, blockEnd);
|
||||||
|
const after = project.slice(blockEnd);
|
||||||
|
|
||||||
|
block = block.replace(/CODE_SIGN_STYLE = Automatic;/, 'CODE_SIGN_STYLE = Manual;');
|
||||||
|
if (!block.includes('DEVELOPMENT_TEAM = ')) {
|
||||||
|
block = block.replace(/CODE_SIGN_STYLE = Manual;\n/, `CODE_SIGN_STYLE = Manual;\n\t\t\t\tDEVELOPMENT_TEAM = ${process.env.APPLE_TEAM_ID};\n`);
|
||||||
|
}
|
||||||
|
if (!block.includes('CODE_SIGN_IDENTITY = ')) {
|
||||||
|
block = block.replace(/CODE_SIGN_STYLE = Manual;\n/, 'CODE_SIGN_STYLE = Manual;\n\t\t\t\tCODE_SIGN_IDENTITY = "Apple Distribution";\n');
|
||||||
|
}
|
||||||
|
if (!block.includes('PROVISIONING_PROFILE_SPECIFIER = ')) {
|
||||||
|
block = block.replace(`${marker}\n`, `${marker}\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = "${profile}";\n`);
|
||||||
|
}
|
||||||
|
|
||||||
|
project = `${before}${block}${after}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
writeFileSync(projectPath, project);
|
||||||
|
NODE
|
||||||
working-directory: ${{ env.IOS_PROJECT_DIR }}
|
working-directory: ${{ env.IOS_PROJECT_DIR }}
|
||||||
|
|
||||||
- name: Archive iOS app
|
- name: Archive iOS app
|
||||||
|
|||||||
Reference in New Issue
Block a user