Initial iOS Hello World app with Gitea Actions build workflow
Build iOS App / Build .ipa and publish source (push) Successful in 1m19s

This commit is contained in:
Hermes
2026-08-08 16:59:39 +00:00
parent 26d5f868bb
commit caa06677da
9 changed files with 517 additions and 0 deletions
+81
View File
@@ -0,0 +1,81 @@
name: Build iOS App
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build:
name: Build .ipa and publish source
runs-on: macos
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Select Xcode
run: |
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
xcodebuild -version
- name: Build unsigned .ipa
run: |
# Build the app bundle (no signing — SideStore signs on-device)
xcodebuild \
-project iOS-hello_world.xcodeproj \
-scheme iOS-hello_world \
-configuration Release \
-sdk iphoneos \
-derivedDataPath build \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO \
CODE_SIGN_IDENTITY="" \
build
# Locate the .app bundle
APP_PATH=$(find build/Build/Products -name "*.app" -type d | head -1)
echo "App bundle: $APP_PATH"
# Package into an .ipa (Payload/App.app structure)
mkdir -p dist/Payload
cp -R "$APP_PATH" dist/Payload/
cd dist
zip -r ../iOS-hello_world.ipa Payload
cd ..
ls -la iOS-hello_world.ipa
- name: Generate source.json
run: |
VERSION="1.0"
SIZE=$(stat -f%z iOS-hello_world.ipa)
DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
cat > source.json <<EOF
{
"name": "Hello World",
"identifier": "com.example.helloworld.source",
"sourceURL": "https://apps.bueso.eu/ios-hello_world/source.json",
"apps": [
{
"name": "Hello World",
"bundleIdentifier": "com.example.helloworld",
"developerName": "Luis",
"localizedDescription": "Hello World iOS app built via Gitea Actions.",
"iconURL": "https://apps.bueso.eu/ios-hello_world/icon.png",
"downloadURL": "https://apps.bueso.eu/ios-hello_world/iOS-hello_world.ipa",
"version": "$VERSION",
"versionDate": "$DATE",
"size": $SIZE,
"permissions": []
}
]
}
EOF
cat source.json
- name: Upload to source host (perlis)
run: |
# Upload .ipa + source.json to perlis via SSH
scp -o StrictHostKeyChecking=no \
iOS-hello_world.ipa source.json \
"${{ secrets.PERLIS_SSH_USER }}@${{ secrets.PERLIS_SSH_HOST }}:/mnt/appdata/ios-apps/ios-hello_world/"
+10
View File
@@ -0,0 +1,10 @@
# Xcode
build/
DerivedData/
*.ipa
dist/
xcuserdata/
*.xcuserstate
# macOS
.DS_Store
@@ -0,0 +1,13 @@
{
"images" : [
{
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
+25
View File
@@ -0,0 +1,25 @@
// ContentView.swift
// iOS-hello_world
import SwiftUI
struct ContentView: View {
var body: some View {
VStack(spacing: 16) {
Image(systemName: "waveform.path.ecg")
.font(.system(size: 64))
.foregroundColor(.accentColor)
Text("Hello, World!")
.font(.largeTitle)
.fontWeight(.bold)
Text("Built with Gitea Actions on the iMac runner")
.font(.subheadline)
.foregroundColor(.secondary)
}
.padding()
}
}
#Preview {
ContentView()
}
+15
View File
@@ -0,0 +1,15 @@
// HelloWorldApp.swift
// iOS-hello_world
//
// Simple SwiftUI app built via Gitea Actions on the iMac runner.
import SwiftUI
@main
struct HelloWorldApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
+36
View File
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>Hello World</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchScreen</key>
<dict/>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
</dict>
</plist>
+253
View File
@@ -0,0 +1,253 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 77;
objects = {
/* Begin PBXFileSystemSynchronizedRootGroup section */
AB1234567890ABCDEF000001 /* HelloWorld */ = {
isa = PBXFileSystemSynchronizedRootGroup;
explicitFileTypes = {
};
explicitFolders = (
);
path = HelloWorld;
sourceTree = "<group>";
};
/* End PBXFileSystemSynchronizedRootGroup section */
/* Begin PBXGroup section */
AB1234567890ABCDEF000002 = {
isa = PBXGroup;
children = (
AB1234567890ABCDEF000001 /* HelloWorld */,
AB1234567890ABCDEF000003 /* Products */,
);
sourceTree = "<group>";
};
AB1234567890ABCDEF000003 /* Products */ = {
isa = PBXGroup;
children = (
AB1234567890ABCDEF000004 /* iOS-hello_world.app */,
);
name = Products;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
AB1234567890ABCDEF000005 /* iOS-hello_world */ = {
isa = PBXNativeTarget;
buildConfigurationList = AB1234567890ABCDEF000006 /* Build configuration list for PBXNativeTarget "iOS-hello_world" */;
buildPhases = (
AB1234567890ABCDEF000007 /* Sources */,
AB1234567890ABCDEF000008 /* Frameworks */,
AB1234567890ABCDEF000009 /* Resources */,
);
buildRules = (
);
dependencies = (
);
fileSystemSynchronizedGroups = (
AB1234567890ABCDEF000001 /* HelloWorld */,
);
name = "iOS-hello_world";
packageProductDependencies = (
);
productName = "iOS-hello_world";
productReference = AB1234567890ABCDEF000004 /* iOS-hello_world.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
AB1234567890ABCDEF00000A /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1600;
LastUpgradeCheck = 1600;
TargetAttributes = {
AB1234567890ABCDEF000005 = {
CreatedOnToolsVersion = 16.0;
};
};
};
buildConfigurationList = AB1234567890ABCDEF00000B /* Build configuration list for PBXProject "iOS-hello_world" */;
compatibilityVersion = "Xcode 15.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = AB1234567890ABCDEF000002;
minimizedProjectReferenceProxies = 1;
preferredProjectObjectVersion = 77;
productRefGroup = AB1234567890ABCDEF000003 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
AB1234567890ABCDEF000005 /* iOS-hello_world */,
);
};
/* End PBXProject section */
/* Begin PBXFileReference section */
AB1234567890ABCDEF000004 /* iOS-hello_world.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iOS-hello_world.app"; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXSourcesBuildPhase section */
AB1234567890ABCDEF000007 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXFrameworksBuildPhase section */
AB1234567890ABCDEF000008 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXResourcesBuildPhase section */
AB1234567890ABCDEF000009 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
AB1234567890ABCDEF00000C /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
AB1234567890ABCDEF00000D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
AB1234567890ABCDEF00000E /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = "";
GENERATE_INFOPLIST_FILE = NO;
INFOPLIST_FILE = HelloWorld/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.helloworld;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
AB1234567890ABCDEF00000F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = "";
GENERATE_INFOPLIST_FILE = NO;
INFOPLIST_FILE = HelloWorld/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.helloworld;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
AB1234567890ABCDEF00000B /* Build configuration list for PBXProject "iOS-hello_world" */ = {
isa = XCConfigurationList;
buildConfigurations = (
AB1234567890ABCDEF00000C /* Debug */,
AB1234567890ABCDEF00000D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
AB1234567890ABCDEF000006 /* Build configuration list for PBXNativeTarget "iOS-hello_world" */ = {
isa = XCConfigurationList;
buildConfigurations = (
AB1234567890ABCDEF00000E /* Debug */,
AB1234567890ABCDEF00000F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = AB1234567890ABCDEF00000A /* Project object */;
}
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1600"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "AB1234567890ABCDEF000005"
BuildableName = "iOS-hello_world.app"
BlueprintName = "iOS-hello_world"
ReferencedContainer = "container:iOS-hello_world.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "AB1234567890ABCDEF000005"
BuildableName = "iOS-hello_world.app"
BlueprintName = "iOS-hello_world"
ReferencedContainer = "container:iOS-hello_world.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "AB1234567890ABCDEF000005"
BuildableName = "iOS-hello_world.app"
BlueprintName = "iOS-hello_world"
ReferencedContainer = "container:iOS-hello_world.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>