Python: Distribuire con GitHub Actions

Come distribuire il proprio codice Python utilizzando GitHub Actions

👋 Benvenuti nella documentazione di Stackhero!

Stackhero offre una soluzione cloud Python pronta all'uso che fornisce numerosi vantaggi, tra cui:

  • Distribuisci la tua applicazione in pochi secondi con un semplice git push.
  • Usa il tuo nome di dominio e beneficia della configurazione automatica dei certificati HTTPS per una sicurezza migliorata.
  • Goditi la tranquillità con backup automatici, aggiornamenti con un clic, e una tariffazione semplice, trasparente e prevedibile.
  • Ottieni prestazioni ottimali e una sicurezza robusta grazie a una VM privata e dedicata.

Risparmia tempo e semplificati la vita: ci vogliono solo 5 minuti per provare la soluzione di hosting cloud Python di Stackhero!

GitHub Actions semplifica l'automazione delle attività, incluso il deployment del codice Python direttamente sui server di produzione.

In questa guida vedrete come configurare GitHub Actions in modo sicuro e affidabile per distribuire il vostro codice Python sia in ambienti di staging che di produzione.

Per mantenere l'organizzazione, utilizzerete due branch: staging e production. Ogni volta che effettuerete un push su questi branch, il codice verrà automaticamente distribuito sull'istanza Stackhero corrispondente.

Disporre di un'istanza di staging non è obbligatorio. Potete seguire questa guida anche con una sola istanza di produzione. Tuttavia, per garantire deployment fluidi e avere piena fiducia quando si distribuisce in produzione, è fortemente consigliato mantenere sia un'istanza di staging che una di produzione. Questa pratica è uno standard del settore e un approccio solido che può aiutarvi a evitare numerosi problemi.

Prima di iniziare, assicuratevi di avere un account GitHub e un repository dove è ospitato il vostro codice.

Accedete alla vostra dashboard Stackhero e create due servizi Stackhero, uno per lo staging e uno per la produzione. Per maggiore chiarezza, potete chiamarli "Production" e "Staging".

Non avete ancora un account Stackhero? Potete registrarvi gratuitamente in due minuti e poi creare i vostri servizi cloud Python con pochi clic.

Esempio di servizi production e stagingEsempio di servizi production e staging

Le chiavi SSH permettono a GitHub Actions di connettersi in modo sicuro al vostro servizio Python per il deployment del codice. Questo passaggio è fondamentale per la sicurezza dei vostri servizi Stackhero.

Sul vostro computer, potete generare nuove chiavi SSH eseguendo:

ssh-keygen -C "" -f /tmp/ssh_key -N ""

Per prima cosa, visualizzate la chiave pubblica appena generata:

cat /tmp/ssh_key.pub

Successivamente, nella dashboard Stackhero, selezionate il servizio Python "production" e cliccate sul pulsante "Configure".

Accedere alle impostazioni del servizioAccedere alle impostazioni del servizio

Seguite questi passaggi:

  1. Sotto SSH public keys, cliccate su Add a public key.
  2. Per Description, inserite GitHub Action.
  3. Per Key, incollate la chiave pubblica appena copiata.

Aggiungere la chiave pubblicaAggiungere la chiave pubblica

Andate sulla pagina del vostro progetto GitHub, cliccate su Settings, poi su Environments. Scegliete New environment.

Configurazione degli ambienti GitHubConfigurazione degli ambienti GitHub

Nel campo Name, inserite "production" e confermate.

Impostazione dell'ambienteImpostazione dell'ambiente

Cliccate sul pulsante No restriction e selezionate Selected branches and tags.

Impostazione delle restrizioni dell'ambienteImpostazione delle restrizioni dell'ambiente

Poi cliccate su Add deployment branch or tag rule, inserite "production" nel campo Name pattern e cliccate su Add rule.

Impostazione del branch dell'ambienteImpostazione del branch dell'ambiente Impostazione del branch dell'ambienteImpostazione del branch dell'ambiente

Nella sezione Environment secrets, cliccate su Add secret.

Aggiungere un secretAggiungere un secret

