Ruby: Distribuire con GitHub Actions

Come distribuire il tuo codice Ruby utilizzando GitHub Actions

👋 Benvenuti nella documentazione di Stackhero!

Stackhero offre una soluzione Ruby cloud 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 potenziata.
  • 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: bastano solo 5 minuti per provare la soluzione Ruby cloud hosting di Stackhero!

GitHub Actions semplifica l'automazione di attività come la distribuzione del codice Ruby sui server di produzione. Non sono necessari passaggi manuali.

In questa guida scoprirai come configurare GitHub Actions in modo sicuro e affidabile per distribuire automaticamente il tuo codice Ruby sia negli ambienti di staging che di produzione. Questo approccio garantisce distribuzioni coerenti e riduce il rischio di errori.

Per iniziare, lavorerai con due branch nel tuo repository GitHub: staging e production. Ogni volta che effettui un push su uno di questi branch, le modifiche verranno distribuite automaticamente sull'istanza Stackhero corrispondente.

Disporre di un'istanza di staging è opzionale. Anche se puoi seguire questa guida solo con un'istanza di produzione, è fortemente consigliato configurare sia l'ambiente di staging che quello di produzione. Questa è una best practice riconosciuta nel settore e aiuta a individuare eventuali problemi prima che raggiungano gli utenti in produzione.

Prima di iniziare, assicurati di avere un account GitHub e un repository che contenga il tuo codice Ruby.

Accedi alla dashboard di Stackhero per creare due servizi Ruby, uno per lo staging e uno per la produzione. Per maggiore chiarezza, è consigliabile rinominare questi servizi in "Production" e "Staging".

Non hai ancora un account Stackhero? Puoi registrarti gratuitamente in pochi minuti e creare i tuoi servizi cloud Ruby con pochi clic.

Esempio di servizi production e stagingEsempio di servizi production e staging

Per consentire a GitHub Actions di distribuire il tuo codice, è necessario configurare delle chiavi SSH. Questo garantisce che solo azioni autorizzate possano connettersi ai tuoi servizi Stackhero, mantenendo sicure le distribuzioni.

Puoi generare una nuova coppia di chiavi SSH sul tuo computer con:

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

Successivamente, recupera la chiave pubblica appena creata:

cat /tmp/ssh_key.pub

Nella dashboard di Stackhero, seleziona il servizio Ruby "production" e clicca sul pulsante "Configure". Accedi alle impostazioni del servizioAccedi alle impostazioni del servizio

Poi:

  1. Sotto SSH public keys, clicca su Add a public key.
  2. Per Description, inserisci GitHub Action.
  3. Per Key, incolla il contenuto della chiave pubblica dal tuo computer.

Accedi alle impostazioni del servizioAccedi alle impostazioni del servizio

Ora vai sul sito di GitHub e apri il tuo progetto.

Vai su Settings > Environments, quindi clicca su New environment. Configurazione degli ambienti GitHubConfigurazione degli ambienti GitHub

Dai un nome all'ambiente "production" e salvalo. Impostazione dell'ambienteImpostazione dell'ambiente

Clicca sul pulsante No restriction e scegli Selected branches and tags. Impostazione delle restrizioni dell'ambienteImpostazione delle restrizioni dell'ambiente

Clicca su Add deployment branch or tag rule, inserisci "production" come pattern e aggiungi la regola. Impostazione del branch dell'ambienteImpostazione del branch dell'ambiente Impostazione del branch dell'ambienteImpostazione del branch dell'ambiente

Per conservare in modo sicuro la tua chiave privata SSH, vai su Environment secrets e clicca su Add secret. Aggiungi secretAggiungi secret

Recupera la chiave privata dal tuo computer:

cat /tmp/ssh_key

Per Name, inserisci STACKHERO_SSH_PRIVATE_KEY. Per Value, incolla il contenuto della tua chiave privata. Impostazione del secret della chiave privata SSHImpostazione del secret della chiave privata SSH

Successivamente, aggiungi l'endpoint del tuo servizio Ruby come variabile d'ambiente. Clicca su Add variable in Environment variables. Impostazione delle variabiliImpostazione delle variabili

Per Name, inserisci STACKHERO_ENDPOINT. Per Value, incolla l'endpoint del tuo servizio Ruby, che puoi trovare nella dashboard di Stackhero. Impostazione della variabile endpointImpostazione della variabile endpoint

Se hai impostato un dominio personalizzato per il tuo servizio, assicurati di utilizzare quel dominio personalizzato invece di <XXXXXX>.stackhero-network.com.

Una volta che le chiavi sono state configurate su Stackhero e GitHub, puoi eliminarle dal tuo computer per motivi di sicurezza.

rm /tmp/ssh_key /tmp/ssh_key.pub

Sulla tua macchina locale, nel repository Git, crea una directory chiamata .github/workflows. All'interno di questa directory, crea 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.
    # Ricordati di creare un ambiente corrispondente al nome del branch su GitHub (in "Settings"/"Environments").
    # Poi aggiungi il secret "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 del branch corrispondente su GitHub sotto "Settings"/"Environments".
        ssh_private_key: ${{ secrets.STACKHERO_SSH_PRIVATE_KEY }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}

Dopo aver creato il file di workflow, puoi effettuare il commit delle modifiche.

git add -A .
git commit -m "Add GitHub Actions to deploy to Stackhero"

Successivamente, crea un branch production.

git checkout -b production

Infine, effettua il push delle modifiche su GitHub.

git push --set-upstream origin production

Quest'ultimo git push caricherà il tuo codice sul branch production su GitHub. GitHub Actions si avvierà automaticamente e distribuirà il tuo codice sull'istanza Stackhero.

Per vedere il workflow in azione, visita la pagina GitHub del tuo progetto e clicca su Actions. GitHub Actions che ha distribuito in produzioneGitHub Actions che ha distribuito in produzione

Congratulazioni, hai appena configurato la distribuzione continua in produzione con GitHub Actions.

La configurazione dell'ambiente di staging segue lo stesso processo di quello di produzione. Basta ripetere i passaggi sopra, sostituendo production con staging dove necessario.

Una volta configurato l'ambiente di staging, puoi creare un branch staging.

git checkout -b staging

Effettua il push del branch staging su GitHub.

git push --set-upstream origin staging

GitHub Actions ora distribuirà automaticamente il branch staging sull'istanza Ruby Stackhero dedicata allo staging.

Per aumentare la sicurezza delle distribuzioni, è consigliabile proteggere i branch production e staging. Questo significa che i push diretti sono limitati e le modifiche devono passare tramite una pull request. I membri del team con i permessi adeguati possono revisionare e approvare le pull request verso staging e, una volta che tutto è stato verificato, unire le modifiche in production nello stesso modo.

Seguendo questo workflow, aumenti la sicurezza (solo gli utenti autorizzati possono distribuire su staging e production) e l'affidabilità (tutte le nuove funzionalità vengono testate in staging prima di arrivare in produzione). Questo aiuta a garantire distribuzioni fluide e un ambiente di produzione stabile.