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
Recuperare l'ultima versione di una release di GitHub
Migliorare la sicurezza dei prompt con Azure AI Studio
Utilizzare l'espressione if inline in una pipeline di Azure DevOps
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Creare una custom property in GitHub
Bloccare l'esecuzione di un pod in mancanza di un'artifact attestation di GitHub
Disabilitare automaticamente un workflow di GitHub (parte 2)
Ottimizzazione dei block template in Angular 17
Recuperare automaticamente un utente e aggiungerlo ad un gruppo di Azure DevOps
Eseguire una ricerca avanzata per recuperare le issue di GitHub
Managed deployment strategy in Azure DevOps