{"id":17316607,"url":"https://github.com/scenee/relax","last_synced_at":"2025-04-14T13:32:02.028Z","repository":{"id":54891321,"uuid":"75144678","full_name":"scenee/relax","owner":"scenee","description":"A tiny release tool to support multi distribution(IPA) on iOS development.","archived":false,"fork":false,"pushed_at":"2024-07-04T08:18:27.000Z","size":70837,"stargazers_count":40,"open_issues_count":0,"forks_count":5,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-28T02:53:16.473Z","etag":null,"topics":["entitlements","ios","ipa","macos","mobileprovision","xcode"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/scenee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-11-30T02:50:11.000Z","updated_at":"2025-01-05T13:09:46.000Z","dependencies_parsed_at":"2024-11-08T05:00:37.096Z","dependency_job_id":"f4009774-d557-4cbd-8c91-e50dc87f90ed","html_url":"https://github.com/scenee/relax","commit_stats":null,"previous_names":[],"tags_count":41,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scenee%2Frelax","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scenee%2Frelax/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scenee%2Frelax/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scenee%2Frelax/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/scenee","download_url":"https://codeload.github.com/scenee/relax/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248888721,"owners_count":21178098,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["entitlements","ios","ipa","macos","mobileprovision","xcode"],"created_at":"2024-10-15T13:13:31.832Z","updated_at":"2025-04-14T13:31:57.011Z","avatar_url":"https://github.com/scenee.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Relax\n\nRelax is a tiny release tool for iOS developers who don't want to be bothering with code signing and Xcode stuffs!!\n\nYou just configure `scheme` and `provisioning_profile` to build archive and IPA files.\n\nRelax will save your time. It's hard to understand `xcodebuild` stuff, for example, code signing mechanism. Relax takes care of much of the hassle of them. so you can focus on development.\n\n## Features\n\n**Mutli distribution**\n\n* Eanble to configure multi distribution for each code signing identity, info plist and build settings(i.e. ad-hoc builds for different clients).\n\n**Less configuration**\n\n* One configuration file instead of many xcconfig files or build configurations in your project\n* Detect and check the related identity from a provisioning profile.\n* Automatically generate ExportOptions.plist for each distribution\n\n**Easy \u0026 Simple** \n\n* Easy to install into macOS\n* Provide simple CLI to resolve issues of IPA distribution support and CI environment.\n  * Validate and Resign IPA\n  * Inspector of keychain and provisioning profiles\n\n## Installation\n\n### Homebrew\n\n```bash\n$ brew install scenee/formulae/relax\n```\n\n### Install script\n\n```bash\n$ curl -fsSL https://raw.githubusercontent.com/SCENEE/relax/master/install.sh | bash\n```\n\nNOTE: You don't need to take care of a host environment(i.e. ruby version and gem settings).\n\n## Requirements\n\n- Xcode9.4.1+\n\n\n## Create a IPA file\n\n```bash\n$ relax dist /path/to/xcodeproj_or_xcworkspace --scheme scheme_name --profile profile_name\n$ # OR\n$ relax dist /path/to/xcodeproj_or_xcworkspace -s scheme_name -p profile_name\n```\n\nOr use Relfile.\n\n```bash\n$ relax init\n$ relax dist adhoc\n```\n\n### Notes\n\n* You need to create a provisioning profile for your identity(certificate) and install them to a build machine by yourself because Relax doesn't access to Apple Developer Center for security reasons.\n* **`relax profile add` and `relax keychain add`** help you to install them and resolve permissions for your identities in your keychain. I highly recommend to use those commands. See [here](https://github.com/SCENEE/relax/blob/master/test/setup.sh#L22) and [here](https://github.com/SCENEE/relax/blob/master/test/setup.sh#L33).\n\n\n## Relfile\n\nRelfile is a configuration file for Relax. The declarative file will really make you easy to understand how to customize Info.plist and build settings for a distribution. See [here](https://github.com/SCENEE/relax/blob/master/sample/Relfile) for detail.\n\nHere is an example.\n\n```yaml\nversion: '2'\n\nworkspace: SampleApp\ndistributions:\n  adhoc:\n    # Required\n    scheme: SampleApp\n    provisioning_profile: 'Relax Adhoc'\n\n    # Optional\n    version: '1.0.1'\n    configuration: Debug\n    bundle_identifier: com.scenee.SampleApp.dev\n    bundle_version: '$BUILD_NUMBER'  # You can use shell environment variables!\n    info_plist:\n      CFBundleName: 'SmapleApp(Debug)'\n      UISupportedExternalAccessoryProtocols:\n        - com.example.test-accessory\n    build_settings:\n      OTHER_SWIFT_FLAGS:\n        - '-DMOCK'\n    export_options:\n      compileBitcode: false\n\n  ent:\n    # Required\n    scheme: SampleApp\n    provisioning_profile: 'Relax Enterprise'\n\n    # Optional\n    bundle_identifier: com.scenee.SampleApp\n    bundle_version: '%b-%h-$c'  # See 'Bundle Version Format section'\n    info_plist:\n      UISupportedExternalAccessoryProtocols:\n        - com.example.accessory\n\n  framework:\n    # Required\n    scheme: Sample Framework\n\n    # Optional\n    configuration: Release\n\nlog_formatter: xcpretty # Optional\n```\n\n### Use Environment variables in Relfile\n\nYou can use Environment variables in Relfile. That's much useful in CI services. For example,\n\n```yaml\ndevelopment2:\n  scheme: Sample App\n  bundle_version: $BUILD_NUMBER\n  ....\n```\n\n```bash\n$ BUILD_NUMBER=11 relax archive development2\n```\n\nor\n\n```bash\n$ export BUILD_NUMBER=11\n$ relax archive development2\n```\n\nBut, you know, you can't use Xcode build setting variables (like PRODUCT_NAME etc.) in Relfile because they can be overridden by Relfile's definitions.\n\n### Export Option Support\n\n| Option                                   | Response status                                                                                 |\n| :--------------------------------------- | :------------------------------------------------------------------                             |\n| compileBitcode                           | OK                                                                                              |\n| embedOnDemandResourcesAssetPacksInBundle | Not supported                                                                                   |\n| iCloudContainerEnvironment               | Not supported                                                                                   |\n| manifest                                 | Not supported                                                                                   |\n| method                                   | Auto-assigned 'ad-hoc', 'app-store', 'development' or 'enterprise' from `provisioning_profile`. |\n| onDemandResourcesAssetPacksBaseURL       | Not supported                                                                                   |\n| teamID                                   | Auto-assigned from `provisioning_profile`.                                                      |\n| provisioningProfiles                     | Auto-assigned from `provisioning_profile`.                                                      |\n| signingCertificate                       | Auto-assigned 'iPhone Developer' or 'iPhone Distribution' from `provisioning_profile`.          |\n| signingStyle                             | Auto-assigned 'automatic' or 'manual' determined from `provisioning_profile`.                   |\n| thinning                                 | OK                                                                                              |\n| uploadBitcode                            | OK                                                                                              |\n| uploadSymbols                            | OK                                                                                              |\n\n### Bundle Version Format\n\nYou can use specific format characters in a value of `bundle_version` field.\nThe characters and their meanings are as follows.\n\n| Character | Meaning |\n|:---------|:-------|\n|%c| Build configuration|\n|%h| Git abbreviated commit hash|\n|%b| Git branch name|\n\n## Advanced usages\n\n### Create an archive file\n\n```bash\n$ relax archive dev\n```\n\n### Create a IPA file\n\n```bash\n$ relax export \"/path/to/xcarchive\"\n$ # OR\n$ relax export dev\n```\n\n### Validate a IPA file\n\nCheck a IPA file if it has a correct code signing and entitlements.\n\n```bash\n$ relax validate \"$(relax show adhoc ipa)\"\n```\n\nYou can also validate an archive file.\n\n### Resign a IPA file for an enterprise distribution\n\nResign a IPA file for a distribution by a provisioning profile. The related identity is selected automatically from active keychains.\n\n```bash\n$ relax resign -i \"com.mycompany.SampleApp\" -p \"\u003centerprise-provisioning-profile\u003e\"  /path/to/ipa\n```\n\n### `keychain` commands\n\nThe `keychain` module commands make you free from keychain stuff and prevent a build break!\nActually this is an useful wrapper of `security` command.\n\nRun here and see [this script](https://github.com/SCENEE/relax/blob/master/test/run.sh#L24) for detail.\n```\n$ relax help keychain\n```\n\n### `profile` commands\n\nThe `profile` module commands make it easy to find, use or remove provisioning profiles without Xcode Preferences.\n\nRun here and see [this script](https://github.com/SCENEE/relax/blob/master/test/run.sh#L37) for detail.\n```\n$ relax help profile\n```\n\n### Symbolicate a crash log\n\n```bash\n$ relax symbolicate sampleapp.crash SampleApp.xcarchive\n```\n\n## Known Issues\n\n- Homebrew(0.9.x) failed to update Relax. Please use Homebrew(1.1.2+) with `brewe update`.\n- Relax hasn't yet support Carthage. If you use it, Relax might not be working well. I'm glad for you to make a pull request to support it!\n- `stty: stdin isn't a terminal` can be printed on a CI build server, but Relax is working well.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscenee%2Frelax","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscenee%2Frelax","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscenee%2Frelax/lists"}