File di configurazione distribuzione

Il file di configurazione della distribuzione definisce gli artifact da scaricare nell'istanza e la posizione in cui devono essere copiati. Il file di configurazione specifica inoltre la sequenza di comandi per la distribuzione.

Il file di configurazione è scritto in YAML. Il file può essere definito in linea o fornito come riferimento artifact generico durante la distribuzione del gruppo di istanze.

Gli amministratori di DevOps possono utilizzare il file di configurazione della distribuzione per le azioni riportate di seguito.

  • Specificare i package di applicazioni e le relative posizioni da memorizzare nell'istanza di computazione di destinazione.
  • Specificare i passi necessari per distribuire un'applicazione.
  • Specificare le variabili di ambiente definite dall'utente o incorporate necessarie per la distribuzione.

Struttura file di configurazione distribuzione

Di seguito è riportata la struttura di base del file di configurazione della distribuzione.

{
version:     
component:   
env: 
    variables:        
timeoutInSeconds:  
files:  
  - source:
    destination:                              
steps:                              
  - stepType: Command 
    name:
    command:
    runAs:
    timeoutInSeconds:
  - stepType: Command 
}

Di seguito sono riportati i parametri di configurazione della distribuzione e i relativi dettagli.

Parametro descrizione;
version Numero di versione del file di specifica. Il valore deve essere 1.0.
component Valore componente. L'unico valore supportato è deployment.
shell facoltativo. Specifica la shell da utilizzare a livello globale della specifica di distribuzione. Il valore può essere sostituito a livello di passo. I valori consentiti sono /bin/sh e bash. Se non è specificato, verrà utilizzato il valore predefinito bash.
env: variables

Variabili di ambiente definite dall'utente disponibili per gli eseguibili o per il comando bash eseguito nell'ambito della distribuzione.

Esempi: key1: static-value, key2: ${PASSED_FROM_PIPELINE}

È inoltre possibile utilizzare variabili incorporate. Per evitare conflitti, alle variabili incorporate viene anteposto il prefisso OCI_DEVOPS.

Di seguito sono riportate le variabili incorporate.

  • OCI_DEVOPS_PIPELINE_ID
  • OCI_DEVOPS_STAGE_ID
  • OCI_DEVOPS_DEPLOYMENT_ID

env è un parametro facoltativo.

env: vaultVariables facoltativo. La chiave deve essere conforme a una stringa e a una variabile d'ambiente POSIX. Il valore deve essere un OCID (Oracle Cloud Identifier) del segreto del vault. Il vault e la pipeline di distribuzione devono appartenere alla stessa tenancy. La tenancy deve disporre di un criterio appropriato per consentire alle risorse della pipeline di distribuzione di accedere al segreto.

L'ambito di questa variabile è l'esecuzione del file delle specifiche di distribuzione ed è disponibile per tutti i passi nel file. Il valore di queste variabili viene recuperato dal vault e reso disponibile come variabili di ambiente per tutti i passi all'interno del file di specifica della distribuzione.

files

Specifica gli artifact definiti nella pipeline di distribuzione da copiare e la posizione dell'istanza di computazione di destinazione in cui copiarli. Si tratta di un parametro facoltativo.

L'utente configurato, ocarun, è il proprietario predefinito della directory specificata e deve disporre delle autorizzazioni di scrittura ed esecuzione (chmod u+wrx). Se la cartella di destinazione non esiste, viene creata dalla distribuzione DevOps. Per consentire questo, ocarun (o l'utente configurato) deve disporre delle autorizzazioni di scrittura ed esecuzione per la directory padre della directory di destinazione specificata.

Ad esempio, se si assegna la directory di destinazione nel file di configurazione della distribuzione come /var/services/accountService, è necessario fornire le autorizzazioni di scrittura ed esecuzione all'utente configurato per /var/services ed eseguire l'autorizzazione per /var.

files: source

Specifica la posizione di origine degli artifact. L'origine può fare riferimento a un file o a una cartella. Se l'origine è un file, tale file viene copiato nella cartella definita nella destinazione. Se si tratta di una cartella, tutti i contenuti della cartella vengono copiati nella destinazione. L'origine utilizza un percorso relativo, la cui radice è la cartella radice di uno o più artifact.

Specificare il nome completo dell'artifact, inclusa l'estensione del tipo di file. Ad esempio, se il file nell'origine è test.sh, il percorso dell'artifact deve essere test.sh o folder-name/test.sh se il file si trova in una cartella.

Ad esempio, se l'artifact generale specifica un singolo file, run.sh, questo file viene scaricato nella cartella radice (/) dell'origine. Se l'artifact generale è un archivio, ad esempio app_pkg.zip, la radice del contenuto dell'archivio è la cartella radice.

files: destination Specifica la cartella di destinazione in cui deve essere copiato il file o la cartella di origine. OCI DevOps consiglia di considerare la destinazione come directory intermedia per il codice di produzione, poiché il contenuto della directory di destinazione viene sovrascritto durante ogni distribuzione.

Nell'esempio di specifica di distribuzione riportato di seguito vengono menzionate due directory. La directory di destinazione è /var/ocarun_staging/app1_staging_folder e la directory di produzione è var/ocarun_prod/main_app.

steps Specifica la lista dei passi eseguiti in sequenza durante la distribuzione. Ogni passo viene eseguito come un processo diverso nell'istanza. Tutte le variabili di ambiente incorporate e definite dall'utente specificate vengono passate al processo.
steps: name Nome definito dall'utente per il passo.
steps: command

Comando shell o eseguibile shell.

Se il parametro files è specificato nel file di configurazione, il percorso della posizione per l'eseguibile è un percorso assoluto, ad esempio /genericArtifactDemo/start.sh. Se il parametro files non viene specificato, viene utilizzato il percorso relativo per specificare la posizione dell'eseguibile. Il percorso relativo fa riferimento alla cartella di lavoro della distribuzione. Gli artifact vengono scaricati ed estratti nella cartella di lavoro corrente della distribuzione.

Sono supportati sia comandi a riga singola che a riga multipla. Tutti i comandi specificati in un passo vengono eseguiti nella stessa sessione della shell. In base al valore di passi/*/shell, i comandi possono essere shell o bash. L'errore di velocità non è abilitato. Affinché il passo abbia successo, viene considerato l'output dell'ultimo comando in un passo. Se il codice di uscita dell'ultimo comando è 0, il passo viene considerato come riuscito. Il comando multilinea funziona come uno script bash. Se si desidera eseguire rapidamente il comando multilinea, specificare il comando multilinea con (per lo script bash) set -e \n <rest of the commands> per assicurarsi che lo script venga eseguito al primo comando che non riesce.

Ad esempio, se si specifica il comando wrongcommand \n /usr/bin/sudo -n -u root -E /home/opc/scripts/stop.sh \n echo \"Done\" come set -e \n wrongcommand \n /usr/bin/sudo -n -u root -E /home/opc/scripts/stop.sh \n echo \"Done\", lo script termina in wrongcommand.

steps: runAs Eseguire il passo come l'utente specificato. Per impostazione predefinita, tutti i passi vengono eseguiti come utente ocarun.
steps: timeoutInSeconds Specifica il periodo di timeout per terminare un passo.
steps: shell facoltativo. Specifica il tipo di shell del passo corrente. Se non specificato, il valore viene ereditato dal parametro della shell globale. I valori consentiti sono /bin/sh e shell.
steps: onFailure Lista di passi che devono essere eseguiti in caso di errore per uscire in modo normale dalla fase di distribuzione. I comandi nella sezione onFailure vengono eseguiti solo se il passo corrispondente non riesce e, dopo l'esecuzione, la specifica di distribuzione viene interrotta. La gestione dell'errore non influisce sullo stato della fase di distribuzione. Se uno dei passi non riesce, lo stato della fase di distribuzione rimane Non riuscito.

Di seguito è riportato un esempio di file di configurazione della distribuzione.

version: 1.0
component: deployment
runAs: ocarun
env: 
  variables: 
    version: ${appVersion}
  vaultVariables:
    SECRET_ID: "OCID of the secret in the vault"    
files: 
  - source: /
    destination: /var/ocarun_staging/app1_staging_folder
steps: 
  - stepType: Command
    name: Validate Variables
    command: echo "Version = ${version}:  Secret = ${SECRET_ID}"
    timeoutInSeconds: 60
  - stepType: Command
    name: Stop currently-running application
    command: cd /var/ocarun_prod/main_app; ./stop.sh
    timeoutInSeconds: 600
  - stepType: Command
    name: Clean old version of source code in prod directory
    command: echo "Perform suitable cleanup"
    timeoutInSeconds: 600
  - stepType: Command
    name: Copy new version of source code from staging directory to prod directory
    command: cp -R /var/ocarun_staging/app1_staging_folder/main_app /var/ocarun_prod/
    timeoutInSeconds: 600
  - stepType: Command
    name: Install application
    command: cd /var/ocarun_prod/main_app; ./install.sh
    timeoutInSeconds: 600
  - stepType: Command
    name: Run application
    command: cd /var/ocarun_prod/main_app; ./start.sh
    timeoutInSeconds: 600

Esempio di file cloud-init per impostare le due directory (staging e produzione):

#cloud-config
users:
  - default
  - name: ocarun
    sudo: ALL=(ALL) NOPASSWD:ALL

# Create two directories, one for staging and one for production.
runcmd:
  - [mkdir, -p, /var/ocarun_staging]
  - [mkdir, -p, /var/ocarun_prod]
  - [chown, ocarun, /var/ocarun_staging]
  - [chown, ocarun, /var/ocarun_prod]

Esempio per comprendere più voci per origine e destinazione:

version: 1.0
component: deployment
runAs: root
shell: bash
env:
  variables:
    version: ${appVersion}
  vaultVariables:
    docker_registry_password : <secret-ocid>  
files:
  # This section is to define how the files in the artifact is put on the compute instance.
  # Multiple entires are supported using a separate source destination section for every entry.
  - source: /
    destination: /genericArtifactDemo
  - source: /tmp/file1
    destination: /var/applicationPath/someDir1
  - source: /tmp/file2
    destination: /var/applicationPath/someDir2  
steps:
  # This section is to define the scripts that each step runs on the instance after file copy.
  - stepType: Command
    name: Install Apache Web Server
    command: /genericArtifactDemo/install_dependencies.sh
    runAs: root
    timeoutInSeconds: 600
  - stepType: Command
    name: Stop Web Server
    command: /genericArtifactDemo/stop.sh
    runAs: root
    timeoutInSeconds: 60
  - stepType: Command
    name: Install New Version of Software
    command: /genericArtifactDemo/install.sh
    runAs: root
    timeoutInSeconds: 60
  - stepType: Command
    name: Start Web Server
    command: /genericArtifactDemo/start.sh
    runAs: root
    timeoutInSeconds: 60
  - stepType: Command
    name: stop and install
    command: |
      /scripts/stop.sh
      echo "Done stop.sh.."
      /scripts/install_dependencies.sh
      echo "Done install_dependencies.sh.."
      /scripts/install.sh
      echo "Done install.sh.."
    timeoutInSeconds: 1200
    runAs: root
    shell: /bin/sh
    onFailure:
       - stepType: Command
         command: /scripts/recovery_steps.sh
         name:"OnFailure step"
         timeoutInSeconds: 1200

Esecuzione del file di configurazione della distribuzione

Il servizio DevOps utilizza l'agente RunCommand per eseguire i comandi specificati nel file di configurazione nell'istanza di computazione di destinazione. Per ulteriori informazioni sull'abilitazione del plugin RunCommand, vedere la sezione "Prerequisiti" in Distribuzione in un gruppo di istanze. Se il file di configurazione della distribuzione contiene segnaposto, questi vengono sostituiti con i valori definiti nell'elenco di parametri della distribuzione. Vedere Configurazione dei parametri.