From d9b4834268cf042ac00558cb66dc0293adf5e230 Mon Sep 17 00:00:00 2001 From: Antonio De Lucreziis Date: Sun, 3 Nov 2024 22:08:14 +0100 Subject: [PATCH] aggiunta una guida su come deploy-are con le github actions su poisson in modo sicuro --- .../2024-11-03-deploy-with-github-actions.md | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 src/content/guides/2024-11-03-deploy-with-github-actions.md diff --git a/src/content/guides/2024-11-03-deploy-with-github-actions.md b/src/content/guides/2024-11-03-deploy-with-github-actions.md new file mode 100644 index 0000000..a9998f3 --- /dev/null +++ b/src/content/guides/2024-11-03-deploy-with-github-actions.md @@ -0,0 +1,107 @@ +--- +id: deploy-with-github-actions +title: Deploy automatico per Poisson da GitHub +description: Come impostare il deploy automatico per la propria pagina Poisson utilizzando le GitHub Actions +author: Antonio De Lucreziis +tags: [github, deploy, poisson] +--- + +Supponiamo di avere un sito web statico che vogliamo caricare su Poisson, ad esempio un progetto NodeJS che genera in `dist/` o `out/` i file da caricare. Come possiamo automatizzare il processo di deploy su Poisson? + +Vediamo come automatizzare questo processo utilizzando le GitHub Actions. + +## Setup + +Manualmente, possiamo costruire il nostro progetto in locale e poi caricare i file su Poisson utilizzando `rsync`, ad esempio come segue: + +```bash +$ npm run build +$ rsync -avz dist/ @poisson.phc.dm.unipi.it:public_html/ +``` + +(osserviamo che gli `/` alla fine di `dist/` e `public_html/` sono importanti per evitare di creare delle cartelle per errore) + +## GitHub Actions + +Per automatizzare questo processo possiamo caricare il nostro progetto su GitHub ed aggiungere un _workflow_ che esegue il build e il deploy ogni volta che facciamo un push sul branch `main`. Ad esempio, possiamo creare un file `.github/workflows/deploy-poison.yaml` con quanto segue: + +```yaml +name: Deploy to Poisson +on: + push: + branches: + - main +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Write SSH keys + run: | + install -m 600 -D /dev/null ~/.ssh/known_hosts + install -m 600 -D /dev/null ~/.ssh/id_ed25519 + echo "${{ secrets.SSH_KNOWN_HOSTS }}" > ~/.ssh/known_hosts + echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '23' + + - name: Install dependencies + run: npm install + + - name: Build + run: npm run build + + - name: Deploy + run: rsync -cavz dist/ ${{ secrets.SSH_USER }}@poisson.phc.dm.unipi.it:public_html/ +``` + +## Comando `rsync` + +Il comando `rsync` ha le seguenti opzioni: + +- `-c` per controllare i file tramite checksum invece che per data e dimensione (che sono sempre diverse visto che stiamo ricosruendo il sito ogni volta con le GitHub Actions) + +- `-a` per copiare ricorsivamente i file e mantenere i permessi + +- `-v` per mostrare i file copiati + +- `-z` per comprimere i file durante il trasferimento + +## SSH Segreti + +Per stabilire una connessione SSH a Poisson dalle GitHub Actions in modo sicuro, dobbiamo aggiungere alcuni segreti alla nostra repository. Vediamo meglio il workflow: + +```yaml + - name: Write SSH keys + run: | + install -m 600 -D /dev/null ~/.ssh/known_hosts + install -m 600 -D /dev/null ~/.ssh/id_ed25519 + echo "${{ secrets.SSH_KNOWN_HOSTS }}" > ~/.ssh/known_hosts + echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519 +``` + +Questa è la parte più importante del workflow, che permette di autenticarsi su Poisson senza dover inserire la password ogni volta (cosa che non è possibile con le GitHub Actions). Per farlo, creiamo in locale una coppia di chiavi SSH apposta per le GitHub Actions e aggiungiamo la chiave pubblica su Poisson. Per farlo, possiamo seguire questi passaggi: + +```bash +$ ssh-keygen -t ed25519 -C "deploy@github-actions" -f actions-deploy-key +$ ssh-copy-id -i actions-deploy-key @poisson.phc.dm.unipi.it +``` + +Poi facendo `cat actions-deploy-key` possiamo copiare il contenuto della chiave privata ed aggiungiamo il contenuto in un segreto chiamato `SSH_PRIVATE_KEY` nella nostra repository. + +Poi, per evitare che la connessione venga rifiutata, eseguiamo in locale anche uno scan delle chiavi SSH di Poisson: + +```bash +$ ssh-keyscan poisson.phc.dm.unipi.it +``` + +(se l'output è vuoto riprovare con `ssh-keyscan -4 ...`) e copiamo l'output in un segreto della nostra repository chiamato `SSH_KNOWN_HOSTS`. + +Infine possiamo aggiungere anche un segreto `SSH_USER` con il nostro username o modificare anche direttamente il workflow ed inserire l'username direttamente nel file. + +Ora ogni volta che facciamo un push sul branch `main` il nostro sito verrà automaticamente costruito e caricato su Poisson! \ No newline at end of file