Rinnovare il token di una GitHub App durante l'esecuzione di un workflow

di Matteo Tumiati, in DevOps,

Nello script precedente abbiamo visto come sia facile poter generare un token tramite un account di servizio per poter eseguire operazioni in modo completamente automatizzato e senza dover esporre delle secret che rappresentano la nostra identità. Quello che però non abbiamo menzionato, riguarda la durata di questo token, che è impostata al valore di 1h.

L'extension della CLI di GitHub che abbiamo visto la volta scorsa non ci permette di rinnovare quel token, ma solamente di generarne uno nuovo. Per fare ciò dobbiamo misurare attentamente la durata di esecuzione di un workflow: se questo è sicuramente inferiore all'ora, non avremo problemi, altrimenti dovremo gestirlo sfruttando gli stessi step precedenti per generare un nuovo token o, in alternativa, gestirlo tramite script quando avremo una esecuzione di tipo long-running. Vediamo l'esempio seguente:

echo "Starting long process..."
for task in "Setup environment" "Download file" "Process file" "Generate report"
do
    echo "Starting $task..."
    sleep 20m # Simulate each task will take 20 minutes
    echo "$task completed!"
done
echo "Process completed! Total time: Over 1 hour!"

In questo scenario specifico non abbiamo la possibilità di interrompere l'esecuzione dello script per generare un nuovo token e, proprio per questo, possiamo inserire qualche riga di codice in più per gestire il refresh automaticamente:

function refresh_token {
  echo "Generating a new GitHub token..."
  base_key=$(echo "$GH_APP_CERTIFICATE" | base64 -w 0)
  token=$(gh token generate --app-id 123456 --token-only --base64-key "$base_key")
  echo "$token" | gh auth login --with-token
}

Questa funzione di fatto genera il token come abbiamo visto precedentemente ed effettua una nuova login sfruttando la CLI. Tutte le operazioni fatte successivamente sfrutteranno questa identity. A questo punto non ci rimane fare altro che inserire la funzione nello script e aggiungere un "pizzico" di logica per capire quanto tempo è passato dall'inizio dell'esecuzione, riscrivendo, di fatto, lo script in questo modo:

echo "Starting long process..."

# immediately generate a valid token and authenticate
refresh_token 
start_time=$(date +%s)

for task in "Setup environment" "Download file" "Process file" "Generate report"
do
    current_time=$(date +%s)
    time_passed=$((current_time - start_time))

    # Let's use 40 minutes as an example, but we can customize depending on the need
    # If "X" minutes passed, then refresh the GitHub token and reset the timer
    if [[ $time_passed -gt 2400 ]]; then
      refresh_token
      start_time=$(date +%s)
    fi
    
    # Here I'll always be authenticated
    echo "Starting $task..."
    sleep 20m # Simulate each task will take 20 minutes
    echo "$task completed!"
done
echo "Process completed! Total time: Over 1 hour!"

Rimane valida l'opzione di usare un PAT nel caso estremo in cui l'esecuzione non sia scomponibile in parti che richiedono meno di 1h per essere eseguite.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi