Implante em seu site usando a API REST de hospedagem

A API REST do Firebase Hosting permite implantações programáticas e personalizáveis ​​em seus sites hospedados pelo Firebase. Use esta API REST para implantar conteúdo e configuração de hospedagem novos ou atualizados.

Como alternativa ao uso da CLI do Firebase para implantações, você pode usar a API REST do Firebase Hosting para criar programaticamente uma nova version de recursos para seu site, fazer upload de arquivos para a versão e, em seguida, implantar a versão em seu site.

Por exemplo, com a API REST do Firebase Hosting, você pode:

  • Agendar implantações. Ao usar a API REST em conjunto com um cron job, você pode alterar o conteúdo hospedado no Firebase regularmente (por exemplo, para implantar um feriado especial ou uma versão relacionada a eventos do seu conteúdo).

  • Integre-se com ferramentas de desenvolvedor. Você pode criar uma opção em sua ferramenta para implantar seus projetos de aplicativos da web no Firebase Hosting usando apenas um clique (por exemplo, clicando em um botão de implantação em um IDE).

  • Automatize implantações quando conteúdo estático for gerado. Quando um processo gera conteúdo estático de forma programática (por exemplo, conteúdo gerado pelo usuário, como um wiki ou um artigo de notícias), você pode implantar o conteúdo gerado como arquivos estáticos em vez de servi-los dinamicamente. Isso economiza energia de computação dispendiosa e fornece seus arquivos de maneira mais escalonável.

Este guia descreve primeiro como habilitar, autenticar e autorizar a API. Em seguida, este guia apresenta um exemplo para criar uma versão do Firebase Hosting, fazer upload dos arquivos necessários para a versão e, finalmente, implantar a versão.

Você também pode aprender mais sobre essa API REST na documentação completa de referência da API REST de hospedagem .

Antes de começar: Habilite a API REST

Você deve ativar a API REST do Firebase Hosting no console de APIs do Google:

  1. Abra a página da API Firebase Hosting no console de APIs do Google.

  2. Quando solicitado, selecione seu projeto do Firebase.

  3. Clique em Ativar na página da API do Firebase Hosting.

Etapa 1: obtenha um token de acesso para autenticar e autorizar solicitações de API

Os projetos do Firebase oferecem suporte a contas de serviço do Google, que você pode usar para chamar APIs do servidor Firebase a partir do seu servidor de aplicativos ou ambiente confiável. Se estiver desenvolvendo código localmente ou implantando seu aplicativo localmente, você poderá usar credenciais obtidas por meio dessa conta de serviço para autorizar solicitações do servidor.

Para autenticar uma conta de serviço e autorizá-la a acessar os serviços do Firebase, você deve gerar um arquivo de chave privada no formato JSON.

Para gerar um arquivo de chave privada para sua conta de serviço:

  1. No console do Firebase, abra Configurações > Contas de serviço .

  2. Clique em Gerar nova chave privada e confirme clicando em Gerar chave .

  3. Armazene com segurança o arquivo JSON que contém a chave.

Use suas credenciais do Firebase junto com a Biblioteca Google Auth para seu idioma preferido para recuperar um token de acesso OAuth 2.0 de curta duração:

nó.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);
    });
  });
}

Neste exemplo, a biblioteca cliente da API do Google autentica a solicitação com um token da web JSON ou JWT. Para obter mais informações, consulte Tokens web JSON .

Pitão

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();
}

Depois que seu token de acesso expirar, o método de atualização de token será chamado automaticamente para recuperar um token de acesso atualizado.

Etapa 2: certifique-se de que seu projeto tenha um site de hospedagem padrão

Antes da sua primeira implantação no Firebase Hosting, seu projeto do Firebase deve ter um Hosting SITE padrão.

  1. Verifique se o seu projeto já possui um site de hospedagem padrão chamando o endpoint sites.list .

    Por exemplo:

    comando cURL

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

    Solicitação HTTPS bruta

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    
    • Se um dos sites tiver "type": "DEFAULT_SITE" , então seu projeto já possui um site de hospedagem padrão. Pule o restante desta etapa e passe para a próxima: Crie uma nova versão para seu site .

    • Se você obtiver uma matriz vazia, não terá um site de hospedagem padrão. Conclua o restante desta etapa.

  2. Decida o SITE_ID para seu site de hospedagem padrão. Lembre-se do seguinte ao decidir este SITE_ID :

    • Este SITE_ID é usado para criar seus subdomínios padrão do Firebase:
      SITE_ID .web.app e SITE_ID .firebaseapp.com .

    • Um SITE_ID tem os seguintes requisitos:

      • Deve ser um rótulo de nome de host válido, o que significa que não pode conter . , _ , etc.
      • Deve ter 30 caracteres ou menos
      • Deve ser globalmente exclusivo no Firebase

    Observe que geralmente recomendamos usar o ID do seu projeto como SITE_ID para seu site de hospedagem padrão. Saiba como encontrar esse ID em Entenda os projetos do Firebase .

  3. Crie seu site de hospedagem padrão chamando o endpoint sites.create usando o SITE_ID desejado como o parâmetro siteId .

    Por exemplo:

    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
    

    Solicitação HTTPS bruta

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

    Esta chamada de API para sites.create retorna o seguinte JSON:

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

