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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Bloccare l'esecuzione di un pod in mancanza di un'artifact attestation di GitHub
Analizzare il contenuto di una issue con GitHub Models e AI
Gestire codice JavaScript con code splitting e lazy loading
Rendere i propri workflow e le GitHub Action utilizzate più sicure
Supportare la crittografia di ASP.NET Core con Azure Container App
Supportare la sessione affinity di Azure App Service con Application Gateway
Creare una libreria CSS universale: Cards
Eseguire query in contemporanea con EF
Creare una libreria CSS universale: Immagini
Managed deployment strategy in Azure DevOps


