Distribuire l'app in macchine virtuali Linux usando Jenkins e Team ServicesDeploy your app to Linux VMs by using Jenkins and Team Services

L'integrazione continua (CI) e la distribuzione continua (CD) formano una pipeline con cui è possibile compilare, rilasciare e distribuire codice.Continuous integration (CI) and continuous deployment (CD) form a pipeline by which you can build, release, and deploy your code. Visual Studio Team Services offre un set di strumenti di automazione CI/CD completo per la distribuzione in Azure.Visual Studio Team Services provides a complete, fully featured set of CI/CD automation tools for deployment to Azure. Jenkins è uno strumento di terze parti diffuso basato su server per CI/CD che offre anche l'automazione CI/CD.Jenkins is a popular third-party CI/CD server-based tool that also provides CI/CD automation. È possibile usare insieme Team Services e Jenkins per personalizzare la fornitura dell'app o del servizio cloud.You can use Team Services and Jenkins together to customize how you deliver your cloud app or service.

In questa esercitazione si compila un'app Web Node.js usando Jenkins.In this tutorial, you use Jenkins to build a Node.js web app. Usare quindi Team Services o Team Foundation Server per distribuirla in un gruppo di distribuzione che contiene macchine virtuali (VM) Linux.You then use Team Services or Team Foundation Server to deploy it to a deployment group that contains Linux virtual machines (VMs).

Si apprenderà come:You will:

  • Ottenere l'app di esempio.Get the sample app.
  • Configurare i plug-in Jenkins.Configure Jenkins plug-ins.
  • Configurare un progetto Freestyle di Jenkins per Node.js.Configure a Jenkins Freestyle project for Node.js.
  • Configurare Jenkins per l'integrazione con Team Services.Configure Jenkins for Team Services integration.
  • Creare un endpoint di servizio di Jenkins.Create a Jenkins service endpoint.
  • Creare un gruppo di distribuzione per le macchine virtuali di Azure.Create a deployment group for the Azure virtual machines.
  • Creare una definizione di versione in Team Services.Create a Team Services release definition.
  • Eseguire distribuzioni manuali e attivate da CI.Execute manual and CI-triggered deployments.

Prima di iniziareBefore you begin

Ottenere l'app di esempioGet the sample app

È necessario disporre di un'app da distribuire archiviata in un repository Git.You need an app to deploy, stored in a Git repository. Per questa esercitazione, si consiglia di usare questa app di esempio disponibile in GitHub.For this tutorial, we recommend that you use this sample app available from GitHub. Questa esercitazione contiene uno script di esempio usato per installare Node.js e un'applicazione.This tutorial contains a sample script that's used for installing Node.js and an application. Per usare il proprio repository, è consigliabile configurare un esempio simile.If you want to work with your own repository, you should configure a similar sample.

Creare un fork di questa app e prendere nota del percorso (URL) per l'uso nei passaggi successivi di questa esercitazione.Create a fork of this app and take note of the location (URL) for use in later steps of this tutorial. Per altre informazioni, vedere Creare una copia tramite fork di un repository.For more information, see Fork a repo.

Nota

L'app è stata compilata tramite Yeoman.The app was built through Yeoman. Usa Express, bower e grunt.It uses Express, bower, and grunt. Include alcuni pacchetti npm come dipendenze.And it has some npm packages as dependencies. L'esempio contiene anche uno script che configura Nginx e distribuisce l'app.The sample also contains a script that sets up Nginx and deploys the app. Viene eseguito sulle macchine virtuali.It is executed on the virtual machines. In particolare, lo script:Specifically, the script:

  1. Installa Node, Nginx e PM2.Installs Node, Nginx, and PM2.
  2. Configura Nginx e PM2.Configures Nginx and PM2.
  3. Avvia l'app Node.Starts the Node app.

Configurare i plug-in JenkinsConfigure Jenkins plug-ins

In primo luogo è necessario configurare due plug-in Jenkins: NodeJS e VS Team Services Continuous Deployment.First, you must configure two Jenkins plug-ins: NodeJS and VS Team Services Continuous Deployment.

  1. Aprire l'account Jenkins e selezionare Manage Jenkins (Gestisci Jenkins).Open your Jenkins account and select Manage Jenkins.
  2. Nella pagina Manage Jenkins (Gestisci Jenkins) selezionare Manage Plugins (Gestisci plug-in).On the Manage Jenkins page, select Manage Plugins.
  3. Filtrare l'elenco per individuare il plug-in NodeJS e selezionare l'opzione Install without restart (Installa senza riavvio).Filter the list to locate the NodeJS plug-in, and select the Install without restart option. Aggiunta del plug-in NodeJS a JenkinsAdding the NodeJS plugin to Jenkins
  4. Filtrare l'elenco per trovare il plug-in VS Team Services Continuous Deployment (Distribuzione continua di VS Team Services) e selezionare l'opzione Installa senza riavvio.Filter the list to find the VS Team Services Continuous Deployment plug-in and select the Install without restart option.
  5. Tornare al dashboard di Jenkins e selezionare Manage Jenkins (Gestisci Jenkins).Go back to the Jenkins dashboard and select Manage Jenkins.
  6. Selezionare Global Tool Configuration (Configurazione strumenti globale).Select Global Tool Configuration. Trovare NodeJS e selezionare NodeJS installations (Installazioni NodeJS).Find NodeJS and select NodeJS installations.
  7. Selezionare l'opzione Install automatically (Installa automaticamente) e quindi immettere un valore per Name (Nome).Select the Install automatically option, and then enter a Name value.
  8. Selezionare Salva.Select Save.

