|
| 1 | +--- |
| 2 | +title: 7. Contribuire |
| 3 | +author: Wale Soyinka |
| 4 | +contributors: Steven Spencer, Ganna Zhyrnova |
| 5 | +tags: |
| 6 | + - cloud-init |
| 7 | + - open source |
| 8 | + - development |
| 9 | + - python |
| 10 | +--- |
| 11 | + |
| 12 | +## Contribuire al progetto cloud-init |
| 13 | + |
| 14 | +Congratulazioni! Abbiamo affrontato i concetti fondamentali di `cloud-init` fino alle tecniche avanzate di provisioning e risoluzione dei problemi. Ora siete un utente esperto di `cloud-init`. Questo capitolo finale apre le porte alla fase successiva del tuo percorso: passare dall'essere un utente di `cloud-init` a un potenziale collaboratore. |
| 15 | + |
| 16 | +`cloud-init` è un progetto open source fondamentale che prospera grazie ai contributi della comunità. Che si tratti di correggere un errore tipografico nella documentazione, segnalare un bug o scrivere un modulo completamente nuovo, ogni contributo è utile. Questo capitolo fornisce una panoramica di alto livello per comprendere il codice sorgente, creare un modulo personalizzato e interagire con la comunità upstream. Non è una guida completa per sviluppatori, ma piuttosto un'introduzione amichevole per iniziare a partecipare. |
| 17 | + |
| 18 | +## 1. Il panorama del codice sorgente di `cloud-init` |
| 19 | + |
| 20 | +Prima di poter contribuire, devi conoscere bene il progetto. Esploriamo il codice sorgente e configuriamo un ambiente di sviluppo di base. |
| 21 | + |
| 22 | +### Il linguaggio e la repository |
| 23 | + |
| 24 | +Scritto quasi interamente in **Python**, Canonical ospita il repository del codice sorgente `cloud-init` su **Launchpad**, ma per facilitare la collaborazione e offrire un'interfaccia più familiare, la maggior parte dei contributori interagisce con il suo mirror ufficiale su **GitHub**. |
| 25 | + |
| 26 | +- **Canonical repository (Launchpad):** [https://git.launchpad.net/cloud-init](https://git.launchpad.net/cloud-init) |
| 27 | + |
| 28 | +- **GitHub mirror:** [https://github.com/canonical/cloud-init](https://github.com/canonical/cloud-init) |
| 29 | + |
| 30 | +Per ottenere il codice sorgente, è possibile clonare il repository GitHub: |
| 31 | + |
| 32 | +```bash |
| 33 | +# Clonare il codice sorgente sulla macchina locale |
| 34 | +git clone https://github.com/canonical/cloud-init.git |
| 35 | +cd cloud-init |
| 36 | +``` |
| 37 | + |
| 38 | +### Configurare di un ambiente di sviluppo |
| 39 | + |
| 40 | +Per lavorare sul codice senza influire sui pacchetti Python del sistema, è consigliabile utilizzare sempre un ambiente virtuale. |
| 41 | + |
| 42 | +```bash |
| 43 | +# Creare un ambiente virtuale Python |
| 44 | +python3 -m venv .venv |
| 45 | + |
| 46 | +# Attivare l'ambiente virtuale |
| 47 | +source .venv/bin/activate |
| 48 | + |
| 49 | +# Installare le dipendenze di sviluppo richieste |
| 50 | +pip install -r requirements-dev.txt |
| 51 | +``` |
| 52 | + |
| 53 | +### Una panoramica di alto livello sul codice sorgente |
| 54 | + |
| 55 | +Navigare nel codice sorgente per la prima volta può essere scoraggiante. Ecco le directory più importanti: |
| 56 | + |
| 57 | +- `cloudinit/`: questa è la directory principale dei sorgenti Python. |
| 58 | +- `cloudinit/sources/`: questa directory contiene il codice per le **fonti dati** (ad esempio, `DataSourceNoCloud.py`). Ecco come `cloud-init` rileva e legge la configurazione da diverse piattaforme cloud. |
| 59 | +- `cloudinit/config/`: qui risiedono i **moduli** (ad esempio, `cc_packages.py`, `cc_users_groups.py`). Il prefisso `cc_` è una convenzione per i moduli abilitati da `#cloud-config`. Questo è il percorso più comune per i contributi relativi alle nuove funzionalità. |
| 60 | +- `doc/`: La documentazione ufficiale del progetto. Migliorare la documentazione è uno dei modi migliori per dare il tuo primo contributo. |
| 61 | +- `tests/`: La suite di test completa per il progetto. |
| 62 | + |
| 63 | +## 2. Scrivere un modulo personalizzato di base |
| 64 | + |
| 65 | +Sebbene `runcmd` sia utile, scrivere un modulo personalizzato è il modo migliore per creare configurazioni riutilizzabili, portabili e idempotenti. |
| 66 | + |
| 67 | +Creiamo il modulo più semplice possibile: uno che legga una chiave di configurazione da `user-data` e scriva un messaggio nel log `cloud-init`. |
| 68 | + |
| 69 | +1. **Creare il file del modulo:** Creare un nuovo file denominato `cloudinit/config/cc_hello_world.py`. |
| 70 | + |
| 71 | + ```python |
| 72 | + # Nome file: cloudinit/config/cc_hello_world.py |
| 73 | + |
| 74 | + # Elenco delle frequenze e delle fasi di esecuzione di questo modulo |
| 75 | + frequency = “once-per-instance” |
| 76 | + distros = [“all”] |
| 77 | + |
| 78 | + def handle(name, cfg, cloud, log, args): |
| 79 | + # Ottieni una chiave “message” dalla configurazione dei dati utente. |
| 80 | + # Se non esiste, utilizzare un valore predefinito. |
| 81 | + message = cfg.get(“message”, “Ciao da un modulo personalizzato!”) |
| 82 | + |
| 83 | + # Scrivere il messaggio nel log principale di cloud-init. |
| 84 | + log.info(f“Il modulo Hello World dice: {message}”) |
| 85 | + ``` |
| 86 | + |
| 87 | +2. **Abilitare il modulo:** Creare il file non è sufficiente. È necessario indicare a `cloud-init` di eseguirlo. Creare un file in `/etc/cloud/cloud.cfg.d/99-my-modules.cfg` e aggiungere il nuovo modulo a uno degli elenchi di moduli: |
| 88 | + |
| 89 | + ```yaml |
| 90 | + # Aggiungere il nostro modulo personalizzato all'elenco dei moduli eseguiti durante la fase di configurazione |
| 91 | + cloud_config_modules: |
| 92 | + - hello_world |
| 93 | + ``` |
| 94 | + |
| 95 | +3. **Utilizzare il modulo:** Ora si può utilizzare il modulo personalizzato nel vostro `user-data`. La chiave di primo livello (`hello_world`) deve corrispondere al nome del modulo senza il prefisso `cc_`. |
| 96 | + |
| 97 | + ```yaml |
| 98 | + #cloud-config |
| 99 | + hello_world: |
| 100 | + message: "My first custom module is working!" |
| 101 | + ``` |
| 102 | + |
| 103 | +Dopo aver avviato una VM con questa configurazione, puoi controllare `/var/log/cloud-init.log` e troverai il tuo messaggio personalizzato, a dimostrazione che il tuo modulo ha funzionato. |
| 104 | + |
| 105 | +## 3. Il workflow per contribuire |
| 106 | + |
| 107 | +Il contributo a un progetto open source segue un workflow standard. Ecco una panoramica semplificata: |
| 108 | + |
| 109 | +1. **Trova qualcosa su cui lavorare:** il punto di partenza migliore è l'issue tracker del progetto su Launchpad. Cerca bug o richieste di funzionalità. I nuovi arrivati sono incoraggiati a iniziare con correzioni alla documentazione o problemi contrassegnati come “low-hanging-fruit” (facili da risolvere) o “good first issue” (buoni primi problemi). |
| 110 | + |
| 111 | +2. **Fork e branch:** creare una vostra copia (un “fork”) del repository `cloud-init` su GitHub. Quindi, creare un nuovo ramo per le vostre modifiche. |
| 112 | + |
| 113 | + ```bash |
| 114 | + git checkout -b my-documentation-fix |
| 115 | + ``` |
| 116 | + |
| 117 | +3. **Apportare le modifiche e conferma:** Apportare le modifiche al codice o alla documentazione. Quando si esegue il commit, si scriva un messaggio chiaro che descriva ciò che si è fatto. Il flag `-s` aggiunge una riga `Signed-off-by`, che certifica che si è scritto la patch o che si ha il diritto di contribuire ad essa. |
| 118 | + |
| 119 | + ```bash |
| 120 | + git commit -s -m “Doc: correzione di un errore tipografico nella documentazione del modulo utenti” |
| 121 | + ``` |
| 122 | + |
| 123 | +4. **Includere i test:** tutti i contributi significativi, in particolare le nuove funzionalità, devono includere i test. Esplorare la directory `tests/` per vedere come vengono testati i moduli esistenti. |
| 124 | + |
| 125 | +5. **Invia una richiesta pull (PR):** invia il tuo ramo al tuo fork su GitHub e apri una richiesta pull al ramo `main` del repository `canonical/cloud-init`. Questa è la vostra richiesta formale per includere il vostro lavoro nel progetto. |
| 126 | + |
| 127 | +6. **Partecipare alla revisione del codice:** i responsabili del progetto esamineranno la vostra richiesta di pull. Potrebbero porre domande o richiedere modifiche. Si tratta di un processo collaborativo. Interagire con il feedback è una parte fondamentale del contributo all'open source. |
| 128 | + |
| 129 | +### Coinvolgimento della comunità |
| 130 | + |
| 131 | +Per saperne di più, porre domande e interagire con la comunità, è possibile partecipare al canale `#cloud-init` sulla rete IRC OFTC o alla mailing list ufficiale. |
| 132 | + |
| 133 | +## Un'ultima cosa |
| 134 | + |
| 135 | +Congratulazioni per aver completato questa guida. Si è passati da utente principiante a utente esperto di `cloud-init` e ora avete una mappa che vi guiderà nel mondo del open source per contribuirvi. La comunità `cloud-init` è accogliente e apprezza i tuoi contributi, anche se piccoli. Happy building! |
0 commit comments