{"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\/fr\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","title":{"rendered":"Nous publions des applications iOS dans l'App Store avec GitLab et fastlane","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Nous publions des applications iOS dans l&#039;App Store avec GitLab et fastlane\" src=\"\/wp-content\/uploads\/2019\/03\/a82a2584dfa78743d9e91e399939061f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Comment GitLab et fastlane construisent, signent et publient des applications iOS sur l'App Store.<\/p>\n<p><\/p>\n<p>R\u00e9cemment, nous avons eu un <noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/2019\/01\/28\/android-publishing-with-gitlab-and-fastlane\/\">article sur la fa\u00e7on de construire et de lancer rapidement une application Android<\/a><\/noindex> avec GitLab et <noindex><a rel=\"nofollow\" href=\"https:\/\/fastlane.tools\/\">fastlane.<\/a><\/noindex>Ici, nous verrons comment construire et lancer une application iOS et la publier sur TestFlight. D\u00e9couvrez \u00e0 quel point c'est g\u00e9nial. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=325FyJt7ZG8\">J'apporte une modification sur l'iPad Pro avec GitLab Web IDE<\/a><\/noindex>, je prends le build et obtiens la mise \u00e0 jour de la version beta de l'application sur le m\u00eame iPad Pro o\u00f9 je l'ai d\u00e9velopp\u00e9e.<\/p>\n<p><\/p>\n<p>Ici, nous prendrons <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">une simple application iOS en Swift<\/a><\/noindex>, avec laquelle j'ai enregistr\u00e9 une vid\u00e9o.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"para-slov-o-konfiguracii-apple-store\">Quelques mots sur la configuration de l'Apple Store<\/h3>\n<p><\/p>\n<p>Nous aurons besoin d'une application dans l'App Store, de certificats de distribution et d'un profil d'approvisionnement pour tout relier.<\/p>\n<p><\/p>\n<p>Le plus difficile ici est de configurer les droits de signature dans l'App Store. J'esp\u00e8re que vous pourrez vous d\u00e9brouiller. Si vous \u00eates d\u00e9butant, je vous indiquerai la bonne direction, mais nous ne parlerons pas ici des subtilit\u00e9s de gestion des certificats Apple, qui changent constamment. Cet article vous aidera \u00e0 d\u00e9marrer.<\/p>\n<p><\/p>\n<h3 id=\"moi-prilozheniya\">Mes applications<\/h3>\n<p><\/p>\n<p>Vous aurez besoin d'une application dans App Store Connect pour avoir un ID pour la configuration <code>.xcodebuild.<\/code>Le profil et l'ID de l'application relient les builds de code, les prix et la disponibilit\u00e9, ainsi que la configuration de TestFlight pour la distribution des applications beta aux utilisateurs. Ne faites pas de test public ; un test priv\u00e9 suffira si vous avez un petit groupe, une configuration simple et pas besoin d'autorisations suppl\u00e9mentaires d'Apple.<\/p>\n<p><\/p>\n<h3 id=\"profil-inicializacii\">Profil d'approvisionnement<\/h3>\n<p><\/p>\n<p>En plus de la configuration de l'application, vous aurez besoin de cl\u00e9s de distribution et de d\u00e9veloppement iOS, cr\u00e9\u00e9es dans la section Certificates, Identifiers &amp; Profiles dans la console Apple Developer. Tous ces certificats peuvent \u00eatre combin\u00e9s dans un profil d'approvisionnement.<\/p>\n<p><\/p>\n<p>Les utilisateurs qui doivent s'authentifier ont besoin de la possibilit\u00e9 de cr\u00e9er des certificats, sinon, aux \u00e9tapes <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert et sigh<\/a><\/noindex> vous verrez une erreur.<\/p>\n<p><\/p>\n<h3 id=\"drugie-varianty\">Autres options<\/h3>\n<p><\/p>\n<p>En plus de cette m\u00e9thode simple, il existe d'autres fa\u00e7ons de configurer des certificats et des profils. Donc, si vous travaillez diff\u00e9remment, il se peut que vous deviez vous r\u00e9organiser. L'essentiel est que vous aurez besoin d'une configuration <code>.xcodebuild.<\/code>, qui pointera vers les fichiers n\u00e9cessaires, et le trousseau doit \u00eatre disponible sur l'ordinateur de construction pour l'utilisateur sous le nom duquel le runner fonctionne. Pour la signature num\u00e9rique, nous utilisons fastlane, et s'il y a des probl\u00e8mes ou si vous voulez en savoir plus, consultez leurs d\u00e9tails. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/\">documentation sur les signatures \u00e9lectroniques<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Dans cet exemple, j'utilise une approche <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert et sigh<\/a><\/noindex>, mais pour une application r\u00e9elle, il serait probablement pr\u00e9f\u00e9rable d'utiliser <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\">Pr\u00e9paration de GitLab et fastlane<\/h2>\n<p><\/p>\n<h3 id=\"podgotovka-ci-runner\">Pr\u00e9paration du CI Runner<\/h3>\n<p><\/p>\n<p>Apr\u00e8s avoir rassembl\u00e9 toutes ces donn\u00e9es, nous passons \u00e0 la configuration du GitLab Runner sur un appareil MacOS. Malheureusement, il est r\u00e9ellement possible de cr\u00e9er des applications iOS uniquement sur MacOS. Mais tout peut changer, et si vous attendez des avanc\u00e9es dans ce domaine, suivez les projets comme <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/xcbuild\">xcbuild<\/a><\/noindex> et <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/saucelabs\/isign\">isign<\/a><\/noindex>, et notre t\u00e2che interne <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>Configurer le runner est tr\u00e8s simple. Suivez les <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/install\/osx.html\">instructions actuelles pour configurer GitLab Runner sur macOS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Remarque. Le runner doit utiliser le programme ex\u00e9cutable <code>shell<\/code>. C'est indispensable pour la construction d'iOS sur macOS, afin de fonctionner directement en tant qu'utilisateur, et non via des conteneurs. Si vous utilisez <code>shell<\/code>, la construction et les tests sont ex\u00e9cut\u00e9s au nom de l'utilisateur du runner, directement sur l'h\u00f4te de construction. Ce n'est pas aussi s\u00fbr que les conteneurs, donc il vaut mieux v\u00e9rifier <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/security\/#usage-of-shell-executor\">la documentation sur la s\u00e9curit\u00e9<\/a><\/noindex>, pour ne rien manquer.<\/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>Le trousseau Apple doit \u00eatre configur\u00e9 sur cet h\u00f4te avec acc\u00e8s aux cl\u00e9s n\u00e9cessaires pour Xcode afin de construire. La mani\u00e8re la plus simple de tester cela est de se connecter en tant qu'utilisateur qui ex\u00e9cutera la build et d'essayer d'effectuer la construction manuellement. Si le syst\u00e8me demande l'acc\u00e8s au trousseau, choisissez \u00ab Toujours autoriser \u00bb pour que le CI fonctionne. Il peut \u00eatre judicieux de se connecter et d'observer les premi\u00e8res paires de pipelines, pour s'assurer qu'ils ne demandent plus de trousseau. Le probl\u00e8me est qu'Apple ne nous facilite pas le travail avec le mode automatique, mais une fois que vous l'avez configur\u00e9, tout ira bien.<\/p>\n<p><\/p>\n<h3 id=\"fastlane-init\">fastlane init<\/h3>\n<p><\/p>\n<p>Pour utiliser fastlane dans le projet, lancez <code>fastlane init<\/code>. Suivez simplement les <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/\">instructions d'installation et de d\u00e9marrage de fastlane<\/a><\/noindex>, en particulier la section sur <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#use-a-gemfile\">Gemfile<\/a><\/noindex>, car nous avons besoin d'un d\u00e9marrage rapide et pr\u00e9visible \u00e0 travers le pipeline CI automatique.<\/p>\n<p><\/p>\n<p>Dans le r\u00e9pertoire du projet, ex\u00e9cutez ces commandes :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">xcode-select --install\nsudo gem install fastlane -NV\n# Alternativement, en utilisant Homebrew\n# brew cask install fastlane\nfastlane init<\/code><\/pre>\n<p><\/p>\n<p>fastlane demandera une configuration de base, puis cr\u00e9era un dossier fastlane dans le projet avec trois fichiers :<\/p>\n<p><\/p>\n<p><strong><code>1. fastlane\/Appfile<\/code><\/strong><\/p>\n<p><\/p>\n<p>Il n'y a rien de compliqu\u00e9 ici. V\u00e9rifiez simplement que l'Apple ID et l'ID de l'application sont correctement renseign\u00e9s.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">app_identifier(\"com.vontrance.flappybird\") # L'identifiant de bundle de votre application\napple_id(\"your-email@your-domain.com\") # Votre adresse email Apple<\/code><\/pre>\n<p><\/p>\n<p><strong><code>2. fastlane\/Fastfile<\/code><\/strong><\/p>\n<p><\/p>\n<p><code>Fastfile<\/code> d\u00e9finit les \u00e9tapes de construction. Nous utilisons beaucoup de fonctionnalit\u00e9s int\u00e9gr\u00e9es de fastlane, donc tout est clair ici. Nous cr\u00e9ons une ligne qui obtient les certificats, ex\u00e9cute la construction et la t\u00e9l\u00e9charge sur TestFlight. Vous pouvez diviser ce processus en diff\u00e9rentes t\u00e2ches si n\u00e9cessaire. Toutes ces op\u00e9rations (<code>get_certificates<\/code>, <code>get_provisioning_profile<\/code>, <code>gym<\/code> et <code>upload_to_testflight<\/code>) sont d\u00e9j\u00e0 incluses dans fastlane.<\/p>\n<p><\/p>\n<p>Actions <code>get_certificates<\/code> et <code>get_provisioning_profile<\/code> sont li\u00e9es \u00e0 l'approche de signature <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert et sigh<\/a><\/noindex>. Si vous utilisez <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-match\">match<\/a><\/noindex> ou autre chose, faites les modifications.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">default_platform(:ios)\n\nplatform :ios do\n  desc \"Construire l'application\"\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>C'est un fichier optionnel, mais je l'ai cr\u00e9\u00e9 manuellement pour changer le r\u00e9pertoire de sortie par d\u00e9faut et placer la sortie dans le dossier actuel. Cela simplifie le CI. Si vous \u00eates int\u00e9ress\u00e9, lisez \u00e0 propos de <code>gym<\/code> et de ses param\u00e8tres dans <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/actions\/gym\/\">documentation<\/a><\/noindex>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">https:\/\/docs.fastlane.tools\/actions\/gym\/<\/code><\/pre>\n<p><\/p>\n<p>Notre <strong><code>.gitlab-ci.yml<\/code><\/strong><\/p>\n<p><\/p>\n<p>Donc, nous avons un CI-runner pour le projet, et nous sommes pr\u00eats \u00e0 tester le pipeline. Regardons ce que nous avons dans <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>Tout est parfait ! <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#set-up-environment-variables\">Nous d\u00e9finissons le format UTF-8 pour fastlane, comme requis<\/a><\/noindex>, en utilisant la strat\u00e9gie <code>clone<\/code> avec l'ex\u00e9cutable <code>shell<\/code>, afin d'avoir un espace de travail propre pour chaque construction, et nous appelons simplement <code>flappybuild<\/code> fastlane, comme indiqu\u00e9 ci-dessus. En fin de compte, nous obtenons une construction, une signature et un d\u00e9ploiement de la derni\u00e8re construction sur TestFlight.<\/p>\n<p><\/p>\n<p>Nous obtenons \u00e9galement un artefact et le sauvegardons avec la construction. Notez que le format <code>.ipa<\/code> est un fichier ex\u00e9cutable ARM sign\u00e9, qui ne s'ex\u00e9cute pas sur l'\u00e9mulateur. Si vous voulez des sorties pour l'\u00e9mulateur, ajoutez simplement une cible de construction qui le produit, puis incluez-la dans le chemin de l'artefact.<\/p>\n<p><\/p>\n<h3 id=\"drugie-peremennye-sredy\">Autres variables d'environnement<\/h3>\n<p><\/p>\n<p>Voici quelques variables d'environnement sur lesquelles tout repose.<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD<\/code><\/strong> et <strong><code>FASTLANE_SESSION<\/code><\/strong><\/p>\n<p><\/p>\n<p>Pour l'authentification dans l'App Store et le t\u00e9l\u00e9chargement sur TestFlight, une authentification pour fastlane est n\u00e9cessaire. Pour cela, cr\u00e9ez un mot de passe sp\u00e9cifique \u00e0 l'application qui sera utilis\u00e9 dans le CI. Plus de d\u00e9tails <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#use-of-application-specific-passwords-and-spaceauth\">ici<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Si vous avez l'authentification \u00e0 deux facteurs, cr\u00e9ez une variable <code>FASTLANE_SESSION<\/code> (les instructions sont \u00e9galement l\u00e0).<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_USER<\/code><\/strong> et <strong><code>FASTLANE_PASSWORD<\/code><\/strong><\/p>\n<p><\/p>\n<p>Pour que <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert et sigh<\/a><\/noindex> les certificats et le profil de provisioning soient appel\u00e9s \u00e0 la demande, il est n\u00e9cessaire de d\u00e9finir des variables <code>FASTLANE_USER<\/code> et <code>FASTLANE_PASSWORD<\/code>. Plus de d\u00e9tails <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#environment-variables-to-set\">ici<\/a><\/noindex>. Cela n'est pas n\u00e9cessaire si vous utilisez une autre m\u00e9thode de signature.<\/p>\n<p><\/p>\n<h3 id=\"v-zaklyuchenie\">En conclusion<\/h3>\n<p><\/p>\n<p>Vous pouvez voir comment tout cela fonctionne <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">dans mon exemple simple<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>J'esp\u00e8re que cela a \u00e9t\u00e9 utile et que j'ai r\u00e9ussi \u00e0 vous inspirer \u00e0 travailler avec des builds iOS dans un projet GitLab. Voici encore <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/\">des conseils sur CI<\/a><\/noindex> pour fastlane, au cas o\u00f9. Vous pourriez vouloir utiliser <code>CI_BUILD_ID<\/code> (pour des builds incr\u00e9mentiels), afin de <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/gitlab\/#auto-incremented-build-number\">incr\u00e9menter automatiquement la version<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Une autre fonctionnalit\u00e9 g\u00e9niale de fastlane est <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/screenshots\/\">les captures d'\u00e9cran automatiques<\/a><\/noindex> pour l'App Store, qui sont tr\u00e8s faciles \u00e0 configurer.<\/p>\n<p><\/p>\n<p>Parlez-nous dans les commentaires de votre exp\u00e9rience et partagez vos id\u00e9es pour am\u00e9liorer GitLab pour le d\u00e9veloppement d'applications iOS.<\/p>\n<p>Source : <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.2 - 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\/fr\/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.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Publions des applications iOS dans l'App Store avec GitLab et fastlane | ProHoster","description":"Comment GitLab fonctionne avec fastlane.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/42201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=42201"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/42201\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/42202"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=42201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=42201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=42201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}