Configurare un progetto Freestyle di Jenkins per Node.jsConfigure a Jenkins Freestyle project for Node.js

  1. Selezionare Nuovo elemento.Select New Item. Immettere un nome di elemento.Enter an item name.
  2. Selezionare Freestyle project (Progetto Freestyle).Select Freestyle project. Selezionare OK.Select OK.
  3. Nella scheda Source Code Management (Gestione codice sorgente) selezionare Git e immettere i dettagli del repository e del ramo contenenti il codice dell'app.On the Source Code Management tab, select Git and enter the details of the repository and the branch that contain your app code.
    Aggiungere un repository alla buildAdd a repo to your build
  4. Nella scheda Build Triggers (Trigger build) selezionare Poll SCM (Polling SCM) e immettere la pianificazione H/03 * * * * per il polling delle modifiche al repository Git ogni tre minuti.On the Build Triggers tab, select Poll SCM and enter the schedule H/03 * * * * to poll the Git repository for changes every three minutes.
  5. Nella scheda Build Environment (Ambiente build) selezionare Provide Node & npm bin/ folder PATH (Fornisci nodo e PERCORSO cartella npm bin/) e selezionare il valore NodeJS Installation (Installazione NodeJS).On the Build Environment tab, select Provide Node & npm bin/ folder PATH and select the NodeJS Installation value. Lasciare npmrc file impostato su use system default (usa impostazioni predefinite di sistema).Leave npmrc file set to use system default.
  6. Nella scheda Build (Compila) selezionare Execute shell (Esegui shell) e immettere il comando npm install per assicurarsi che tutte le dipendenze siano aggiornate.On the Build tab, select Execute shell and enter the command npm install to ensure that all dependencies are updated.

Configurare Jenkins per l'integrazione con Team ServicesConfigure Jenkins for Team Services integration

Nota

Assicurarsi che il token di accesso personale usato per i passaggi seguenti contenga l'autorizzazione di rilascio (lettura, scrittura, esecuzione e gestione) in Team Services.Ensure that the personal access token (PAT) you use for the following steps contains the Release (read, write, execute and manage) permission in Team Services.

  1. Creare un token di accesso personale nell'account Team Services, se non è già disponibile.Create a PAT in your Team Services account if you don't already have one. Jenkins richiede questa informazione per accedere all'account di Team Services.Jenkins requires this information to access your Team Services account. Assicurarsi di archiviare le informazioni del token per i passaggi successivi di questa sezione.Be sure to store the token information for upcoming steps in this section.

    Per informazioni su come generare un token, vedere How do I create a personal access token for VSTS and TFS (Come creare un token di accesso personale per VSTS e TFS).To learn how to generate a token, read How do I create a personal access token for VSTS and TFS?.

  2. Nella scheda Post-build Actions (Azioni post-compilazione) selezionare Add post-build action (Aggiungi azione post-compilazione).In the Post-build Actions tab, select Add post-build action. Selezionare Archive the artifacts (Archivia gli elementi).Select Archive the artifacts.
  3. Per Files to archive (File da archiviare) immettere **/* per includere tutti i file.For Files to archive, enter **/* to include all files.
  4. Per creare un'altra azione, selezionare Add post-build action (Aggiungi azione post-compilazione).To create another action, select Add post-build action.
  5. Selezionare Trigger release in TFS/Team Services (Attiva rilascio in TFS/Team Services).Select Trigger release in TFS/Team Services. Immettere l'URI per l'account Team Services, ad esempio https://{nome-account-personale}.visualstudio.com.Enter the URI for your Team Services account, such as https://{your-account-name}.visualstudio.com.
  6. Immettere il nome in Team Project (Progetto team).Enter the Team Project name.
  7. Scegliere un nome per la definizione di versione.Choose a name for the release definition. Si creare questa definizione di versione in un momento successivo in Team Services.(You create this release definition later in Team Services.)
  8. Scegliere le credenziali per connettersi all'ambiente Team Services o Team Foundation Server:Choose credentials to connect to your Team Services or Team Foundation Server environment:
    • Lasciare vuoto Username (Nome utente) se si usa Team Services.Leave Username blank if you are using Team Services.
    • Immettere nome utente e password se si usa una versione locale di Team Foundation Server.Enter a username and password if you are using an on-premises version of Team Foundation Server.
      Configurazione delle azioni di post-compilazione in Jenkins
  9. Salvare il progetto Jenkins.Save the Jenkins project.

