Introdução
O Jenkins normalmente inicia como um controller não inicializado. O primeiro administrador desbloqueia o controller com a senha inicial, cria uma conta de administrador permanente e confirma que o Jenkins está pronto para uso.
Neste laboratório, você praticará esse fluxo de trabalho de primeira execução com segurança. O serviço principal do Jenkins na VM já está configurado para outros laboratórios, portanto, você iniciará um segundo controller Jenkins temporário na porta 18080. Você inicializará apenas esse controller temporário, verificará o resultado e, em seguida, o removerá.
Iniciar um Controller Jenkins Isolado e Limpo
Nesta etapa, você iniciará um novo controller Jenkins sem alterar o serviço principal do Jenkins. Um controller Jenkins armazena sua configuração em /var/jenkins_home, portanto, este laboratório utiliza um volume Docker separado chamado jenkins-init-lab-home.
O comando docker run abaixo inicia o controller temporário em segundo plano. A opção -d significa modo desanexado (detached), --name atribui um nome estável ao container, -p 18080:8080 publica o Jenkins na porta 18080 do host e -v anexa o volume isolado do Jenkins.
docker run -d \
--name jenkins-init-lab \
-p 18080:8080 \
-v jenkins-init-lab-home:/var/jenkins_home \
jenkins/jenkins:latest
O Docker exibirá o ID do novo container. O ID exato será diferente a cada vez, portanto, qualquer valor hexadecimal longo é aceitável.
Em seguida, aguarde até que o Jenkins comece a responder às requisições HTTP. O loop abaixo consulta o controller local em /login até que ele retorne um código de status HTTP. Uma resposta 200 significa que a página de login está disponível.
until [ "$(curl -s -o /dev/null -w '%{http_code}' http://localhost:18080/login)" = "200" ]; do
echo "Aguardando o controller Jenkins temporário..."
sleep 5
done
Você deverá ver a mensagem de espera algumas vezes e, em seguida, o prompt retornará. Confirme o container e o mapeamento de porta:
docker ps --filter name=jenkins-init-lab --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
A saída deve incluir o nome do container e a porta 18080:
NAMES STATUS PORTS
jenkins-init-lab Up ... 0.0.0.0:18080->8080/tcp, ...
Recuperar a Senha Inicial do Administrador
Nesta etapa, você recuperará a senha de uso único que o Jenkins cria para o primeiro administrador. O Jenkins armazena essa senha dentro do diretório home do controller em /var/jenkins_home/secrets/initialAdminPassword.
Use docker exec para executar o cat dentro do container temporário do Jenkins e, em seguida, salve a senha no diretório do seu projeto:
docker exec jenkins-init-lab cat /var/jenkins_home/secrets/initialAdminPassword > /home/labex/project/jenkins-init-password.txt
O comando usa o redirecionamento > para gravar a saída do comando em um arquivo. Isso mantém a senha disponível para as próximas etapas sem depender de uma variável de shell.
Exiba apenas os primeiros caracteres para confirmar que o arquivo não está vazio, sem expor o valor completo no histórico do seu terminal:
cut -c1-8 /home/labex/project/jenkins-init-password.txt
Você deverá ver oito caracteres da senha, semelhante a isto:
1a2b3c4d
Criar uma Conta de Administrador Permanente
Nesta etapa, você usará a senha inicial para criar um administrador real do Jenkins chamado lab-admin. A senha inicial serve apenas para a configuração. Uma conta de administrador normal é o que as equipes usam após a inicialização do controller.
O Jenkins protege os envios de formulários com um token crumb. Um crumb está vinculado à mesma sessão de navegador ou HTTP que o solicitou, portanto, o comando abaixo também salva os cookies do Jenkins em um arquivo de armazenamento de cookies.
INIT_PASSWORD=$(tr -d '\r\n' < /home/labex/project/jenkins-init-password.txt)
COOKIE_JAR=/home/labex/project/jenkins-init-cookies.txt
curl -fsS -c "${COOKIE_JAR}" -u "admin:${INIT_PASSWORD}" \
http://localhost:18080/crumbIssuer/api/json \
> /home/labex/project/jenkins-init-crumb.json
O próximo comando envia um pequeno script Groovy para o Jenkins. O script cria um realm de segurança privado, adiciona o usuário lab-admin, concede controle total aos usuários logados e marca o assistente de configuração como concluído.
CRUMB_FIELD=$(sed -n 's/.*"crumbRequestField":"\([^"]*\)".*/\1/p' /home/labex/project/jenkins-init-crumb.json)
CRUMB_VALUE=$(sed -n 's/.*"crumb":"\([^"]*\)".*/\1/p' /home/labex/project/jenkins-init-crumb.json)
cat > /home/labex/project/initialize-controller.groovy <<'GROOVY'
import jenkins.model.Jenkins
import jenkins.install.InstallState
import hudson.security.HudsonPrivateSecurityRealm
import hudson.security.FullControlOnceLoggedInAuthorizationStrategy
def jenkins = Jenkins.get()
def realm = new HudsonPrivateSecurityRealm(false)
realm.createAccount('lab-admin', 'LabEx-Admin-123')
jenkins.setSecurityRealm(realm)
def strategy = new FullControlOnceLoggedInAuthorizationStrategy()
strategy.setAllowAnonymousRead(false)
jenkins.setAuthorizationStrategy(strategy)
jenkins.setInstallState(InstallState.INITIAL_SETUP_COMPLETED)
jenkins.save()
println('created lab-admin and completed setup')
GROOVY
curl -fsS -b "${COOKIE_JAR}" -u "admin:${INIT_PASSWORD}" \
-H "${CRUMB_FIELD}: ${CRUMB_VALUE}" \
--data-urlencode "script@/home/labex/project/initialize-controller.groovy" \
http://localhost:18080/scriptText \
> /home/labex/project/jenkins-init-result.txt
Leia o arquivo de resultado:
cat /home/labex/project/jenkins-init-result.txt
A mensagem esperada é:
created lab-admin and completed setup
Confirmar o Painel do Controller Inicializado
Nesta etapa, você confirmará que o controller temporário não é mais apenas uma tela de desbloqueio. Um controller inicializado corretamente deve autenticar o usuário lab-admin e retornar a página principal do Jenkins.
Use o curl com -u para autenticar. A opção -o grava o HTML em um arquivo, e -w '%{http_code}' imprime apenas o código de status HTTP.
curl -s -u 'lab-admin:LabEx-Admin-123' \
-o /home/labex/project/jenkins-init-dashboard.html \
-w '%{http_code}\n' \
http://localhost:18080/
O código de status deve ser:
200
Agora, pesquise na página do painel salva por textos estáveis do Jenkins:
grep -o -E 'Dashboard|Welcome to Jenkins|Jenkins' /home/labex/project/jenkins-init-dashboard.html | head
Você deve ver pelo menos uma linha correspondente. O HTML exato pode mudar entre as versões do Jenkins, mas deve identificar a página como sendo do Jenkins.
Parar e Remover o Controller Descartável
Nesta etapa, você limpará o controller temporário. A limpeza é importante porque o serviço principal do Jenkins é o utilizado pelos demais laboratórios do Jenkins, e o controller temporário serviu apenas para praticar a inicialização de primeira execução.
Primeiro, pare e remova o container temporário:
docker rm -f jenkins-init-lab
Em seguida, remova seu volume isolado do Jenkins:
docker volume rm jenkins-init-lab-home
Por fim, comprove que o controller temporário foi removido:
docker ps -a --filter name=jenkins-init-lab --format '{{.Names}}'
Este comando não deve imprimir nada. Um resultado vazio significa que nenhum container com esse nome permanece.
Resumo
Você iniciou um controller Jenkins isolado, recuperou sua senha inicial de administrador de uso único, criou uma conta de administrador permanente, confirmou que o painel inicializado estava acessível e removeu o controller temporário. Este é o fluxo de trabalho central de inicialização de primeira execução por trás de um controller Jenkins utilizável.