Esegui il deployment sul tuo sito utilizzando l'API REST di Hosting

L'API REST Firebase Hosting consente di eseguire implementazioni programmatiche e personalizzabili sui tuoi siti ospitati su Firebase. Utilizza questa API REST per eseguire il deployment di contenuti e configurazione Hosting nuovi o aggiornati.

In alternativa all'utilizzo dell'interfaccia a riga di comando Firebase per i deployment, puoi utilizzare l'API REST Firebase Hosting per creare ed eseguire il deployment di una nuova version di asset per il tuo sito in modo programmatico, caricando i file nella versione.

Ad esempio, con l'API REST Firebase Hosting puoi:

  • Pianifica i deployment. Utilizzando l'API REST in combinazione con un job cron, puoi modificare i contenuti ospitati su Firebase in base a una pianificazione regolare (ad esempio, per eseguire il deployment di una versione speciale dei contenuti in base a festività o eventi).

  • Eseguire l'integrazione con gli strumenti per sviluppatori. Puoi creare un'opzione nel tuo strumento per eseguire il deployment dei progetti di app web su Firebase Hosting con un solo clic (ad esempio, facendo clic su un pulsante di deployment all'interno di un IDE).

  • Automatizza i deployment quando vengono generati contenuti statici. Quando un processo genera contenuti statici in modo programmatico (ad esempio contenuti generati dagli utenti come una wiki o un articolo di notizie), puoi implementare i contenuti generati come file statici anziché pubblicarli in modo dinamico. In questo modo risparmi la potenza di calcolo costosa e pubblichi i file in modo più scalabile.

Questa guida descrive innanzitutto come attivare, autenticare e autorizzare l'API. Questa guida illustra un esempio per creare una Firebase Hosting versione, caricare i file richiesti nella versione e infine eseguire il deployment della versione.

Puoi scoprire di più su questa API REST anche nella documentazione di riferimento completa dell'API REST Hosting.

Prima di iniziare: attiva l'API REST

Devi attivare l'API REST Firebase Hosting nella console API di Google:

  1. Apri la pagina dell'API Firebase Hosting nella console API di Google.

  2. Quando richiesto, seleziona il tuo progetto Firebase.

  3. Fai clic su Abilita nella pagina dell'API Firebase Hosting.

Passaggio 1: ottieni un token di accesso per autenticare e autorizzare le richieste API

I progetti Firebase supportano gli account di servizio Google, che puoi utilizzare per chiamare le API di server Firebase dal server dell'app o dall'ambiente attendibile. Se stai sviluppando codice localmente o esegui il deployment dell'applicazione on-premise, puoi utilizzare le credenziali ottenute tramite questo account di servizio per autorizzare le richieste al server.

Per autenticare un account di servizio e autorizzarlo ad accedere ai servizi Firebase, devi generare un file della chiave privata in formato JSON.

Per generare un file della chiave privata per il tuo account di servizio:

  1. Nella console Firebase, apri Impostazioni > Account di servizio.

  2. Fai clic su Genera nuova chiave privata, poi conferma facendo clic su Genera chiave.

  3. Memorizza in modo sicuro il file JSON contenente la chiave.

Utilizza le tue credenziali Firebase insieme alla libreria di autenticazione Google per la tua lingua preferita per recuperare un token di accesso OAuth 2.0 di breve durata:

node.js

const {google} = require('googleapis');
function getAccessToken() {
  return new Promise(function(resolve, reject) {
    var key = require('./service-account.json');
    var jwtClient = new google.auth.JWT(
      key.client_email,
      null,
      key.private_key,
      SCOPES,
      null
    );
    jwtClient.authorize(function(err, tokens) {
      if (err) {
        reject(err);
        return;
      }
      resolve(tokens.access_token);
    });
  });
}

In questo esempio, la libreria client dell'API di Google autentica la richiesta con un token web JSON o JWT. Per ulteriori informazioni, consulta Token web JSON.

Python

def _get_access_token():
  """Retrieve a valid access token that can be used to authorize requests.

  :return: Access token.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      'service-account.json', SCOPES)
  access_token_info = credentials.get_access_token()
  return access_token_info.access_token

Java

private static String getAccessToken() throws IOException {
  GoogleCredential googleCredential = GoogleCredential
      .fromStream(new FileInputStream("service-account.json"))
      .createScoped(Arrays.asList(SCOPES));
  googleCredential.refreshToken();
  return googleCredential.getAccessToken();
}

Una volta scaduto il token di accesso, il metodo di aggiornamento del token viene chiamato automaticamente per recuperare un token di accesso aggiornato.

Passaggio 2: assicurati che il progetto abbia un sito Hosting predefinito

Prima del primo deployment in Firebase Hosting, il progetto Firebase deve avere un valore predefinito per Hosting SITE.

  1. Controlla se il tuo progetto ha già un sito Hosting predefinito chiamando l'endpoint sites.list.

    Ad esempio:

    Comando cURL

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
    
    https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites
    

    Richiesta HTTPS non elaborata

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    • Se uno dei siti ha "type": "DEFAULT_SITE", il progetto ha già un sito "type": "DEFAULT_SITE" predefinito.Hosting Salta il resto di questo passaggio e vai al passaggio successivo: Crea una nuova versione per il tuo sito.

    • Se ricevi un array vuoto, significa che non hai un sito Hosting predefinito. Completa il resto di questo passaggio.

  2. Scegli il SITE_ID per il tuo sito Hosting predefinito. Tieni presente quanto segue quando decidi il valore di SITE_ID:

    • Questo SITE_ID viene utilizzato per creare i sottodomini Firebase predefiniti:
      SITE_ID.web.app e SITE_ID.firebaseapp.com.

    • Un SITE_ID presenta i seguenti requisiti:

      • Deve essere un'etichetta del nome host valida, il che significa che non può contenere ., _ e così via.
      • Deve contenere al massimo 30 caratteri
      • Deve essere univoco a livello globale in Firebase

    Tieni presente che spesso consigliamo di utilizzare l'ID progetto come SITE_ID per il sito Hosting predefinito. Scopri come trovare questo ID in Informazioni sui progetti Firebase.

  3. Crea il tuo sito Hosting predefinito chiamando l'endpoint sites.create utilizzando il SITE_ID che preferisci come parametro siteId.

    Ad esempio:

    Comando cURL

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
    
    https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites?siteId=SITE_ID
    

    Richiesta HTTPS non elaborata

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites?siteId=SITE_ID
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json

    Questa chiamata API a sites.create restituisce il seguente JSON:

    {
      "name": "projects/PROJECT_ID/sites/SITE_ID",
      "defaultUrl": "https://SITE_ID.web.app",
      "type": "DEFAULT_SITE"
    }

Passaggio 3: crea una nuova versione del sito

La tua prima chiamata API serve a creare un nuovo Version per il tuo sito. Più avanti in questa guida, caricherai i file in questa versione e poi la eseguirai sul tuo sito.

  1. Determina il valore SITE_ID per il sito in cui vuoi eseguire il deployment.

  2. Chiama l'endpoint versions.create utilizzando SITE_ID nella chiamata.

    (Facoltativo) Puoi anche passare un Firebase Hosting oggetto di configurazione nella chiamata, ad esempio impostare un'intestazione che memorizza nella cache tutti i file per un determinato periodo di tempo.

    Ad esempio:

    Comando cURL

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
           -d '{
                 "config": {
                   "headers": [{
                     "glob": "**",
                     "headers": {
                       "Cache-Control": "max-age=1800"
                     }
                   }]
                 }
               }' \
    https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions
    

    Richiesta HTTPS non elaborata

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/sites/SITE_ID/versions HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    Content-Length: 134
    
    {
      "config": {
        "headers": [{
          "glob": "**",
          "headers": {
            "Cache-Control": "max-age=1800"
          }
        }]
      }
    }

Questa chiamata API a versions.create restituisce il seguente JSON:

{
  "name": "sites/SITE_ID/versions/VERSION_ID",
  "status": "CREATED",
  "config": {
    "headers": [{
      "glob": "**",
      "headers": {
        "Cache-Control": "max-age=1800"
      }
    }]
  }
}

Questa risposta contiene un identificatore univoco per la nuova versione, nel formato: sites/SITE_ID/versions/VERSION_ID. Ti servirà questo identificatore univoco per fare riferimento a questa versione specifica in tutta la guida.

Passaggio 4: specifica l'elenco dei file di cui vuoi eseguire il deployment

Ora che hai l'identificatore della nuova versione, devi indicare a Firebase Hosting quali file vuoi eseguire il deployment in questa nuova versione.

Tieni presente che Hosting ha un limite di dimensioni massimo di 2 GB per singolo file.

Questa API richiede di identificare i file tramite un hash SHA256. Pertanto, prima di poter eseguire la chiamata all'API, devi prima calcolare un hash per ogni file statico comprimendo i file con Gzip e poi prendendo l'hash SHA256 di ogni file appena compresso.

Per continuare con l'esempio, supponiamo che tu voglia eseguire il deployment di tre file nella nuova versione: file1, file2 e file3.

  1. Comprimi i file con gzip:

    gzip file1 && gzip file2 && gzip file3

    Ora hai tre file compressi file1.gz, file2.gz e file3.gz.

  2. Ottieni l'hash SHA256 di ogni file compresso:

    cat file1.gz | openssl dgst -sha256
    
    66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4
    
    cat file2.gz | openssl dgst -sha256
    
    490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083
    
    cat file3.gz | openssl dgst -sha256
    
    59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315
    

    Ora hai i tre hash SHA256 dei tre file compressi.

  3. Invia questi tre hash in una richiesta API all'endpoint versions.populateFiles. Elenca ogni hash in base al percorso desiderato per il file caricato (in questo esempio, /file1, /file2 e /file3).

    Ad esempio:

    Comando cURL

    $ curl -H "Content-Type: application/json" \
             -H "Authorization: Bearer ACCESS_TOKEN" \
             -d '{
                   "files": {
                     "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4",
                     "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
                     "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
                   }
                 }' \
    https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions/VERSION_ID:populateFiles
    

    Richiesta HTTPS non elaborata

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/sites/SITE_ID/versions/VERSION_ID:populateFiles HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    Content-Length: 181
    
    {
      "files": {
        "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4",
        "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
        "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
      }
    }

Questa chiamata API a versions.populateFiles restituisce il seguente JSON:

{
  "uploadRequiredHashes": [
    "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
    "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
  ],
  "uploadUrl": "https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files"
}

Questa risposta include:

  • L'hash di ogni file da caricare. Ad esempio, in questo esempio file1 era già stato caricato in una versione precedente, pertanto il relativo hash non è incluso nell'elenco uploadRequiredHashes.

  • uploadUrl, che è specifico della nuova versione.

Nel passaggio successivo, per caricare i due nuovi file, avrai bisogno degli hash e del valore uploadURL della risposta versions.populateFiles.

Passaggio 5: carica i file richiesti

Devi caricare singolarmente ogni file richiesto (quelli elencati in uploadRequiredHashes dalla risposta versions.populateFiles nel passaggio precedente). Per questi caricamenti di file, avrai bisogno degli hash dei file e del uploadUrl del passaggio precedente.

  1. Aggiungi una barra verticale e l'hash del file a uploadUrl per creare un URL specifico per il file nel formato: https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH.

  2. Carica tutti i file richiesti uno alla volta (in questo esempio solo file2.gz e file3.gz) nell'URL specifico del file utilizzando una serie di richieste.

    Ad esempio, per caricare il file file2.gz compresso:

    Comando cURL

    curl -H "Authorization: Bearer ACCESS_TOKEN" \
           -H "Content-Type: application/octet-stream" \
           --data-binary @./file2.gz \
    https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH
    

    Richiesta HTTPS non elaborata

    Host: upload-firebasehosting.googleapis.com
    
    POST /upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/octet-stream
    Content-Length: 500
    
    content-of-file2.gz

I caricamenti riusciti restituiscono una risposta HTTPS 200 OK.

Passaggio 6: aggiorna lo stato della versione su FINALIZZATA

Dopo aver caricato tutti i file elencati nella risposta versions.populateFiles, puoi aggiornare lo stato della versione su FINALIZED.

Chiama l'endpoint versions.patch con il campo status nella richiesta API impostato su FINALIZED.

Ad esempio:

Comando cURL

curl -H "Content-Type: application/json" \
       -H "Authorization: Bearer ACCESS_TOKEN" \
       -X PATCH \
       -d '{"status": "FINALIZED"}' \
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions/VERSION_ID?update_mask=status

Richiesta HTTPS non elaborata

Host: firebasehosting.googleapis.com

PATCH /v1beta1/sites/SITE_ID/versions/VERSION_ID?update_mask=status HTTP/1.1
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
Content-Length: 23

{"status": "FINALIZED"}

Questa chiamata API a versions.patch restituisce il seguente JSON. Verifica che status sia stato aggiornato a FINALIZED.

{
  "name": "sites/SITE_ID/versions/VERSION_ID",
  "status": "FINALIZED",
  "config": {
    "headers": [{
      "glob": "**",
      "headers": {"Cache-Control": "max-age=1800"}
    }]
  },
  "createTime": "2018-12-02T13:41:56.905743Z",
  "createUser": {
    "email": "SERVICE_ACCOUNT_EMAIL@SITE_ID.iam.gserviceaccount.com"
  },
  "finalizeTime": "2018-12-02T14:56:13.047423Z",
  "finalizeUser": {
    "email": "USER_EMAIL@DOMAIN.tld"
  },
  "fileCount": "5",
  "versionBytes": "114951"
}

Passaggio 7: rilascia la versione per il deployment

Ora che hai una versione finalizzata, rilasciala per il deployment. Per questo passaggio, devi creare un Release della tua versione che contenga la configurazione di hosting e tutti i file di contenuti per la nuova versione.

Chiama l'endpoint releases.create per creare la release.

Ad esempio:

Comando cURL

curl -H "Authorization: Bearer ACCESS_TOKEN" \
       -X POST
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID

Richiesta HTTPS non elaborata

Host: firebasehosting.googleapis.com

POST /v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID HTTP/1.1
Authorization: Bearer ACCESS_TOKEN

Questa chiamata API a releases.create restituisce il seguente JSON:

{
  "name": "sites/SITE_ID/releases/RELEASE_ID",
  "version": {
    "name": "sites/SITE_ID/versions/VERSION_ID",
    "status": "FINALIZED",
    "config": {
    "headers": [{
      "glob": "**",
      "headers": {"Cache-Control": "max-age=1800"}
    }]
  }
  },
  "type": "DEPLOY",
  "releaseTime": "2018-12-02T15:14:37Z"
}

La configurazione di hosting e tutti i file per la nuova versione dovrebbero ora essere stati eseguiti sul tuo sito e puoi accedere ai file utilizzando gli URL:

  • https://SITE_ID.web.app/file1
  • https://SITE_ID.web.app/file2
  • https://SITE_ID.web.app/file3

Questi file sono accessibili anche sugli URL associati al tuo dominio SITE_ID.firebaseapp.com.

Puoi anche vedere la nuova release elencata nella dashboard Hosting della console Firebase.