Kontinuerlig integrering och kontinuerlig distribution till Azure IoT EdgeContinuous integration and continuous deployment to Azure IoT Edge

Du kan enkelt använda DevOps med dina Azure IoT Edge-program med de inbyggda Azure IoT Edge-uppgifterna i Azure Pipelines.You can easily adopt DevOps with your Azure IoT Edge applications with the built-in Azure IoT Edge tasks in Azure Pipelines. Den här artikeln visar hur du kan använda funktionerna för kontinuerlig integrering och kontinuerlig distribution i Azure Pipelines för att skapa, testa och distribuera program snabbt och effektivt till din Azure IoT Edge.This article demonstrates how you can use the continuous integration and continuous deployment features of Azure Pipelines to build, test, and deploy applications quickly and efficiently to your Azure IoT Edge.

Diagram - CI- och CD-filialer för utveckling och produktion

I den här artikeln får du lära dig hur du använder de inbyggda Azure IoT Edge-uppgifterna för Azure Pipelines för att skapa två pipelines för din IoT Edge-lösning.In this article, you learn how to use the built-in Azure IoT Edge tasks for Azure Pipelines to create two pipelines for your IoT Edge solution. Det finns fyra åtgärder som kan användas i Azure IoT Edge-uppgifter.There are four actions can be used in the Azure IoT Edge tasks.

  • Azure IoT Edge - Build Module avbildningar tar din IoT Edge-lösningskod och bygger behållaravbildningarna.Azure IoT Edge - Build Module images takes your IoT Edge solution code and builds the container images.
  • Azure IoT Edge - Push Module avbildningar skickar modulavbildningar till behållarregistret som du angav.Azure IoT Edge - Push Module images pushes module images to the container registry you specified.
  • Azure IoT Edge - Generera distributionmanifest tar en deployment.template.json-fil och variablerna och genererar sedan den slutliga IoT Edge-distributionsmanipuleringsfilen.Azure IoT Edge - Generate Deployment Manifest takes a deployment.template.json file and the variables, then generates the final IoT Edge deployment manifest file.
  • Azure IoT Edge - Distribuera till IoT Edge-enheter hjälper till att skapa IoT Edge-distributioner till enstaka/flera IoT Edge-enheter.Azure IoT Edge - Deploy to IoT Edge devices helps create IoT Edge deployments to single/multiple IoT Edge devices.

KravPrerequisites

  • En Azure Repos-databas.An Azure Repos repository. Om du inte har någon kan du skapa en ny Git-repa i projektet.If you don't have one, you can Create a new Git repo in your project.

  • En IoT Edge-lösning som har bekräftats och drivits till din databas.An IoT Edge solution committed and pushed to your repository. Om du vill skapa en ny exempellösning för att testa den här artikeln följer du stegen i Utveckla och felsöka moduler i Visual Studio-kod eller Utveckla och felsöka C#-moduler i Visual Studio.If you want to create a new sample solution for testing this article, follow the steps in Develop and debug modules in Visual Studio Code or Develop and debug C# modules in Visual Studio.

    För den här artikeln behöver du bara den lösningsmapp som skapas av IoT Edge-mallarna i Visual Studio-koden eller Visual Studio.For this article, all you need is the solution folder created by the IoT Edge templates in either Visual Studio Code or Visual Studio. Du behöver inte skapa, skicka, distribuera eller felsöka den här koden innan du fortsätter.You don't need to build, push, deploy, or debug this code before proceeding. Du ställer in dessa processer i Azure Pipelines.You'll set those processes up in Azure Pipelines.

    Om du skapar en ny lösning klonar du databasen lokalt först.If you're creating a new solution, clone your repository locally first. När du sedan skapar lösningen kan du välja att skapa den direkt i databasmappen.Then, when you create the solution you can choose to create it directly in the repository folder. Du kan enkelt begå och driva de nya filerna därifrån.You can easily commit and push the new files from there.

  • Ett behållarregister där du kan skicka modulavbildningar.A container registry where you can push module images. Du kan använda Azure Container Registry eller ett register från tredje part.You can use Azure Container Registry or a third-party registry.

  • En aktiv IoT-hubb med minst IoT Edge-enheter för testning av separata test- och produktionsdistributionsfaser.An active IoT hub with at least IoT Edge devices for testing the separate test and production deployment stages. Du kan följa snabbstartsartiklarna för att skapa en IoT Edge-enhet på Linux eller WindowsYou can follow the quickstart articles to create an IoT Edge device on Linux or Windows