Ora visualizzate la chiave privata generata in precedenza:

cat /tmp/ssh_key

Nella configurazione del secret, usate STACKHERO_SSH_PRIVATE_KEY come Nome e incollate la chiave privata come Valore.

Impostazione del secret della chiave privata SSHImpostazione del secret della chiave privata SSH

Successivamente, nella sezione Environment variables, cliccate su Add variable.

Impostazione delle variabiliImpostazione delle variabili

Inserite STACKHERO_ENDPOINT come Nome e incollate l'endpoint del vostro servizio Python come Valore. Troverete questo endpoint nella dashboard Stackhero.

Impostazione della variabile endpointImpostazione della variabile endpoint

Se avete personalizzato il nome di dominio del vostro servizio, utilizzate la versione personalizzata invece di <XXXXXX>.stackhero-network.com.

Per motivi di sicurezza, è consigliabile eliminare ora le chiavi SSH dal vostro computer, poiché non vi serviranno più:

rm /tmp/ssh_key /tmp/ssh_key.pub

Nel vostro repository Git, create una cartella chiamata .github/workflows se non esiste già. Poi aggiungete al suo interno un file chiamato deploy-to-stackhero.yml.

# File: .github/workflows/deploy-to-stackhero.yml

name: Deploy to Stackhero
run-name: Deploy branch "${{ github.ref_name }}" to Stackhero

on:
  push:
    # Elenco dei branch che attiveranno l'azione di deploy dopo un git push.
    # Non dimenticate di creare un ambiente corrispondente al nome del branch su GitHub (in "Settings"/"Environments").
    # Poi aggiungete il secret corrispondente "STACKHERO_SSH_PRIVATE_KEY" e la variabile "STACKHERO_ENDPOINT" in quell'ambiente.
    branches: [ "production", "staging" ]

jobs:
  Deploy:
    environment: ${{ github.ref_name }}
    runs-on: ubuntu-latest
    steps:
    - uses: stackhero-io/github-actions-deploy-to-stackhero@v1
      with:
        # Il secret "STACKHERO_SSH_PRIVATE_KEY" e la variabile "STACKHERO_ENDPOINT" devono essere definiti nell'ambiente branch corrispondente su GitHub in "Settings"/"Environments".
        ssh_private_key: ${{ secrets.STACKHERO_SSH_PRIVATE_KEY }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}

Una volta aggiunto il file workflow, potete effettuare il commit delle modifiche:

git add -A .
git commit -m "Aggiungi GitHub Actions per il deploy su Stackhero"

Potete creare un branch production con:

git checkout -b production

E inviare le modifiche su GitHub:

git push --set-upstream origin production

Questo invierà il vostro codice al branch production su GitHub e attiverà GitHub Actions, che distribuirà il codice sulla vostra istanza Stackhero.

Per verificare lo stato del deployment, visitate semplicemente la pagina del vostro progetto GitHub e cliccate su Actions.

GitHub Actions che ha distribuito in produzioneGitHub Actions che ha distribuito in produzione

Ecco fatto. Ora avete il deployment automatico in produzione tramite GitHub Actions.

La configurazione di un ambiente di staging è praticamente identica a quella della produzione. Potete semplicemente ripetere i passaggi sopra, sostituendo production con staging ovunque compaia.

Dopo aver configurato l'ambiente, potete creare un branch staging così:

git checkout -b staging

Poi inviate il branch staging su GitHub:

git push --set-upstream origin staging

Il vostro branch staging verrà ora automaticamente distribuito sull'istanza Python che avete destinato allo staging.

È consigliabile proteggere i branch production e staging per evitare push diretti. Con questa configurazione, i membri del team dovranno creare delle pull request verso il branch staging, che dovranno essere revisionate e unite da utenti con i permessi adeguati. Una volta che le modifiche sono state validate sulla piattaforma di staging, la pull request potrà essere unita nel branch production da una persona autorizzata.

Questo workflow aiuta a garantire che solo le modifiche approvate arrivino in produzione, migliorando anche l'affidabilità grazie ai test delle nuove funzionalità su staging prima della messa in produzione.