{"id":42201,"date":"2019-03-18T00:00:00","date_gmt":"2019-03-17T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane"},"modified":"2020-02-18T13:45:01","modified_gmt":"2020-02-18T10:45:01","slug":"publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","title":{"rendered":"Wir ver\u00f6ffentlichen iOS-Anwendungen im App Store mit GitLab und fastlane.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Wir ver\u00f6ffentlichen iOS-Anwendungen im App Store mit GitLab und fastlane.\" src=\"\/wp-content\/uploads\/2019\/03\/a82a2584dfa78743d9e91e399939061f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wie GitLab mit fastlane Anwendungen f\u00fcr iOS im App Store erstellt, signiert und ver\u00f6ffentlicht.<\/p>\n<p><\/p>\n<p>K\u00fcrzlich hatten wir einen <noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/2019\/01\/28\/android-publishing-with-gitlab-and-fastlane\/\">Beitrag dar\u00fcber, wie man schnell eine Android-Anwendung<\/a><\/noindex> mit GitLab und <noindex><a rel=\"nofollow\" href=\"https:\/\/fastlane.tools\/\">fastlane<\/a><\/noindex>. Hier sehen wir, wie man eine iOS-Anwendung erstellt und sie in TestFlight ver\u00f6ffentlicht. Schaut euch an, wie cool <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=325FyJt7ZG8\">ich eine \u00c4nderung auf dem iPad Pro mit GitLab Web IDE vornehme<\/a><\/noindex>, eine Build erstelle und das Update der Testversion der App auf demselben iPad Pro erhalte, auf dem ich sie entwickelt habe.<\/p>\n<p><\/p>\n<p>Hier verwenden wir <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">eine einfache iOS-Anwendung in Swift<\/a><\/noindex>, mit der ich ein Video aufgenommen habe.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"para-slov-o-konfiguracii-apple-store\">Ein paar Worte zur Konfiguration des Apple Stores<\/h3>\n<p><\/p>\n<p>Wir ben\u00f6tigen eine App im App Store, Vertriebszertifikate und ein Provisioning-Profil, um alles miteinander zu verkn\u00fcpfen.<\/p>\n<p><\/p>\n<p>Das Schwierigste hierbei ist, die Signaturrechte im App Store einzurichten. Ich hoffe, dass ihr das selbst hinbekommt. Wenn ihr neu seid, werde ich die n\u00f6tige Richtung angeben, aber hier wollen wir nicht \u00fcber die Feinheiten des Umgangs mit Apple-Zertifikaten sprechen, da sich diese st\u00e4ndig \u00e4ndern. Dieser Beitrag soll euch den Einstieg erleichtern.<\/p>\n<p><\/p>\n<h3 id=\"moi-prilozheniya\">Meine Anwendungen<\/h3>\n<p><\/p>\n<p>Ihr ben\u00f6tigt eine App im App Store Connect, damit ihr eine ID f\u00fcr die Konfiguration habt <code>.xcodebuild<\/code>. Das Profil und die App-ID verbinden die Code-Builds, Preise und Verf\u00fcgbarkeit sowie die TestFlight-Konfiguration f\u00fcr die Verbreitung von Testanwendungen an Benutzer. Macht keine \u00f6ffentliche Testphase, es reicht aus, die private zu verwenden, wenn ihr eine kleine Gruppe habt, die Einrichtung einfach ist und keine weiteren Genehmigungen von Apple ben\u00f6tigt werden.<\/p>\n<p><\/p>\n<h3 id=\"profil-inicializacii\">Provisioning-Profil<\/h3>\n<p><\/p>\n<p>Neben der App-Einrichtung ben\u00f6tigt ihr Vertriebs- und Entwicklungs-Keys f\u00fcr iOS, die im Bereich Certificates, Identifiers &amp; Profiles in der Apple Developer Console erstellt wurden. Alle diese Zertifikate k\u00f6nnen in einem Provisioning-Profil zusammengefasst werden.<\/p>\n<p><\/p>\n<p>Benutzer, die sich authentifizieren wollen, ben\u00f6tigen die M\u00f6glichkeit, Zertifikate zu erstellen, sonst seht ihr bei den Schritten <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert und sigh<\/a><\/noindex> einen Fehler.<\/p>\n<p><\/p>\n<h3 id=\"drugie-varianty\">Weitere Optionen<\/h3>\n<p><\/p>\n<p>Neben dieser einfachen Methode gibt es auch andere M\u00f6glichkeiten, die Zertifikate und Profile einzurichten. Wenn ihr also anders arbeitet, m\u00fcsst ihr m\u00f6glicherweise umdenken. Am wichtigsten ist, dass ihr eine Konfiguration ben\u00f6tigt, <code>.xcodebuild<\/code>, die auf die erforderlichen Dateien verweist, und der Schl\u00fcsselbund muss auf dem Build-PC f\u00fcr den Benutzer, unter dessen Namen der Runner l\u00e4uft, zug\u00e4nglich sein. F\u00fcr die digitale Signatur verwenden wir fastlane, und falls es Probleme gibt oder ihr mehr wissen m\u00f6chtet, untersucht deren ausf\u00fchrliche <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/\">Dokumentation zu digitalen Signaturen<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>In diesem Beispiel verwende ich den Ansatz <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert und sigh<\/a><\/noindex>, aber f\u00fcr die praktische Anwendung ist wahrscheinlich besser geeignet <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-match\">match<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h2 id=\"podgotovka-gitlab-i-fastlane\">Vorbereitung von GitLab und fastlane<\/h2>\n<p><\/p>\n<h3 id=\"podgotovka-ci-runner\">Vorbereitung des CI-Runners<\/h3>\n<p><\/p>\n<p>Nachdem alle diese Daten gesammelt sind, fahren wir mit der Konfiguration des GitLab-Runners auf dem MacOS-Ger\u00e4t fort. Leider ist die Entwicklung von iOS-Anwendungen tats\u00e4chlich nur auf MacOS m\u00f6glich. Aber alles kann sich \u00e4ndern, und wenn Sie auf Fortschritte in diesem Bereich warten, - folgen Sie den Projekten wie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/xcbuild\">xcbuild<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/saucelabs\/isign\">isign<\/a><\/noindex>, und unserer internen Aufgabe <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-org\/gitlab-ce\/issues\/57576\">gitlab-ce#57576<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Die Konfiguration des Runners ist sehr einfach. Befolgen Sie die aktuellen <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/install\/osx.html\">Anweisungen zur Konfiguration von GitLab Runner in macOS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Hinweis. Der Runner muss das ausf\u00fchrbare Programm <code>shell<\/code>verwenden. Das ist notwendig, um iOS in macOS zu bauen, um direkt als Benutzer zu arbeiten und nicht \u00fcber Container. Wenn Sie <code>shell<\/code>, erfolgt der Build und die Tests im Namen des Runner-Benutzers, direkt auf dem Build-Host. Das ist nicht so sicher wie Container, also scrollen Sie besser durch die <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/security\/#usage-of-shell-executor\">Sicherheitsdokumentation<\/a><\/noindex>, um nichts zu verpassen.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">sudo curl --output \/usr\/local\/bin\/gitlab-runner https:\/\/gitlab-runner-downloads.s3.amazonaws.com\/latest\/binaries\/gitlab-runner-darwin-amd64\nsudo chmod +x \/usr\/local\/bin\/gitlab-runner\ncd ~\ngitlab-runner install\ngitlab-runner start<\/code><\/pre>\n<p><\/p>\n<p>Die Apple Keychain muss auf diesem Host mit Zugriff auf die Schl\u00fcssel konfiguriert sein, die Xcode f\u00fcr den Build ben\u00f6tigt. Der einfachste Weg, dies zu testen, besteht darin, sich als Benutzer anzumelden, der den Build ausf\u00fchrt, und zu versuchen, den Build manuell durchzuf\u00fchren. Wenn das System nach dem Zugriff auf die Schl\u00fcsselbund fragt, w\u00e4hlen Sie \"Immer erlauben\", damit CI funktioniert. Es k\u00f6nnte sinnvoll sein, sich anzumelden und die ersten paar Pipelines zu beobachten, um sicherzustellen, dass sie nicht mehr nach der Schl\u00fcsselbund fragen. Das Problem ist, dass Apple uns die Arbeit im automatischen Modus nicht erleichtert, aber sobald Sie es eingerichtet haben, wird alles gut sein.<\/p>\n<p><\/p>\n<h3 id=\"fastlane-init\">fastlane init<\/h3>\n<p><\/p>\n<p>Um fastlane im Projekt zu verwenden, starten Sie <code>fastlane init<\/code>. Folgen Sie einfach den <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/\">Installations- und Startanweisungen f\u00fcr fastlane<\/a><\/noindex>, insbesondere im Abschnitt \u00fcber <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#use-a-gemfile\">Gemfile<\/a><\/noindex>, denn wir ben\u00f6tigen einen schnellen und vorhersehbaren Start \u00fcber die CI-Pipeline.<\/p>\n<p><\/p>\n<p>F\u00fchren Sie diese Befehle im Projektverzeichnis aus:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">xcode-select --install\nsudo gem install fastlane -NV\n# Alternativ mit Homebrew\n# brew cask install fastlane\nfastlane init<\/code><\/pre>\n<p><\/p>\n<p>fastlane wird nach einer grundlegenden Konfiguration fragen und dann im Projekt einen Ordner fastlane mit drei Dateien erstellen:<\/p>\n<p><\/p>\n<p><strong><code>1. fastlane\/Appfile<\/code><\/strong><\/p>\n<p><\/p>\n<p>Hier gibt es nichts Schwieriges. \u00dcberpr\u00fcfen Sie einfach, ob die Apple ID und die App-ID korrekt angegeben sind.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">app_identifier(\"com.vontrance.flappybird\") # Die Bundle-ID Ihrer App\napple_id(\"your-email@your-domain.com\") # Ihre Apple-E-Mail-Adresse<\/code><\/pre>\n<p><\/p>\n<p><strong><code>2. fastlane\/Fastfile<\/code><\/strong><\/p>\n<p><\/p>\n<p><code>Fastfile<\/code> definiert die Schritte zum Build. Wir verwenden viele der integrierten Funktionen von fastlane, daher ist alles hier ebenfalls klar. Wir erstellen eine Zeile, die Zertifikate abruft, den Build ausf\u00fchrt und ihn in TestFlight hochl\u00e4dt. Sie k\u00f6nnen diesen Prozess auf verschiedene Aufgaben aufteilen, wenn n\u00f6tig. Alle diese Operationen (<code>get_certificates<\/code>, <code>get_provisioning_profile<\/code>, <code>gym<\/code> und <code>upload_to_testflight<\/code>) sind bereits in fastlane enthalten.<\/p>\n<p><\/p>\n<p>Aktionen <code>get_certificates<\/code> und <code>get_provisioning_profile<\/code> sind mit dem Signaturansatz verbunden <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert und sigh<\/a><\/noindex>. Wenn Sie <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-match\">match<\/a><\/noindex> oder etwas anderes verwenden, bringen Sie \u00c4nderungen ein.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">default_platform(:ios)\n\nplatform :ios do\n  desc \"Bauen der Anwendung\"\n  lane :flappybuild do\n    get_certificates\n    get_provisioning_profile\n    gym\n    upload_to_testflight\n  end\nend<\/code><\/pre>\n<p><\/p>\n<p><strong><code>3. fastlane\/Gymfile<\/code><\/strong><\/p>\n<p><\/p>\n<p>Dies ist eine optionale Datei, aber ich habe sie manuell erstellt, um das Standard-Ausgabeverzeichnis zu \u00e4ndern und die Ausgaben in den aktuellen Ordner zu legen. Das vereinfacht CI. Wenn Sie interessiert sind, lesen Sie \u00fcber <code>gym<\/code> und seine Parameter in <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/actions\/gym\/\">Dokumentation<\/a><\/noindex>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">https:\/\/docs.fastlane.tools\/actions\/gym\/<\/code><\/pre>\n<p><\/p>\n<p>Unser <strong><code>.gitlab-ci.yml<\/code><\/strong><\/p>\n<p><\/p>\n<p>Also haben wir einen CI-Runner f\u00fcr das Projekt und sind bereit, die Pipeline zu testen. Sehen wir, was wir in <code>.gitlab-ci.yml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">stages:\n  - build\n\nvariables:\n  LC_ALL: \"en_US.UTF-8\"\n  LANG: \"en_US.UTF-8\"\n  GIT_STRATEGY: clone\n\nbuild:\n  stage: build\n  script:\n    - bundle install\n    - bundle exec fastlane flappybuild\n  artifacts:\n    paths:\n    - .\/FlappyBird.ipa<\/code><\/pre>\n<p><\/p>\n<p>Alles l\u00e4uft hervorragend! <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#set-up-environment-variables\">Wir setzen das UTF-8-Format f\u00fcr fastlane, wie erforderlich<\/a><\/noindex>, verwenden eine Strategie <code>clone<\/code> mit der ausf\u00fchrbaren Datei <code>shell<\/code>, damit wir einen sauberen Arbeitsbereich f\u00fcr jeden Build haben, und rufen einfach <code>flappybuild<\/code> fastlane auf, wie oben zu sehen ist. Am Ende erhalten wir den Build, die Signatur und das Deployment des letzten Builds in TestFlight.<\/p>\n<p><\/p>\n<p>Au\u00dferdem erhalten wir das Artefakt und speichern es mit dem Build. Beachten Sie, dass das Format <code>.ipa<\/code> \u2014 das ein signiertes ARM-Ausf\u00fchrungsfile ist, das im Simulator nicht gestartet werden kann. Wenn Sie Ausgaben f\u00fcr den Simulator m\u00f6chten, f\u00fcgen Sie einfach ein Build-Target hinzu, das es erstellt, und schlie\u00dfen Sie es dann im Artefaktpfad ein.<\/p>\n<p><\/p>\n<h3 id=\"drugie-peremennye-sredy\">Andere Umgebungsvariablen<\/h3>\n<p><\/p>\n<p>Hier gibt es ein paar Umgebungsvariablen, auf denen alles basiert.<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD<\/code><\/strong> und <strong><code>FASTLANE_SESSION<\/code><\/strong><\/p>\n<p><\/p>\n<p>F\u00fcr die Authentifizierung im App Store und den Upload in TestFlight ben\u00f6tigt fastlane eine Authentifizierung. Erstellen Sie daf\u00fcr ein Anwendungskennwort, das in CI verwendet wird. Einzelheiten <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#use-of-application-specific-passwords-and-spaceauth\">hier<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Wenn Sie die Zwei-Faktor-Authentifizierung haben, erstellen Sie eine Variable <code>FASTLANE_SESSION<\/code> (Anweisungen dort ebenfalls).<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_USER<\/code><\/strong> und <strong><code>FASTLANE_PASSWORD<\/code><\/strong><\/p>\n<p><\/p>\n<p>Um <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert und sigh<\/a><\/noindex> haben das Initialisierungsprofil und die Zertifikate auf Anfrage abgerufen, m\u00fcssen Sie Variablen angeben <code>FASTLANE_USER<\/code> und <code>FASTLANE_PASSWORD<\/code>. Einzelheiten <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#environment-variables-to-set\">hier<\/a><\/noindex>. Dies ist nicht erforderlich, wenn Sie eine andere Signaturmethode verwenden.<\/p>\n<p><\/p>\n<h3 id=\"v-zaklyuchenie\">Abschlie\u00dfend<\/h3>\n<p><\/p>\n<p>Schau dir an, wie das alles funktioniert <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">in meinem einfachen Beispiel<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Ich hoffe, das war hilfreich und ich konnte euch inspirieren, mit den iOS-Builds im GitLab-Projekt zu arbeiten. Hier sind noch <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/\">Tipps zu CI<\/a><\/noindex> f\u00fcr fastlane, falls ihr es verwenden m\u00f6chtet. <code>CI_BUILD_ID<\/code> (f\u00fcr inkrementelle Builds), um <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/gitlab\/#auto-incremented-build-number\">die Version automatisch zu inkrementieren.<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Eine weitere coole Funktion von fastlane ist <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/screenshots\/\">automatische Screenshots<\/a><\/noindex> f\u00fcr den App Store, die sehr einfach einzurichten sind.<\/p>\n<p><\/p>\n<p>Teilt eure Erfahrungen in den Kommentaren und gebt Ideen zur Verbesserung von GitLab f\u00fcr die Entwicklung von iOS-Anwendungen bekannt.<\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/444170\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u043a GitLab \u0441 fastlane \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442, \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f iOS \u0432 App Store. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b \u043f\u043e\u0441\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Android \u0441 GitLab \u0438 fastlane. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 iOS \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 TestFlight. \u0417\u0430\u0446\u0435\u043d\u0438\u0442\u0435, \u043a\u0430\u043a \u043a\u0440\u0443\u0442\u043e \u044f \u0432\u043d\u043e\u0448\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 iPad Pro [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":42202,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-42201","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041a\u0430\u043a GitLab \u0441 fastlane.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f iOS \u0432 App Store \u0441 GitLab \u0438 fastlane | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u0430\u043a GitLab \u0441 fastlane.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-03-17T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T10:45:01+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Ver\u00f6ffentlichen von iOS-Anwendungen im App Store mit GitLab und fastlane | ProHoster","description":"Wie GitLab mit fastlane.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f iOS \u0432 App Store \u0441 GitLab \u0438 fastlane | ProHoster","og:description":"\u041a\u0430\u043a GitLab \u0441 fastlane.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-03-17T21:00:00+00:00","article:modified_time":"2020-02-18T10:45:01+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"42201","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 07:36:23","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:23:50","updated":"2026-01-22 07:36:23","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/42201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=42201"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/42201\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/42202"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=42201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=42201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=42201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}