Mer information om hur du använder Azure Repos finns i Dela din kod med Visual Studio och Azure ReposFor more information about using Azure Repos, see Share your code with Visual Studio and Azure Repos

Konfigurera kontinuerlig integreringConfigure continuous integration

I det här avsnittet skapar du en ny version pipeline.In this section, you create a new build pipeline. Konfigurera pipelinen så att den körs automatiskt när du checkar in eventuella ändringar i exempel-IoT Edge-lösningen och publicerar byggloggar.Configure the pipeline to run automatically when you check in any changes to the sample IoT Edge solution, and publish build logs.

Anteckning

Den här artikeln använder den visuella designern Azure DevOps.This article uses the Azure DevOps visual designer. Innan du följer stegen i det här avsnittet stänger du av förhandsgranskningsfunktionen för den nya yaml-pipelinens upplevelse.Before you follow the steps in this section, turn off the preview feature for the new YAML pipeline creation experience.

  1. I Azure DevOps väljer du din profilikon och väljer sedan Förhandsgranska funktioner.In Azure DevOps, select your profile icon then select Preview features.
  2. Inaktivera ny yaml-pipeline-upplevelse.Turn New YAML pipeline creation experience off.

Mer information finns i Skapa en byggpipeline.For more information, see Create a build pipeline.

  1. Logga in på din Azure DevOps-organisation (/https: /dev.azure.com/{your organization}/) och öppna projektet som innehåller din IoT Edge-lösningslagringsplats.Sign into your Azure DevOps organization (https://dev.azure.com/{your organization}/) and open the project that contains your IoT Edge solution repository.

    I den här artikeln har vi skapat en databas som heter IoTEdgeRepo.For this article, we created a repository called IoTEdgeRepo. Förvaret innehåller IoTEdgeSolution som har koden för en modul med namnet filtermodul.That repository contains IoTEdgeSolution which has the code for a module named filtermodule.

    Öppna ditt DevOps-projekt

  2. Navigera till Azure Pipelines i projektet.Navigate to Azure Pipelines in your project. Öppna fliken Bygg och välj Ny pipeline.Open the Builds tab and select New pipeline. Om du redan har bygga pipelines väljer du knappen Nytt.Or, if you already have build pipelines, select the New button. Välj sedan Nybyggd pipeline.Then choose New build pipeline.

    Skapa en ny bygg-pipeline

  3. Följ anvisningarna för att skapa pipelinen.Follow the prompts to create your pipeline.

    1. Ange källinformation för den nya byggpipelinen.Provide the source information for your new build pipeline. Välj Azure Repos Git som källa och välj sedan projektet, databasen och grenen där IoT Edge-lösningskoden finns.Select Azure Repos Git as the source, then select the project, repository, and branch where your IoT Edge solution code is located. Välj sedan Fortsätt.Then, select Continue.

      Välj pipelinekälla

    2. Välj Tomt jobb i stället för en mall.Select Empty job instead of a template.

      Börja med en tom process

  4. När pipelinen har skapats tas du till pipeline-redigeraren.Once your pipeline is created, you are taken to the pipeline editor. I din pipelinebeskrivning väljer du rätt agentpool baserat på din målplattform:In your pipeline description, choose the correct agent pool based on your target platform:

  5. Pipelinen är förkonfigurerad med ett jobb som heter Agent jobb 1.Your pipeline comes preconfigured with a job called Agent job 1. Välj plustecknet**+( ) om du vill lägga till tre uppgifter i jobbet: Azure IoT Edge två gånger, Kopiera filer en gång och Publicera build-artefakter en gång.Select the plus sign (+**) to add three tasks to the job: Azure IoT Edge twice, Copy Files once and Publish Build Artifacts once. (Hovra över namnet på varje uppgift för att se knappen Lägg till.)(Hover over the name of each task to see the Add button.)

    Lägga till Azure IoT Edge-uppgift

    När alla fyra aktiviteter läggs till ser agent-jobbet ut som följande exempel:When all four tasks are added, your Agent job looks like the following example:

    Tre aktiviteter i byggpipeline

  6. Välj den första Azure IoT Edge-uppgiften för att redigera den.Select the first Azure IoT Edge task to edit it. Den här uppgiften bygger alla moduler i lösningen med målplattformen som du anger.This task builds all modules in the solution with the target platform that you specify.

    • Visningsnamn: Acceptera standardavbildningarna för Azure IoT Edge - Build.Displayname : Accept the default Azure IoT Edge - Build module images .Display name: Accept the default Azure IoT Edge - Build module images.
    • Åtgärd: Acceptera standardversionsmodulavbildningar.Action: Accept the default Build module images.
    • .template.json-fil: Välj ellipsen (...) och navigera till filen deployment.template.json i databasen som innehåller IoT Edge-lösningen..template.json file: Select the ellipsis (...) and navigate to the deployment.template.json file in the repository that contains your IoT Edge solution.
    • Standardplattform: Välj lämplig plattform för dina moduler baserat på din mål-IoT Edge-enhet.Default platform: Select the appropriate platform for your modules based on your target IoT Edge device.
    • Utdatavariabler: Utdatavariablerna innehåller ett referensnamn som du kan använda för att konfigurera filsökvägen där filen deployment.json ska genereras.Output variables: The output variables include a reference name that you can use to configure the file path where your deployment.json file will be generated. Ange referensnamnet till något minnesvärt som kant.Set the reference name to something memorable like edge.
  7. Välj den andra Azure IoT Edge-uppgiften för att redigera den.Select the second Azure IoT Edge task to edit it. Den här uppgiften skickar alla modulavbildningar till behållarregistret som du väljer.This task pushes all module images to the container registry that you select.

    • Visningsnamn: Visningsnamnet uppdateras automatiskt när åtgärdsfältet ändras.Display name: The display name is automatically updated when the action field changes.
    • Åtgärd: Använd listrutan för att välja Push-modulbilder.Action: Use the dropdown list to select Push module images.
    • Registertyp för behållare: Välj den typ av behållarregister som du använder för att lagra modulavbildningarna.Container registry type: Select the type of container registry that you use to store your module images. Beroende på vilken registertyp du väljer ändras formuläret.Depending on which registry type you choose, the form changes. Om du väljer Azure Container Registryanvänder du listrutorna för att välja Azure-prenumerationen och namnet på behållarregistret.If you choose Azure Container Registry, use the dropdown lists to select the Azure subscription and the name of your container registry. Om du väljer Allmänt behållarregisterväljer du Ny för att skapa en registertjänstanslutning.If you choose Generic Container Registry, select New to create a registry service connection.
    • .template.json-fil: Välj ellipsen (...) och navigera till filen deployment.template.json i databasen som innehåller IoT Edge-lösningen..template.json file: Select the ellipsis (...) and navigate to the deployment.template.json file in the repository that contains your IoT Edge solution.
    • Standardplattform: Välj samma plattform som dina inbyggda modulavbildningar.Default platform: Select the same platform as your built module images.

    Om du har flera behållarregister som värd för modulavbildningarna måste du duplicera den här uppgiften, välja olika behållarregister och använda Bypass-moduler i de avancerade inställningarna för att kringgå avbildningarna som inte är avsedda för det här specifika registret.If you have multiple container registries to host your module images, you need to duplicate this task, select different container registry, and use Bypass module(s) in the advanced settings to bypass the images which are not for this specific registry.

  8. Markera uppgiften Kopiera filer för att redigera den.Select the Copy Files task to edit it. Använd den här uppgiften om du vill kopiera filer till katalogen för artefaktdscensättning.Use this task to copy files to the artifact staging directory.

    • Visningsnamn: Kopiera filer till: Släpp mapp.Display name: Copy Files to: Drop folder.
    • Innehåll: Placera två rader deployment.template.json **/module.jsoni det här avsnittet och .Contents: Put two lines in this section, deployment.template.json and **/module.json. Dessa två typer av filer är indata för att generera IoT Edge-distributionsmanifest.These two types of files are the inputs to generate IoT Edge deployment manifest. Måste kopieras till artefakt mellanlagringsmappen och publiceras för utgivningspipeline.Need to be copied to the artifact staging folder and published for release pipeline.
    • Målmapp: Placera $(Build.ArtifactStagingDirectory)variabeln .Target Folder: Put the variable $(Build.ArtifactStagingDirectory). Se Skapa variabler om du vill veta mer om beskrivningen.See Build variables to learn about the description.
  9. Välj aktiviteten Publicera byggartefakter om du vill redigera den.Select the Publish Build Artifacts task to edit it. Ange katalogsökväg för artefaktdscensättning till aktiviteten så att sökvägen kan publiceras för att frigöra pipeline.Provide artifact staging directory path to the task so that the path can be published to release pipeline.

    • Visningsnamn: Publicera artefakt: släpp.Display name: Publish Artifact: drop.
    • Sökväg att publicera $(Build.ArtifactStagingDirectory): Placera variabeln .Path to publish: Put the variable $(Build.ArtifactStagingDirectory). Se Skapa variabler om du vill veta mer om beskrivningen.See Build variables to learn about the description.
    • Artefaktnamn: drop.Artifact name: drop.
    • Artefaktpubliceringsplats: Azure Pipelines.Artifact publish location: Azure Pipelines.
  10. Öppna fliken Utlösare och markera kryssrutan Aktivera kontinuerlig integrering.Open the Triggers tab and check the box to Enable continuous integration. Kontrollera att grenen som innehåller koden ingår.Make sure the branch containing your code is included.

    Aktivera utlösare för kontinuerlig integrering

  11. Spara den nya byggpipelinen med knappen Spara.Save the new build pipeline with Save button.

Den här pipelinen är nu konfigurerad för att köras automatiskt när du skickar ny kod till din repo.This pipeline is now configured to run automatically when you push new code to your repo. Den sista uppgiften, som publicerar pipelineartefakterna, utlöser en versionspipeline.The last task, publishing the pipeline artifacts, triggers a release pipeline. Fortsätt till nästa avsnitt för att skapa versionspipelinen.Continue to the next section to build the release pipeline.

Konfigurera kontinuerlig distributionConfigure continuous deployment

I det här avsnittet skapar du en versionspipeline som är konfigurerad för att köras automatiskt när din build pipeline släpper artefakter och den visar distributionsloggar i Azure Pipelines.In this section, you create a release pipeline that is configured to run automatically when your build pipeline drops artifacts, and it will show deployment logs in Azure Pipelines.

Skapa en ny pipeline och lägg till en ny fasCreate a new pipeline, and add a new stage

  1. Välj + Ny pipelinepå fliken Versioner .In the Releases tab, choose + New pipeline. Om du redan har versionspipelor väljer du knappen + Ny och väljer + Ny versionspipeline.Or, if you already have release pipelines, choose the + New button and select + New release pipeline.

    Lägga till releasepipeline

  2. När du uppmanas att välja en mall väljer du att börja med ett tomt jobb.When prompted to select a template, choose to start with an Empty job.

    Börja med ett tomt jobb

  3. Din nya versionspipeline initieras med ett steg, som kallas steg 1.Your new release pipeline initializes with one stage, called Stage 1. Byt namn på steg 1 för att utveckla och behandla den som en testmiljö.Rename Stage 1 to dev and treat it as a test environment. Vanligtvis har pipelines för kontinuerlig distribution flera steg, inklusive dev, mellanlagring och prod. Du kan skapa mer baserat på din DevOps-övning.Usually, continuous deployment pipelines have multiple stages including dev, staging and prod. You can create more based on your DevOps practice. Stäng fönstret sceninformation när det har bytt namn.Close the stage details window once it's renamed.

  4. Länka versionen till byggartefakterna som publiceras av byggpipelinen.Link the release to the build artifacts that are published by the build pipeline. Klicka på Lägg till i artefaktområdet.Click Add in artifacts area.

    Lägga till artefakter

  5. Välj källtyp Byggi Lägg till en artefaktsida.In Add an artifact page, select source type Build. Välj sedan projektet och byggpipelinen som du skapade.Then, select the project and the build pipeline you created. Välj sedan Lägg till.Then, select Add.

    Lägg till en bygg-artefakt

  6. Öppna artefaktutlösare och välj växlingsknappen för att aktivera den kontinuerliga distributionsutlösaren.Open the artifact triggers and select the toggle to enable the continuous deployment trigger. Nu skapas en ny version varje gång en ny version är tillgänglig.Now, a new release will be created each time a new build is available.

    Konfigurera utlösare för kontinuerlig distribution

  7. Utvecklingsfasen är förkonfigurerad med ett jobb och noll aktiviteter.The dev stage is preconfigured with one job and zero tasks. Välj Uppgifter på pipeline-menyn och välj sedan utvecklingsfasen.From the pipeline menu, select Tasks then choose the dev stage. Välj jobb- och aktivitetsantalet för att konfigurera aktiviteterna i det här steget.Select the job and task count to configure the tasks in this stage.

    Konfigurera utvecklingsuppgifter

  8. I utvecklingsfasen bör du se ett standardagentjobb.In the dev stage, you should see a default Agent job. Du kan konfigurera information om agentjobbet, men distributionsuppgiften är plattformsokänslig så att du kan använda antingen Hosted VS2017 eller Hosted Ubuntu 1604 i agentpoolen (eller någon annan agent som hanteras av dig själv).You can configure details about the agent job, but the deployment task is platform insensitive so you can use either Hosted VS2017 or Hosted Ubuntu 1604 in the Agent pool (or any other agent managed by yourself).

  9. Markera plustecknet**+( ) om du vill lägga till två aktiviteter.Select the plus sign (+**) to add two task. Sök efter och lägg till Azure IoT Edge två gånger.Search for and add Azure IoT Edge twice.

    Lägga till uppgifter för utveckling

  10. Välj den första Azure IoT Edge-uppgiften och konfigurera den med följande värden:Select the first Azure IoT Edge task and configure it with the following values:

    • Visningsnamn: Visningsnamnet uppdateras automatiskt när åtgärdsfältet ändras.Display name: The display name is automatically updated when the action field changes.
    • Åtgärd: Använd listrutan för att välja Generera distributionsmanifest.Action: Use the dropdown list to select Generate deployment manifest. Om du ändrar åtgärdsvärdet uppdateras också aktivitetsvisningsnamnet så att det matchar.Changing the action value also updates the task display name to match.
    • .template.json-fil: $(System.DefaultWorkingDirectory)/Drop/drop/deployment.template.jsonSätt sökvägen ..template.json file: Put the path $(System.DefaultWorkingDirectory)/Drop/drop/deployment.template.json. Sökvägen publiceras från byggpipeline.The path is published from build pipeline.
    • Standardplattform: Välj samma värde när du skapar modulavbildningarna.Default platform: Choose the same value when building the module images.
    • Utdatabana: Sätt $(System.DefaultWorkingDirectory)/Drop/drop/configs/deployment.jsonbanan .Output path: Put the path $(System.DefaultWorkingDirectory)/Drop/drop/configs/deployment.json. Den här sökvägen är den slutliga IoT Edge-distributionsmanipuleringsfilen.This path is the final IoT Edge deployment manifest file.

    Dessa konfigurationer hjälper till att ersätta deployment.template.json url:erna för modulavbildningen i filen.These configurations helps replace the module image URLs in the deployment.template.json file. Distributionsmanifestet Generera hjälper också till att ersätta deployment.template.json variablerna med det exakta värdet som du definierade i filen.The Generate deployment manifest also helps replace the variables with the exact value you defined in the deployment.template.json file. I VS/VS-kod anger du det faktiska .env värdet i en fil.In VS/VS Code, you are specifying the actual value in a .env file. I Azure Pipelines anger du värdet på fliken Släpp pipelinevariabler.In Azure Pipelines, you set the value in Release Pipeline Variables tab. Move to Variables tab and configure the Name and Value as following.

    • ACR_ADDRESS: Din Azure-behållarregisteradress.ACR_ADDRESS: Your Azure Container Registry address.
    • ACR_PASSWORD: Lösenordet för Azure Container-behållarregistret.ACR_PASSWORD: Your Azure Container Registry password.
    • ACR_USER: Användarnamnet för Azure Container-registret.ACR_USER: Your Azure Container Registry username.

    Om du har andra variabler i projektet kan du ange namn och värde på den här fliken. Generera distribution manifestet kan bara känna ${VARIABLE} igen variablerna är i *.template.json smak, se till att du använder detta i dina filer.If you have other variables in your project, you can specify the name and value in this tab. The Generate deployment manifest can only recognize the variables are in ${VARIABLE} flavor, make sure you are using this in your *.template.json files.

    Konfigurera variabler för utgivningspipeline

  11. Välj den andra Azure IoT Edge-uppgiften och konfigurera den med följande värden:Select the second Azure IoT Edge task and configure it with the following values:

    • Visningsnamn: Visningsnamnet uppdateras automatiskt när åtgärdsfältet ändras.Display name: The display name is automatically updated when the action field changes.
    • Åtgärd: Använd listrutan för att välja Distribuera till IoT Edge-enheter.Action: Use the dropdown list to select Deploy to IoT Edge devices. Om du ändrar åtgärdsvärdet uppdateras också aktivitetsvisningsnamnet så att det matchar.Changing the action value also updates the task display name to match.
    • Azure-prenumeration: Välj den prenumeration som innehåller din IoT Hub.Azure subscription: Select the subscription that contains your IoT Hub.
    • IoT Hub namn: Välj din IoT-hubb.IoT Hub name: Select your IoT hub.
    • Välj en/flera enheter: Välj om du vill att versionspipelinen ska distribueras till en enhet eller flera enheter.Choose single/multiple device: Choose whether you want the release pipeline to deploy to one device or multiple devices.
      • Om du distribuerar till en enda enhet anger du IoT Edge-enhets-ID.If you deploy to a single device, enter the IoT Edge device ID.
      • Om du distribuerar till flera enheter anger du enhetens målvillkor.If you are deploying to multiple devices, specify the device target condition. Målvillkoret är ett filter som matchar en uppsättning IoT Edge-enheter i IoT Hub.The target condition is a filter to match a set of IoT Edge devices in IoT Hub. Om du vill använda Enhetstaggar som villkor måste du uppdatera motsvarande enhetstaggar med IoT Hub-enhetstvilling.If you want to use Device Tags as the condition, you need to update your corresponding devices Tags with IoT Hub device twin. Uppdatera distributions-ID:n för distribution i IoT Edge och distributionsprioriteten för IoT Edge i de avancerade inställningarna.Update the IoT Edge deployment ID and IoT Edge deployment priority in the advanced settings. Mer information om hur du skapar en distribution för flera enheter finns i Förstå IoT Edge automatiska distributioner.For more information about creating a deployment for multiple devices, see Understand IoT Edge automatic deployments.
    • Expandera avancerade inställningar, välj IoT Edge-distributions-ID, placera variabeln $(System.TeamProject)-$(Release.EnvironmentName).Expand Advanced Settings, select IoT Edge deployment ID, put the variable $(System.TeamProject)-$(Release.EnvironmentName). Detta mappar projektet och utgivningsnamnet med ditt IoT Edge-distributions-ID.This maps the project and release name with your IoT Edge deployment ID.
  12. Välj Spara om du vill spara ändringarna i den nya versionspipelinen.Select Save to save your changes to the new release pipeline. Återgå till pipeline-vyn genom att välja Pipeline på menyn.Return to the pipeline view by selecting Pipeline from the menu.

Verifiera IoT Edge CI/CD med bygg- och utgivningspipelornaVerify IoT Edge CI/CD with the build and release pipelines

Om du vill utlösa ett byggjobb kan du antingen skicka ett åtagande till källkodsdatabasen eller utlösa det manuellt.To trigger a build job, you can either push a commit to source code repository or manually trigger it. I det här avsnittet utlöser du ci/cd-pipelinen manuellt för att testa att den fungerar.In this section, you manually trigger the CI/CD pipeline to test that it works. Kontrollera sedan att distributionen lyckas.Then verify that the deployment succeeds.

  1. Navigera till den byggpipeline som du skapade i början av den här artikeln.Navigate to the build pipeline that you created at the beginning of this article.

  2. Du kan utlösa ett byggjobb i din byggpipeline genom att välja köknappen som i följande skärmbild.You can trigger a build job in your build pipeline by selecting the Queue button as in following screenshot.

    Manuell utlösare

  3. Välj byggjobbet för att titta på dess framsteg.Select the build job to watch its progress. Om build-pipelinen har slutförts utlöses dev en version till utvecklingsfasen.If the build pipeline is completed successfully, it triggers a release to dev stage.

    Skapa loggar

  4. Den lyckade utvecklingsversionen skapar IoT Edge-distribution för att rikta IoT Edge-enheter.The successful dev release creates IoT Edge deployment to target IoT Edge devices.

    Släpp till dev

  5. Klicka på utvecklingsstadiet för att se utgivningsloggar.Click dev stage to see release logs.

    Lanseringsloggar

Nästa stegNext steps