{"id":18739718,"url":"https://github.com/roblabs/xcode-continuous-integration","last_synced_at":"2025-04-12T20:32:35.485Z","repository":{"id":136165440,"uuid":"296940156","full_name":"roblabs/xcode-continuous-integration","owner":"roblabs","description":"CI scripts for use in Xcode Continuous Integration *bots* 🤖.  Also useful for manual builds.","archived":true,"fork":false,"pushed_at":"2023-04-11T20:21:39.000Z","size":73,"stargazers_count":12,"open_issues_count":6,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-06T08:37:04.161Z","etag":null,"topics":["ci","continuous-integration","xcode","xcode-bots","xcode-server","xcs"],"latest_commit_sha":null,"homepage":"https://RobLabs.com/xcode","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/roblabs.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":"2020-09-19T19:44:39.000Z","updated_at":"2023-12-27T15:15:55.000Z","dependencies_parsed_at":null,"dependency_job_id":"4d35eb74-09e1-461d-af15-1dd064c053f2","html_url":"https://github.com/roblabs/xcode-continuous-integration","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roblabs%2Fxcode-continuous-integration","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roblabs%2Fxcode-continuous-integration/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roblabs%2Fxcode-continuous-integration/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roblabs%2Fxcode-continuous-integration/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/roblabs","download_url":"https://codeload.github.com/roblabs/xcode-continuous-integration/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248630201,"owners_count":21136392,"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":["ci","continuous-integration","xcode","xcode-bots","xcode-server","xcs"],"created_at":"2024-11-07T15:37:07.950Z","updated_at":"2025-04-12T20:32:35.464Z","avatar_url":"https://github.com/roblabs.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Xcode Server Bots 🤖 and Continuous Integration Guide\n\nGoal — ***one button Xcode builds*** with Xcode Server or `XCS`\n\nDo you have CI or *Continuous Integration* for your applications built with Xcode?  There are plenty to choose from and they have their advantages.  But consider Xcode Server *Bots* built directly into Xcode:  there is nothing to install and your project can be up and running in a matter of minutes.\n\nWe all want simple builds.  If you are able to check your code into a `git` repo, then it should be able to `git pull` and build in small number of steps.  If you can minimize the number of dependencies to be installed or to be `fetch`ed, then your builds will be more repeatable.  More repeatable; possibly better quality.  More repeatable; prime for automation with Xcode Server *Bots*.\n\nMany Open Source Xcode projects already have a CI architecture.  But if you want to learn the code or achieve ***one button Xcode builds***, then you would have to install or learn a new dependency.  Xcode Server Bots can still be used in this case.\n\nThe Xcode Server Bots documentation makes the compelling case to use Bots.  The documentation on [Continuous integration using Xcode Server](https://help.apple.com/xcode/mac/11.4/index.html?localePath=en.lproj#/dev466720061) from Apple is the best resource for setting up your Xcode Server Bots.\n\n\u003e In Xcode, continuous integration is the process of automating and streamlining the building, analyzing, testing, and archiving of your Mac and iOS apps, in order to ensure that they are always in a releasable state. [1]\n\u003e The goal of continuous integration is to improve software quality, and there are a number of ways this is achieved:\n\u003e * Catching problems quickly, easily, and early.\n\u003e * Enhancing collaboration.\n\u003e * Broadening test coverage.\n\u003e * Generating build and test statistics over time.\n\n* [1] : https://developer.apple.com/library/archive/documentation/IDEs/Conceptual/xcode_guide-continuous_integration/index.html\n* [2] : https://developer.apple.com/search/?q=xcode%20server\u0026type=Videos\n* [Xcode Server Environment Variable Reference](https://developer.apple.com/library/archive/documentation/IDEs/Conceptual/xcode_guide-continuous_integration/EnvironmentVariableReference.html)\n* [Xcode Server API Reference](https://developer.apple.com/library/archive/documentation/Xcode/Conceptual/XcodeServerAPIReference/Bots.html)\n* [Verify, reveal, and delete installed toolchains]: https://help.apple.com/xcode/mac/11.4/index.html?localePath=en.lproj#/dev128b6c856 \"Verify, reveal, and delete installed toolchains\"\n\nThis repo includes CI scripts for use in Xcode Continuous Integration *Bots*.  Also useful for manual builds.  Support for `carthage` for fetching binaries.  If you CocoaPods, you can still use this repo.  It's likely you can still use this as you will likely be using the CocoaPods `.xcworkspace`, which this can still be integrated into.\n\n#### Add as a `git submodule`\n\nAdd this repo as a `git submodule`.  The directory name it creates will be `xcode-continuous-integration` and the shell scripts will be in that directory.\n\n```\n# Add repo to the current directory\ngit submodule add https://github.com/roblabs/xcode-continuous-integration.git\n```\n\n#### In Xcode Schemes\n\n`Edit Scheme` \u003e `Build` \u003e `Pre-Actions` \u003e `Run Script` \u003e Add the following (assuming the proper path relative to your `${PROJECT_DIR}`)\n\n```\ncd ${PROJECT_DIR}\ngit submodule update --init --recursive\nwait\nsh ${PROJECT_DIR}/xcode-continuous-integration/ci.sh\n```\n\n---\n\n\u003cimg width=\"600\" alt=\"xcode-continuous-integration\" src=\"https://user-images.githubusercontent.com/118112/93690228-f4571500-fa8a-11ea-923f-bccb58ef8c50.png\"\u003e\n\n---\n\n#### In Xcode Server Bots\n\nLet's take the special case of building Mapbox GL Native for iOS.  See the `examples` folder for scripts for setting up `XCS` with\n\n* `mapbox-gl-native-ios`, versions \u003c= v5.9\n* `mapbox-gl-native-ios`, versions \u003e 6.0\n\n1.  The Git branch and Xcode scheme you want to test is very important, so check out a local copy to your development folder.  For example, set the branch you want and perform the initial step to make the Xcode Project.\n\n`mapbox-gl-native-ios`, versions \u003c= v5.9\n\n```\ngit clone --branch ios-v5.9.0 \\\n  https://github.com/mapbox/mapbox-gl-native-ios.git \\\n  tmp/mapbox-gl-native-ios\n\ncd tmp/mapbox-gl-native-ios\nmake iproj\n```\n\n`mapbox-gl-native-ios`, versions \u003e 6.0, or master\n\n```\ngit clone \\\n  https://github.com/mapbox/mapbox-gl-native-ios.git \\\n  tmp/mapbox-gl-native-ios\n\ncd tmp/mapbox-gl-native-ios\nmake iproj\n```\n\n2. The call to `make iproj` will automatically open the Xcode Project on your development Mac.\n\n\u003cimg width=\"238\" alt=\"xcs-ci\" src=\"https://user-images.githubusercontent.com/118112/94976840-13ae6300-04cb-11eb-8f5b-49c8fb5dce0d.png\"\u003e\n\n3. Change the Scheme to `CI`, which is already configured in the source for CI.  On your development Mac, choose `Product` \u003e `Create Bot`.\n4. Add Pre-Integration Triggers\n  1. `environment` - Git repo metadata \u0026 Build versions\n  1. project specific build commands - for your version of `mapbox-gl-native-ios`\n\n---\n\n### Example Data\n\n* Example Data is generated from a project that makes use of these scripts on GitHub, [roblabs / openmaptiles-ios-demo](https://github.com/roblabs/openmaptiles-ios-demo)\n\n\u003cdetails open\u003e\u003csummary\u003e Project \u0026 Development Environment `metadata` 🤖 \u003c/summary\u003e\n\n```\nSat Sep 19 13:35:34 PDT 2020\nPROJECT_DIR = /Users/roblabs/Documents/github/roblabs/openmaptiles-ios-demo/tmp/openmaptiles-ios-demo\ngitBranch = master\ngitSHA = aaa53c24cce044e2e2fbfc49b56bd83d825b969d\nCURRENT_PROJECT_VERSION = 0\nMARKETING_VERSION = 1.341.0\nDEVELOPMENT_TEAM = R7O3BWLEA8BS\nPREBUILD_LOG = /Users/roblabs/Documents/github/roblabs/openmaptiles-ios-demo/tmp/openmaptiles-ios-demo/prebuild.log\nProductName:\tMac OS X\nProductVersion:\t10.15.6\nBuildVersion:\t19G2021\nXcode 11.7\nBuild version 11E801a\n```\n\u003c/details\u003e\n\n---\n\n#### `XCS` Environment Variables\n\nIf built using Xcode Server *Bots*, then log several key `XCS_` environment variables.  See Apple's [Xcode Server Environment Variable Reference](https://developer.apple.com/library/archive/documentation/IDEs/Conceptual/xcode_guide-continuous_integration/EnvironmentVariableReference.html).\n\n\u003cdetails\u003e\u003csummary\u003e Example Xcode Server Environment Variables 🤖 \u003c/summary\u003e\n\n```\nXCS = 1\nXCS_BOT_NAME = OSM2VectorTiles Bot\nXCS_BOT_ID = drb3o4b067dec6e781b4976604a291\nXCS_BOT_TINY_ID = CB1D194\nXCS_INTEGRATION_ID = drb3o4b067dec6e781b4976604a291\nXCS_INTEGRATION_TINY_ID = R698E33\nXCS_INTEGRATION_NUMBER = 4\nXCS_INTEGRATION_RESULT = unknown\nXCS_SOURCE_DIR = /Users/roblabs/Library/Caches/XCSBuilder/Bots/drb3o4b067dec6e781b4976604a291/Source\nXCS_OUTPUT_DIR = /Users/roblabs/Library/Caches/XCSBuilder/Integration-drb3o4b067dec6e781b4976604a291\nXCS_DERIVED_DATA_DIR = /Users/roblabs/Library/Caches/XCSBuilder/Bots/drb3o4b067dec6e781b4976604a291/DerivedData\nXCS_XCODEBUILD_LOG = /Users/roblabs/Library/Caches/XCSBuilder/Integration-drb3o4b067dec6e781b4976604a291/xcodebuild.log\nINTEGRATION_URL = https://roblabs.local/xcode/bots/CB1D194/integrations/R698E33\n\n# Log data generated from this script:  ci.sh\nPREBUILD_LOG = /Users/roblabs/Library/Caches/XCSBuilder/Bots/drb3o4b067dec146e781b4976604a291/Source/openmaptiles-ios-demo/prebuild.RB1A194.4.log\n```\n\u003c/details\u003e\n\n---\n\n#### Xcode Server URLs\n\nYou can also log some interesting URL's from the [Xcode Server API Reference](https://developer.apple.com/library/archive/documentation/Xcode/Conceptual/XcodeServerAPIReference/Bots.html)\n\n\u003cdetails\u003e\u003csummary\u003e Example Xcode Server URLs 🤖 \u003c/summary\u003e\n\n```\nhttp://Bots JSON         = https://oldSanJuan.local:20343/api/bots\nhttp://bots/latest       = https://oldSanJuan.local/xcode/bots/latest\nhttp://latest this bot   = https://oldSanJuan.local/xcode/bots/latest/EC6DB3B\nhttp://Integration JSON  = https://oldSanJuan.local/xcode/internal/api/integrations/771613596b2cdb2a24eaa2108be1b1\nhttp://Download          = https://oldSanJuan.local/xcode/internal/api/integrations/771613596b2cdb2a24eaa2108be1b1/assets\nxcbot://See Bot in Xcode = xcbot://oldSanJuan.local/botID/dcb3a48067dec1e781b49766016a8f/integrationID/771613596b2cdb2a24eaa2108be1b1\n\n```\n\n\u003c/details\u003e\n\n---\n\n### `XCS` and the Build Number\n\nHow to add the `XCS` *integration* or build number into your Xcode project.\n\n  * XCS builds will automatically update the build number\n  * Example, If you are doing a non `XCS` build with the following values for current \u0026 marketing version then,\n      * The variable `${XCS_INTEGRATION_NUMBER}` will be `\"\"` or null.\n      * Local builds version will be `1.278.314` with a build number of `314`\n      * An example `XCS` build version for the **101** *st* build will be 1.278.314**101** with a build number of 314**101**.\n  * To acheive this, hand edit all instances in file `\u003cproject\u003e.xcodeproj/project.pbxproj`.  It is not possible to do this in Xcode directly.\n\n```\nCURRENT_PROJECT_VERSION = \"314${XCS_INTEGRATION_NUMBER}\";\nMARKETING_VERSION = \"1.278.314${XCS_INTEGRATION_NUMBER}\";\n```\n\n\n\u003cimg width=\"400\" alt=\"xcs-integration-number\" src=\"https://user-images.githubusercontent.com/118112/94976977-a51dd500-04cb-11eb-8bc4-34c7ca1df863.png\"\u003e\n\n\n---\n\n### `ExportOptions.plist`\n\nYou can use `XCS` with open source projects and apply your own signing credentials for deploying to devices in your local lab.  See the file `ExportOptions.plist`.\n\n* `Configuration` \u003e `Archive` \u003e `Use Custom Export Options Plist`\n\n\u003cimg width=\"709\" alt=\"use-custom-export-options-Plist\" src=\"https://user-images.githubusercontent.com/118112/94869729-c8c51a80-03fa-11eb-9f22-680f69c5d45b.png\"\u003e\n\n---\n\n*When you apply a proper `ExportOptions.plist`, then you can*\n* `Install on device...`\n* `Show in Organizer...`\n\n![product-archive](https://user-images.githubusercontent.com/118112/94870250-f6f72a00-03fb-11eb-8aa0-ad638d35e0cd.gif)\n\n---\n\n*Viewing `ExportOptions.plist` in Xcode*\n\n\u003cimg width=\"422\" alt=\"export-options plist-in-xcode\" src=\"https://user-images.githubusercontent.com/118112/94869758-d4184600-03fa-11eb-9537-334723ca3955.png\"\u003e\n\n#### Documentation\n\nDocumentation for the Export Options can be found by typing:\n\n`xcodebuild -h`\n\nHere are some of those settings after running the online documentation for these settings.  You can review Apple [Technical Note TN2339](https://developer.apple.com/library/archive/technotes/tn2339/_index.html#//apple_ref/doc/uid/DTS40014588-CH1-WHAT_KEYS_CAN_I_PASS_TO_THE_EXPORTOPTIONSPLIST_FLAG_) for more information.\n\n`destination` : String\n\u003e\tDetermines whether the app is exported locally or uploaded to Apple. Options are `export` or `upload`. The available options vary based on the selected distribution method. Defaults to `export`.\n\n`method` : String\n\u003e\tDescribes how Xcode should export the archive. Available options: `app-store`, `validation`, `ad-hoc`, `package`, `enterprise`, `development`, `developer-id`, and `mac-application`. The list of options varies based on the type of archive. Defaults to `development`.\n\n`signingStyle` : String\n\u003e\tThe signing style to use when re-signing the app for distribution. Options are `manual` or `automatic`. Apps that were automatically signed when archived can be signed manually or automatically during distribution, and default to automatic. Apps that were manually signed when archived must be manually signed during distribution, so the value of signingStyle is ignored.\n\n`stripSwiftSymbols` : Bool\n\u003e\tShould symbols be stripped from Swift libraries in your IPA? Defaults to YES.\n\n`teamID` : String\n\u003e\tThe Developer Portal team to use for this export. Defaults to the team used to build the archive.\n\n`uploadBitcode` : Bool\n\u003e\tFor App Store exports, should the package include bitcode? Defaults to YES.\n\n`uploadSymbols` : Bool\n\u003e\tFor App Store exports, should the package include symbols? Defaults to YES.\n\n\n\u003c!--\n\n# script to add integration number into build\n    # https://stackoverflow.com/a/25958498\n    # Simply set the Build number to ${XCS_INTEGRATION_NUMBER} in your project settings.\n\n    # https://stackoverflow.com/a/51957227/388210\n    # In Xcode 9 server, submodules are not initialized\n    # if none of the files of the submodules is referenced by one of the Xcode projects in the workspace.\n    # A possible workaround is to add at least one file from the submodule to the Xcode project.\n    #It can even be a Readme.md file.\n\n--\u003e\n\n\u003c!--\n\n``` bash\nsystem_profiler -json SPDeveloperToolsDataType\n\n\nsystem_profiler -listDataTypes\nsystem_profiler SPPrintersDataType\nsystem_profiler SPApplicationsDataType | grep Info\nsystem_profiler SPNetworkDataType\n#system_profiler SPEthernetDataType\n#system_profiler SPFrameworksDataType\n#system_profiler SPPrintersSoftwareDataType\n#system_profiler SPAirPortDataType\n```\n\n---\n\n* https://developer.apple.com/library/archive/documentation/Xcode/Conceptual/XcodeServerAPIReference/Schema.html\n```bash\nwget --no-check-certificate https://oldsanjuan.local:20343/api/bots -O tmp/bots.json\ncat tmp/bots.json | json \u003e tmp/bots.pretty.json\n\n# Get the first result\ncat tmp/bots.json | json results.0\n\n# Scheme name\n#             The name of the scheme used to integrate.\ncat tmp/bots.json | json results.0.configuration.schemeName\n\n# Built from clean\n#             0: Never\n#             1: Always\n#             2: Once a day\n#             3: Once a week\ncat tmp/bots.json | json results.0.configuration.builtFromClean\n\n# Configuration\n#             Value: \"Debug\" | \"Release\" | \"XXX\" \u003c- we need to set the value because if exists already,\n#             devs cannot remove it (there is no support for it)\ncat tmp/bots.json | json results.0.configuration.buildConfiguration\n\ncat tmp/bots.json | json results.0.configuration.buildEnvironmentVariables\ncat tmp/bots.json | json results.0.configuration.additionalBuildArguments\n\n# Performs analyze action\n#             Value: true | false\ncat tmp/bots.json | json results.0.configuration.performsAnalyzeAction\n\n# Performs test action\n#             Value: true | false\ncat tmp/bots.json | json results.0.configuration.performsTestAction\ncat tmp/bots.json | json results.0.configuration.useParallelDeviceTesting\ncat tmp/bots.json | json results.0.configuration.exportsProductFromArchive\ncat tmp/bots.json | json results.0.configuration.codeCoveragePreference\n\n# Schedule type:\n#             1: Periodically\n#             2: On commit\n#             3: Manual\ncat tmp/bots.json | json results.0.configuration.scheduleType\n# Periodic schedule\n#             1: Hourly\n#             2: Daily\n#             3: Weekly\n#        Dependencies:\n#              - 'scheduleType' set to 1 (Periodically)\ncat tmp/bots.json | json results.0.configuration.periodicScheduleInterval\n\n# Blueprint\ncat tmp/bots.json | json results.0.configuration.sourceControlBlueprint\n\n# Git Remote Repository URL\ncat tmp/bots.json | json results.0.configuration.sourceControlBlueprint.DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey.0.DVTSourceContro\nlWorkspaceBlueprintRemoteRepositoryURLKey\n\n# The name for the blueprint, typically the name of the Xcode project or workspace\n#           Value: string\ncat tmp/bots.json | json results.0.configuration.sourceControlBlueprint.DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey.0.DVTSourceControlWorkspaceBlueprintNameKey\n\n# Name\n#  Integration number - This number dictates the number that the next integration will be set to.\ncat tmp/bots.json | json results.0.name\ncat tmp/bots.json | json results.0.integration_counter\ncat tmp/bots.json | json results.0.tinyID\ncat tmp/bots.json | json results.0.type\ncat tmp/bots.json | json results.0._id  # 5aad0a28b449aa1209c98dac7a16f26c\ncat tmp/bots.json | json results.0.doc_type\n\n# triggers name: string (title of the script)\ncat tmp/bots.json | json results.0.configuration.triggers.0\ncat tmp/bots.json | json results.0.configuration.triggers.0.name\n\n# phase: 1 (Before) | 2 (After)\ncat tmp/bots.json | json results.0.configuration.triggers.0.phase\n\n# scriptBody: string (script)\ncat tmp/bots.json | json results.0.configuration.triggers.0.scriptBody\n```\n\ndata:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNy4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI%2BDQo8c3ZnIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCA3MCA3MCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNzAgNzAiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGcgaWQ9ImJnIj4NCjwvZz4NCjxnIGlkPSJMYXllcl8yIj4NCgk8cGF0aCBmaWxsPSIjQzNDM0MzIiBkPSJNMzUsNy4wNzFMNjIuOTI5LDM1TDM1LDYyLjkyOUw3LjA3MSwzNUwzNSw3LjA3MSBNMzUsMEwwLDM1bDM1LDM1bDM1LTM1TDM1LDBMMzUsMHoiLz4NCgk8bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiNDM0MzQzMiIHN0cm9rZS13aWR0aD0iNSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiB4MT0iMjIuNDk5IiB5MT0iMzUiIHgyPSI0Ny40OTkiIHkyPSIzNSIvPg0KPC9nPg0KPC9zdmc%2BDQo%3D\n\n---\n\n## integrations\n\n* https://oldSanJuan.local:20343/api/integrations/\n* https://oldSanJuan.local:20343/api/integrations/\u003c\u003c\u003cid\u003e\u003e\u003e/assets\n* https://oldSanJuan.local:20343/api/integrations/\u003c\u003c\u003cid\u003e\u003e\u003e/assets/74e3b5355373cf034a1e4eeaa700a886-MapKit-starter Bot/12/sourceControl.log\n\n```bash\nwget --no-check-certificate https://oldSanJuan.local:20343/api/integrations -O tmp/integrations.json\n```\n--\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froblabs%2Fxcode-continuous-integration","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Froblabs%2Fxcode-continuous-integration","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froblabs%2Fxcode-continuous-integration/lists"}