Etapa 3: crie uma nova versão para seu site

Sua primeira chamada de API é para criar uma nova Version para seu site. Posteriormente neste guia, você fará upload de arquivos para esta versão e, em seguida, implantá-los-á em seu site.

  1. Determine o SITE_ID do site no qual você deseja implantar.

  2. Chame o endpoint versões.create usando seu SITE_ID na chamada.

    (Opcional) Você também pode passar um objeto de configuração do Firebase Hosting na chamada, incluindo a definição de um cabeçalho que armazene em cache todos os arquivos por um período especificado.

    Por exemplo:

    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
    

    Solicitação HTTPS bruta

    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"
          }
        }]
      }
    }
    

Esta chamada de API para versions.create retorna o seguinte JSON:

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

Esta resposta contém um identificador exclusivo para a nova versão, no formato: sites/ SITE_ID /versions/ VERSION_ID . Você precisará desse identificador exclusivo ao longo deste guia para fazer referência a esta versão específica.

Etapa 4: especifique a lista de arquivos que você deseja implantar

Agora que você tem o identificador da nova versão, você precisa informar ao Firebase Hosting quais arquivos deseja implantar nesta nova versão.

Observe que a hospedagem tem um limite máximo de tamanho de 2 GB para arquivos individuais.

Esta API requer que você identifique os arquivos por um hash SHA256. Portanto, antes de fazer a chamada da API, primeiro você precisa calcular um hash para cada arquivo estático compactando os arquivos com Gzip e depois obtendo o hash SHA256 de cada arquivo recém-compactado.

Continuando nosso exemplo, digamos que você queira implantar três arquivos na nova versão: file1 , file2 e file3 .

  1. Compacte os arquivos:

    gzip file1 && gzip file2 && gzip file3

    Agora você tem três arquivos compactados file1.gz , file2.gz e file3.gz .

  2. Obtenha o hash SHA256 de cada arquivo compactado:

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

    Agora você tem os três hashes SHA256 dos três arquivos compactados.

  3. Envie esses três hashes em uma solicitação de API para o versions.populateFiles . Liste cada hash pelo caminho desejado para o arquivo carregado (neste exemplo, /file1 , /file2 e /file3 ).

    Por exemplo:

    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
    

    Solicitação HTTPS bruta

    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"
      }
    }
    

Esta chamada de API para versions.populateFiles retorna o seguinte JSON:

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

Esta resposta inclui:

  • O hash de cada arquivo que precisa ser carregado. Por exemplo, neste exemplo file1 já foi carregado em uma versão anterior, portanto seu hash não está incluído na lista uploadRequiredHashes .

  • O uploadUrl específico da nova versão.

Na próxima etapa para fazer upload dos dois novos arquivos, você precisará dos hashes e do uploadURL da resposta versions.populateFiles .

Etapa 5: faça upload dos arquivos necessários

Você precisa fazer upload individualmente de cada arquivo necessário (aqueles arquivos listados em uploadRequiredHashes da versions.populateFiles na etapa anterior). Para esses uploads de arquivos, você precisará dos hashes do arquivo e do uploadUrl da etapa anterior.

  1. Acrescente uma barra e o hash do arquivo ao uploadUrl para criar um URL específico do arquivo no formato: https://upload-firebasehosting.googleapis.com/upload/sites/ SITE_ID /versions/ VERSION_ID /files/ FILE_HASH .

  2. Carregue todos os arquivos necessários um por um (neste exemplo, apenas file2.gz e file3.gz ) para o URL específico do arquivo usando uma série de solicitações.

    Por exemplo, para fazer upload do file2.gz compactado2.gz:

    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
    

    Solicitação HTTPS bruta

    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
    

Uploads bem-sucedidos retornam uma resposta 200 OK HTTPS.

Etapa 6: atualize o status da versão para FINALIZADA

Depois de fazer upload de todos os arquivos listados na versions.populateFiles , você pode atualizar o status da sua versão para FINALIZED .

Chame o versions.patch com o campo status em sua solicitação de API definido como FINALIZED .

Por exemplo:

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

Solicitação HTTPS bruta

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"}

Esta chamada de API para versions.patch retorna o JSON a seguir. Verifique se o status foi atualizado para 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"
}

Etapa 7: liberar a versão para implantação

Agora que você tem uma versão finalizada, libere-a para implantação. Para esta etapa, você precisa criar um Release da sua versão que contenha a configuração de hospedagem e todos os arquivos de conteúdo da sua nova versão.

Chame o endpoint releases.create para criar sua versão.

Por exemplo:

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

Solicitação HTTPS bruta

Host: firebasehosting.googleapis.com

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

Esta chamada de API para releases.create retorna o seguinte 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"
}

A configuração de hospedagem e todos os arquivos da nova versão devem agora ser implantados em seu site, e você pode acessar seus arquivos usando as URLs:

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

Esses arquivos também podem ser acessados ​​em URLs associados ao seu domínio SITE_ID .firebaseapp.com .

Você também pode ver sua nova versão listada no painel de hospedagem do console do Firebase.