Pular para o conteúdo

O portal

O portal é onde contratos e implementações ficam para outras pessoas usarem. Ele é opcional: uma task vinda de um diretório do próprio repositório, resolvida por caminho, não precisa de portal nenhum. É assim que se escreve um worker antes de publicá-lo.

Quando existe, ele guarda duas coisas: o catálogo e quem pode escrever nele.

Terminal window
export OREN_REGISTRY=https://seu-portal

Ou, no projeto, .oren/config.json — que se commita quando a equipe compartilha o mesmo catálogo. Ver Instalação.

O portal serve para resolver, não para executar. Depois do oren install, nada mais toca a rede: é o oren.lock que garante que uma execução não depende do portal estar no ar. Ver Reprodutibilidade.

Terminal window
oren login
Abra no navegador: https://seu-portal/dispositivo
e informe o código: WDJB-MJHT
aguardando autorização…
✓ autenticado como voce

É o device flow (RFC 8628): a CLI mostra um código curto, você autentica no navegador, e a CLI espera a aprovação. A CLI nunca vê a sua senha — é o que permite gerenciador de senhas, segundo fator e conta federada, nenhum dos quais cabe num prompt de terminal.

O que fica na sua máquina é um token revogável, em ~/.oren/credenciais.json com modo 600. Um por registry, então máquinas que falam com portais diferentes não se confundem.

Se quem hospeda o portal configurou um, a tela de entrar mostra um botão para ele — e só nesse caso. Um portal sem provedor mostra só o formulário de senha.

Qualquer provedor OpenID Connect serve; é configuração, não código:

spring.security.oauth2.client.provider.oidc.issuer-uri=https://idp.exemplo/realms/acme
spring.security.oauth2.client.registration.oidc.client-id=oren-portal
spring.security.oauth2.client.registration.oidc.client-secret=...
spring.security.oauth2.client.registration.oidc.scope=openid,email,profile
spring.security.oauth2.client.registration.oidc.client-name=Entrar com a Acme

A identidade é o par (emissor, assunto) do token, e não o e-mail: o sub é estável e opaco, enquanto um e-mail muda quando alguém troca de sobrenome, de time ou de domínio.

Se o e-mail já tem conta local aqui, a identidade do provedor é vinculada a ela automaticamente só quando o provedor afirma ter verificado o endereço. Caso contrário você entra com a senha uma vez e vincula pela tela da sua conta — um provedor que não verifica endereços deixaria qualquer um que cadastrasse o seu e-mail lá entrar na sua conta aqui.

Contas locais continuam funcionando nos dois casos. Ter os dois — senha e provedor na mesma conta — é suportado, e se administra em Conta → Formas de entrar. É lá também que se completa o vínculo recusado acima: entra com a senha e vincula por ali, onde a posse da conta já foi provada pela sessão.

Desvincular é recusado quando é a única forma que resta de entrar. Uma conta criada pelo provedor não tem senha, e não existe caminho de recuperação — o portal não manda e-mail.

Duas alternativas, quando o navegador não está à mão:

Terminal window
oren login --token # cola um token criado na interface
echo $TOKEN | oren login --token

Em CI não se usa nenhuma das duas: OREN_TOKEN com um token emitido antes.

A CLI nunca pede senha. Esse caminho existiu e saiu: com SSO no portal, uma conta federada não tem senha a digitar.

Publicar exige ser membro de uma organização, com papel publicador ou admin. O namespace dela é o que aparece em toda referência: techlite/analyze-commits.

Conta e organização são coisas diferentes. Criar a conta techlite não cria a organização techlite — quem tenta publicar sem ela recebe organizacao.nao_encontrada.

A organização se cria na interface, em Conta → Organizações. Quem cria vira admin.

Papel O que pode
leitor ver o catálogo privado da organização
publicador publicar versões novas
admin além de publicar, administrar quem entra

O namespace é imutável. Ele aparece em cada oren.yaml que referencia uma task sua, e renomear quebraria todos.

Uma task pode ter mantenedores. Quando tem, só eles publicam nela — mesmo outros publicadores da organização.

É restrição, nunca concessão: quem não publica na organização não passa a publicar por virar mantenedor. E ausência de mantenedor é ausência de restrição, não o contrário — senão a primeira execução dessa regra trancaria todas as tasks que já existem.

Serve também para reservar: atribuir mantenedor a uma task que ainda não tem versão nenhuma garante que ninguém publique a v1 no lugar do time certo.

Terminal window
oren publish ./meu-worker --dry-run # o que sairia
oren publish ./meu-worker

O diretório precisa de um task.yaml, e as implementações vêm de impl.yaml ou de impl-<variante>/impl.yaml.

O contrato vai sempre primeiro: uma implementação só é aceita se o contrato que ela satisfaz já existir no catálogo.

Implementações com build: são recusadas — quem consome receberia uma referência a um diretório que não existe do lado dele. Publique a imagem e troque por image:. Ver Publicando.

Três coisas, e todas por causa de quem já depende:

Versão publicada é imutável. Não há --force nem republicação. Para corrigir, suba metadata.version e publique de novo. É o que permite ao oren.lock prometer que o mesmo pipeline executa o mesmo código.

Publicado não é apagado, é depreciado. Uma versão depreciada continua resolvível e continua entregando o mesmo conteúdo; a CLI só avisa ao usá-la.

Privado pode virar público; o contrário, não. Uma task privada é visível só para a organização. Torná-la pública é uma decisão sem volta — retirar depois quebraria todo pipeline que passasse a referenciá-la. O banco recusa a operação inversa, não só a interface.

Terminal window
oren token list
oren token revoke <id>

O valor em claro aparece uma vez, na emissão, e nunca mais — o servidor guarda só o hash. A lista mostra o prefixo, a descrição e o último uso, que é como se descobre um token esquecido num runner antigo.

Revogar é imediato e definitivo. oren logout é outra coisa: esquece a credencial local e deixa o token válido no servidor.

O portal é um jar e um Postgres. Mesmo software, sem versão reduzida — nada sai da sua rede, e task privada continua privada porque o servidor é seu.

Ele serve tudo (interface e API) sob um prefixo configurável, para conviver com outras aplicações atrás do mesmo proxy:

server.servlet.context-path=/oren