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
La gestione della riconnessione al server di Blazor in .NET 9
Escludere alcuni file da GitHub Secret Scanning
Triggerare una pipeline su un altro repository di Azure DevOps
Eseguire script pre e post esecuzione di un workflow di GitHub
Managed deployment strategy in Azure DevOps
Gestione file Javascript in Blazor con .NET 9
Path addizionali per gli asset in ASP.NET Core MVC
Generare la software bill of material (SBOM) in GitHub
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Configurare e gestire sidecar container in Azure App Service
Bloccare l'esecuzione di un pod in mancanza di un'artifact attestation di GitHub