Creare un endpoint servizio di JenkinsCreate a Jenkins service endpoint

Un endpoint servizio consente a Team Services di connettersi a Jenkins.A service endpoint allows Team Services to connect to Jenkins.

  1. Aprire la pagina Servizi in Team Services, aprire l'elenco Nuovo endpoint servizio e selezionare Jenkins.Open the Services page in Team Services, open the New Service Endpoint list, and select Jenkins. Aggiungere un endpoint di JenkinsAdd a Jenkins endpoint
  2. Immettere un nome per la connessione.Enter a name for the connection.
  3. Immettere l'URL del server Jenkins e selezionare l'opzione Accetta i certificati SSL non attendibili.Enter the URL of your Jenkins server, and select the Accept untrusted SSL certificates option. Un esempio di URL è http://{URLJenkinspersonale}.westcentralus.cloudapp.azure.com.An example URL is http://{YourJenkinsURL}.westcentralus.cloudapp.azure.com.
  4. Immettere nome utente e password per l'account Jenkins.Enter the username and password for your Jenkins account.
  5. Selezionare Verifica connessione per assicurarsi che le informazioni siano corrette.Select Verify connection to check that the information is correct.
  6. Selezionare OK per creare l'endpoint servizio.Select OK to create the service endpoint.

Creare un gruppo di distribuzione per Macchine virtuali di AzureCreate a deployment group for Azure virtual machines

È necessario un gruppo di distribuzione per registrare l'agente Team Services in modo che la definizione di versione possa essere distribuita nella macchina virtuale.You need a deployment group to register the Team Services agent so the release definition can be deployed to your virtual machine. I gruppi di distribuzione facilitano la definizione di gruppi logici di computer di destinazione e l'installazione dell'agente necessario in ogni computer.Deployment groups make it easy to define logical groups of target machines for deployment, and to install the required agent on each machine.

Nota

Nella procedura seguente assicurarsi di installare i prerequisiti e di non eseguire lo script con privilegi sudo.In the following procedure, be sure to install the prerequisites and don't run the script with sudo privileges.

  1. Aprire la scheda Versioni nell'hub Compilazione e versione, quindi aprire Gruppi di distribuzione e selezionare + Nuovo.Open the Releases tab of the Build & Release hub, open Deployment groups, and select + New.
  2. Immettere un nome per il gruppo di distribuzione e una descrizione facoltativa,Enter a name for the deployment group, and an optional description. Selezionare quindi Crea.Then select Create.
  3. Scegliere il sistema operativo per la macchina virtuale di destinazione di distribuzione.Choose the operating system for your deployment target virtual machine. Ad esempio selezionare Ubuntu 16.04+.For example, select Ubuntu 16.04+.
  4. Selezionare Usa un token di accesso personale nello script per l'autenticazione.Select Use a personal access token in the script for authentication.
  5. Selezionare il collegamento Prerequisiti di sistema.Select the System prerequisites link. Installare i prerequisiti per il sistema operativo.Install the prerequisites for your operating system.
  6. Selezionare Copia script negli appunti per copiare lo script.Select Copy script to clipboard to copy the script.
  7. Accedere alla macchina virtuale di destinazione di distribuzione ed eseguire lo script.Log in to your deployment target virtual machine and run the script. Non eseguire lo script con privilegi sudo.Don't run the script with sudo privileges.
  8. Dopo l'installazione, vengono chiesti i tag dei gruppi di distribuzione.After the installation, you are prompted for deployment group tags. Accettare i valori predefiniti.Accept the defaults.
  9. In Team Services cercare la nuova macchina virtuale registrata in Destinazioni sotto Gruppi di distribuzione.In Team Services, check for your newly registered virtual machine in Targets under Deployment Groups.

Creare una definizione di versione in Team ServicesCreate a Team Services release definition

Una definizione di versione specifica il processo usato da Team Services per distribuire l'app.A release definition specifies the process that Team Services uses to deploy the app. In questo esempio si esegue uno script della shell.In this example, you execute a shell script.

Per creare una definizione di versione in Team Services:To create the release definition in Team Services:

  1. Aprire la scheda Versioni nell'hub Compilazione e versione e selezionare Crea definizione di versione.Open the Releases tab of the Build & Release hub, and select Create release definition.
  2. Selezionare il modello Vuoto scegliendo l'avvio con un processo vuoto.Select the Empty template by choosing to start with an Empty process.
  3. Nella sezione Elementi selezionare + Aggiungi elemento e scegliere Jenkins per Tipo di origine.In the Artifacts section, select + Add Artifact and choose Jenkins for Source type. Selezionare la connessione all'endpoint servizio Jenkins,Select your Jenkins service endpoint connection. quindi selezionare il processo di origine Jenkins e selezionare Aggiungi.Then select the Jenkins source job and select Add.
  4. Selezionare i puntini di sospensione accanto ad Ambiente 1.Select the ellipsis next to Environment 1. Selezionare Aggiungi fase per gruppo di distribuzione.Select Add deployment group phase.
  5. Scegliere il gruppo di distribuzione.Choose your deployment group.
  6. Selezionare + per aggiungere un'attività alla fase gruppo di distribuzione.Select + to add a task to Deployment group phase.
  7. Selezionare l'attività Script della shell e selezionare Aggiungi.Select the Shell Script task and select Add. L'attività Script della Shell fornisce la configurazione di esecuzione di uno script in ogni server al fine di installare Node.js e avviare l'app.The Shell Script task provides the configuration for a script to run on each server in order to install Node.js and start the app.
  8. Per Percorso script immettere $(System.DefaultWorkingDirectory)/Fabrikam-Node/deployscript.sh.For Script Path, enter $(System.DefaultWorkingDirectory)/Fabrikam-Node/deployscript.sh.
  9. Selezionare Avanzate e quindi abilitare Specifica directory di lavoro.Select Advanced, and then enable Specify Working Directory.
  10. Per Directory di lavoro immettere $(System.DefaultWorkingDirectory)/Fabrikam-Node.For Working Directory, enter $(System.DefaultWorkingDirectory)/Fabrikam-Node.
  11. Modificare il nome della definizione di versione in quello specificato nella scheda Post-build Actions (Azioni post-compilazione) nella build in Jenkins.Edit the name of the release definition to the name that you specified on the Post-build Actions tab of the build in Jenkins. Jenkins richiede questo nome per poter attivare una nuova versione quando vengono aggiornati gli elementi di origine.Jenkins requires this name to be able to trigger a new release when the source artifacts are updated.
  12. Selezionare Salva e quindi OK per salvare la definizione di versione.Select Save and select OK to save the release definition.

Eseguire distribuzioni manuali e attivate da CIExecute manual and CI-triggered deployments

  1. Selezionare + Versione e selezionare Crea versione.Select + Release and select Create Release.
  2. Selezionare la build completata nell'elenco a discesa evidenziato e quindi Accoda.Select the build that you completed in the highlighted drop-down list, and select Queue.
  3. Scegliere il collegamento di versione nel messaggio popup.Choose the release link in the pop-up message. Ad esempio: "Versione Versione-1 creata."For example: "Release Release-1 has been created."
  4. Aprire la scheda Log per osservare l'output della console della versione.Open the Logs tab to watch the release console output.
  5. Nel browser aprire l'URL di uno dei server aggiunti al gruppo di distribuzione.In your browser, open the URL of one of the servers that you added to your deployment group. Ad esempio, immettere http://{indirizzo-ip-server-personale}.For example, enter http://{your-server-ip-address}.
  6. Passare al repository Git di origine e modificare il contenuto del titolo h1 nel file app/views/index.jade con un testo modificato.Go to the source Git repository and modify the contents of the h1 heading in the file app/views/index.jade with some changed text.
  7. Eseguire il commit delle modifiche.Commit your change.
  8. Dopo alcuni minuti si noterà una nuova versione creata nella pagina Versioni di Team Services o Team Foundation Server.After a few minutes, you will see a new release created on the Releases page of Team Services or Team Foundation Server. Aprire la versione per visualizzare la distribuzione in corso.Open the release to see the deployment taking place. Congratulazioni.Congratulations!

Passaggi successiviNext steps

In questa esercitazione è stata automatizzata la distribuzione di un'app in Azure tramite la compilazione in Jenkins e Team Services per il rilascio.In this tutorial, you automated the deployment of an app to Azure by using Jenkins for build and Team Services for release. Si è appreso come:You learned how to:

  • Creare l'app in Jenkins.Build your app in Jenkins.
  • Configurare Jenkins per l'integrazione con Team Services.Configure Jenkins for Team Services integration.
  • Creare un gruppo di distribuzione per le macchine virtuali di Azure.Create a deployment group for the Azure virtual machines.
  • Creare una definizione di versione che configuri le macchine virtuali e distribuisca l'app.Create a release definition that configures the VMs and deploys the app.

Per informazioni su come distribuire uno stack LAMP (Linux, Apache, MySQL e PHP), passare all'esercitazione successiva.To learn about how to deploy a LAMP (Linux, Apache, MySQL, and PHP) stack, advance to the next tutorial.