Com a API REST do Firebase Hosting, é possível realizar implantações programáticas e personalizáveis nos seus sites hospedados pelo Firebase. Use essa API REST para implantar conteúdo e configuração novos ou atualizados do Hosting.
Como alternativa ao uso da CLI do Firebase para
implantações, é possível usar a API REST do Firebase Hosting para criar de maneira
programática uma nova version
dos
recursos para o site, fazer upload de arquivos para a versão e implantar a versão
no site.
Por exemplo, com a API REST do Firebase Hosting, é possível:
Programar implantações. Usando a API REST em conjunto com um cron job, é possível alterar o conteúdo hospedado pelo Firebase regularmente (por exemplo, para implantar um feriado especial ou uma versão relacionada ao evento do seu conteúdo).
Fazer a integração com ferramentas para desenvolvedores. É possível criar uma opção na sua ferramenta para implantar seus projetos de apps da Web no Firebase Hosting usando apenas um clique (por exemplo, clicando em um botão de implantação em um ambiente de desenvolvimento integrado).
Automatizar as implantações quando o conteúdo estático é gerado. Quando um processo gera conteúdo estático programaticamente (por exemplo, conteúdo gerado pelo usuário, como wiki ou artigo de notícias), é possível implantar o conteúdo gerado como arquivos estáticos em vez de disponibilizá-los de forma dinâmica. Isso economiza seu caro poder computacional e disponibiliza seus arquivos de maneira mais escalonável.
Primeiro este guia descreve como ativar, autenticar e autorizar a API. Em seguida, ele mostra um exemplo para criar uma versão do Firebase Hosting, fazer upload dos arquivos necessários para a versão e, por último, implantá-la.
Saiba mais sobre essa API REST na documentação completa de referência da API REST do Hosting.
Antes de começar: ative a API REST
Ative a API REST do Firebase Hosting no Console de APIs do Google:
Abra a página da API Firebase Hosting no Console de APIs do Google.
Quando solicitado, selecione seu projeto do Firebase.
Clique em Ativar na página da API Firebase Hosting.
Etapa 1: receber um token de acesso para autenticar e autorizar solicitações da API
Os projetos do Firebase oferecem suporte a contas de serviço do Google, que podem ser usadas para chamar APIs do servidor do Firebase usando seu servidor de aplicativos ou de um ambiente confiável. Se você estiver desenvolvendo código ou implantando o aplicativo localmente, será possível usar credenciais recebidas por essa conta de serviço para autorizar solicitações do servidor.
Para autenticar uma conta de serviço e autorizá-la para acessar os serviços do Firebase, gere um arquivo de chave privada no formato JSON.
Para gerar um arquivo de chave privada da conta de serviço, siga estas etapas:
No Console do Firebase, abra Configurações > Contas de serviço.
Clique em Gerar nova chave privada e selecione Gerar chave para confirmar.
Armazene com segurança o arquivo JSON que contém a chave.
Use as credenciais do Firebase com a Biblioteca do Google Auth para sua linguagem preferida e recupere um token de acesso do OAuth 2.0 de curta duração:
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); }); }); }
Neste exemplo, a biblioteca de cliente da API do Google autentica a solicitação com um token JSON da Web ou JWT. Para mais informações, consulte tokens JSON da web.
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(); }
O método de atualização de token é chamado automaticamente para recuperar um token atualizado após o de acesso expirar.
Etapa 2: verificar se o projeto tem um site padrão do Hosting
Antes da primeira implantação no Firebase Hosting, seu projeto do Firebase precisa ter um SITE
do Hosting padrão.
Verifique se o projeto já tem um site do Hosting padrão chamando o endpoint
sites.list
.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"
, isso significa que seu projeto já tem um site padrão do Hosting. Pule o restante desta etapa e vá para a próxima: Criar uma nova versão para seu site.Se você receber uma matriz vazia, isso significa que não tem um site padrão do Hosting. Conclua o restante desta etapa.
Escolha o
SITE_ID
para seu site padrão do Hosting. Lembre-se do seguinte ao decidir sobreSITE_ID
:Este
SITE_ID
é usado para criar os subdomínios padrão do Firebase:
eSITE_ID.web.app
.SITE_ID.firebaseapp.com
Um
SITE_ID
tem os seguintes requisitos:- Precisa ser um rótulo de nome de host válido, o que significa que não pode conter
.
,_
etc. - Precisa ter 30 caracteres ou menos.
- Precisa ser globalmente exclusivo no Firebase.
- Precisa ser um rótulo de nome de host válido, o que significa que não pode conter
Muitas vezes, recomendamos usar o ID do projeto como o
SITE_ID
para o site padrão do Hosting. Saiba como encontrar esse ID em Noções básicas sobre projetos do Firebase.Crie seu site padrão do Hosting chamando o endpoint
sites.create
usando oSITE_ID
desejado como o parâmetrositeId
.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: criar uma nova versão para seu site
Sua primeira chamada de API é criar uma nova
Version
para seu site.
Ainda neste guia, você verá como fazer upload de arquivos para essa versão e, em seguida, implantá-la no seu
site.
Determine o SITE_ID do site em que você quer implantar.
Chame o endpoint versions.create usando o SITE_ID na chamada.
(Opcional) Também é possível transmitir um objeto de configuração do Firebase Hosting na chamada. Basta incluir a configuração de um cabeçalho que armazena em cache todos os arquivos por um período especificado de tempo.
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" } }] } }
Essa resposta contém um identificador exclusivo para a nova versão, no formato:
sites/SITE_ID/versions/VERSION_ID
. Você
vai precisar deste identificador exclusivo em todo este guia para fazer referência a essa versão
específica.
Etapa 4: especificar a lista de arquivos que você quer implantar
Agora que você tem seu novo identificador de versão, é necessário informar ao Firebase Hosting quais arquivos quer implantar na nova versão.
O Hosting tem um limite de tamanho máximo de 2 GB para arquivos individuais.
Essa API exige que você identifique arquivos usando um hash SHA256. Dessa forma, antes de poder fazer a chamada da API, primeiro será preciso calcular um hash para cada arquivo estático, fazendo a compactação com o Gzip dos arquivos e depois pegando o hash SHA256 de cada arquivo recém-compactado.
Continuando com nosso exemplo, digamos que você queira implantar três arquivos na nova
versão: file1
, file2
e file3
.
Compacte os arquivos usando o Gzip:
gzip file1 && gzip file2 && gzip file3
Agora você tem três arquivos compactados
file1.gz
,file2.gz
efile3.gz
.Acesse 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.
Envie esses três hashes em uma solicitação da API para o endpoint
versions.populateFiles
. Liste cada hash pelo caminho escolhido para o arquivo carregado (neste exemplo,/file1
,/file2
e/file3
).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" }
Essa resposta inclui:
O hash de cada arquivo que precisa ser carregado. Neste exemplo, o
file1
já foi carregado em uma versão anterior. Dessa forma, seu hash não está incluído na listauploadRequiredHashes
.O
uploadUrl
que é específico para a 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: fazer o upload dos arquivos necessários
Você precisa carregar de maneira individual cada arquivo necessário (os arquivos listados
em uploadRequiredHashes
da resposta versions.populateFiles
na
etapa anterior). Para esses uploads de arquivo, você precisará dos hashes do arquivo e do
uploadUrl
da etapa anterior.
Anexe 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
.Faça o upload de todos os arquivos necessários um por um (neste exemplo, apenas
file2.gz
efile3.gz
) para o URL específico do arquivo usando uma série de solicitações.Por exemplo, para fazer o upload do
file2.gz
compactado: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 HTTPS 200 OK
.
Etapa 6: atualizar o status da versão para FINALIZED
Depois de carregar todos os arquivos listados na resposta
versions.populateFiles
, é possível atualizar o status da sua versão para
FINALIZED
.
Chame o endpoint versions.patch
com o campo status
na sua solicitação de API definida como FINALIZED
.
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 seguinte JSON. Verifique se
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,
é necessário criar um
Release
da sua versão
que contenha a configuração de hospedagem e todos os arquivos de conteúdo para a nova
versão.
Chame o endpoint releases.create
para criar sua versão.
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 no seu site e você pode acessar seus arquivos usando os 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 nos URLs associados
ao domínio SITE_ID.firebaseapp.com
.
Confira também sua nova versão listada no painel do Hosting no Console do Firebase.