aggiunta una guida su come deploy-are con le github actions su poisson in modo sicuro
parent
556d363bc9
commit
d9b4834268
@ -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/ <username>@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 <username>@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!
|
Loading…
Reference in New Issue