introduzione
L'integrazione continua è una pratica di sviluppo software DevOps che consente agli sviluppatori di unire frequentemente il codice modificato nel repository condiviso più volte al giorno. Dopo ogni unione, vengono eseguiti build e test automatici per rilevare problemi nel codice. Consente agli sviluppatori di trovare e risolvere rapidamente gli errori per migliorare la qualità del software e fornire la consegna continua del software. Passare avanti e indietro da Concourse è molto semplice in quanto mantiene tutta la sua configurazione in file dichiarativi che possono essere controllati nel controllo della versione. Fornisce inoltre un'interfaccia utente Web che visualizza le informazioni sulla build in modo interattivo.
Componenti dell'atrio.
- ATC è il componente principale del Concourse. È responsabile per l'esecuzione dell'interfaccia utente Web e dell'API. Si occupa anche di tutta la programmazione della pipeline.
- TSA è un server SSH personalizzato. È responsabile della registrazione sicura di un lavoratore presso ATC.
- I lavoratori gestiscono inoltre due diversi servizi:
- Garden è un runtime contenitore e un'interfaccia per orchestrare contenitori in remoto su un lavoratore.
- Baggageclaim è un server di gestione cache e artefatti.
- Fly è un'interfaccia a riga di comando utilizzata per interagire con l'ATC per configurare Concourse Pipelines.
Prerequisiti
- Un'istanza del server Vultr Ubuntu 16.04.
- Un utente sudo .
Assicurati di sostituire tutte le occorrenze di 192.0.2.1
e ci.example.com
con il tuo attuale indirizzo IP pubblico Vultr e il nome di dominio effettivo.
Aggiorna il tuo sistema di base usando la guida Come aggiornare Ubuntu 16.04 . Dopo aver aggiornato il sistema, procedere con l'installazione di PostgreSQL.
Installa e configura il database PostgreSQL
PostgreSQL è un sistema di database relazionale di oggetti. Concourse memorizza i dati della pipeline in un database PostgreSQL. Aggiungi il repository PostgreSQL.
echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
Installa il server di database PostgreSQL.
sudo apt -y install postgresql
Avviare il server PostgreSQL e abilitarlo ad avviarsi automaticamente all'avvio.
sudo systemctl start postgresql
sudo systemctl enable postgresql
Cambia la password per l'utente PostgreSQL predefinito.
sudo passwd postgres
Accedi come utente PostgreSQL:
sudo su - postgres
Crea un nuovo utente PostgreSQL per Concourse CI.
createuser concourse
Nota : l'utente PostgreSQL predefinito può essere utilizzato per l'autenticazione del database, ma si consiglia di utilizzare un utente dedicato per l'autenticazione del database Concourse in una configurazione di produzione.
PostgreSQL fornisce una shell per eseguire query sul database. Passa alla shell PostgreSQL.
psql
Impostare una password per l'utente del database Concourse appena creato.
ALTER USER concourse WITH ENCRYPTED password 'DBPassword';
Importante : sostituire DBPassword
con una password complessa. Prendi nota della password poiché sarà richiesta più avanti nel tutorial.
Crea un nuovo database per Concourse.
CREATE DATABASE concourse OWNER concourse;
Esci dalla psql
shell.
\q
Passa all'utente sudo dell'utente corrente postgres
.
exit
Scarica e installa Concourse CI
Scarica l'ultima versione dell'eseguibile Concourse e memorizzala in /usr/bin
modo che possa essere eseguita direttamente. L'ultima versione dei binari Concourse e Fly è disponibile nella pagina di download di Concourse . Le nuove versioni sono molto frequenti. Sostituisci il link in basso con il nuovo link per la versione più recente.
sudo wget https://github.com/concourse/concourse/releases/download/v3.10.0/concourse_linux_amd64 -O /usr/bin/concourse
Allo stesso modo, scarica l'ultima versione dell'eseguibile fly e memorizzala in /usr/bin
.
sudo wget https://github.com/concourse/concourse/releases/download/v3.10.0/fly_linux_amd64 -O /usr/bin/fly
Fly è l'interfaccia della riga di comando utilizzata per connettersi all'API ATC di Concourse CI. Fly è disponibile per più piattaforme come Linux, Windows e MacOS.
Assegna l'autorizzazione di esecuzione ai file scaricati concourse
e fly
binari.
sudo chmod +x /usr/bin/concourse /usr/bin/fly
Controlla se Concourse e Fly funzionano correttamente controllandone la versione.
concourse -version
fly -version
Genera e configura chiavi RSA
Le coppie di chiavi RSA forniscono un modo per crittografare la comunicazione tra i componenti del Concourse.
Perché Concourse funzioni, devono essere generate almeno tre coppie di chiavi. Per crittografare i dati della sessione, generare a session_signing_key
. Questa chiave verrà utilizzata anche da TSA per firmare le richieste che invia all'ATC. Per proteggere il server SSH TSA, generare a tsa_host_key
. Infine, genera un worker_key
per ogni lavoratore.
Creare una nuova directory per archiviare le chiavi e la configurazione relative a Concourse CI.
sudo mkdir /opt/concourse
Genera le chiavi richieste.
sudo ssh-keygen -t rsa -q -N '' -f /opt/concourse/session_signing_key
sudo ssh-keygen -t rsa -q -N '' -f /opt/concourse/tsa_host_key
sudo ssh-keygen -t rsa -q -N '' -f /opt/concourse/worker_key
Autorizzare la chiave pubblica dei lavoratori copiandone il contenuto nel authorized_worker_keys
file.
sudo cp /opt/concourse/worker_key.pub /opt/concourse/authorized_worker_keys
Concourse iniziale
Concourse fornisce due componenti separati che devono essere avviati: il web e il lavoratore. Avvia il Web Concourse.
sudo concourse web \
--basic-auth-username admin \
--basic-auth-password StrongPass \
--session-signing-key /opt/concourse/session_signing_key \
--tsa-host-key /opt/concourse/tsa_host_key \
--tsa-authorized-keys /opt/concourse/authorized_worker_keys \
--postgres-user=concourse \
--postgres-password=DBPassword \
--postgres-database=concourse \
--external-url http://192.0.2.1:8080
Modificare il nome utente e la password del basic-auth
se desiderato. Assicurarsi che il percorso dei file chiave sia corretto e assicurarsi che sia fornito il valore corretto per nome utente e password nella configurazione del database PostgreSQL.
Nota : ATC ascolterà la porta predefinita 8080
e TSA ascolterà la porta 2222
. Se non si desidera l'autenticazione, passare l' --no-really-i-dont-want-any-auth
opzione dopo aver rimosso le opzioni di autenticazione di base.
Una volta avviato il web server, verrà visualizzato il seguente output.
{"timestamp":"1503657859.661247969","source":"tsa","message":"tsa.listening","log_level":1,"data":{}}
{"timestamp":"1503657859.666907549","source":"atc","message":"atc.listening","log_level":1,"data":{"debug":"127.0.0.1:8079","http":"0.0.0.0:8080"}}
Arrestare il server per ora, poiché è ancora necessario configurare alcune altre cose.
Avviare Concourse CI Worker.
sudo concourse worker \
--work-dir /opt/concourse/worker \
--tsa-host 127.0.0.1 \
--tsa-public-key /opt/concourse/tsa_host_key.pub \
--tsa-worker-private-key /opt/concourse/worker_key
Il comando sopra presupporrà che TSA sia in esecuzione su localhost e ascolti la porta predefinita 2222
.
Sebbene Concourse web e worker possano essere avviati facilmente utilizzando i comandi precedenti, si consiglia di utilizzare Systemd per gestire il server.
L'uso del servizio Systemd per la gestione dell'applicazione garantisce che l'applicazione venga avviata automaticamente in caso di errori e all'avvio. Il server Concourse non accetta i dati da nessun file di configurazione, ma può accedere ai dati dalle variabili di ambiente. Invece di impostare le variabili di ambiente globali, creare un nuovo file per archiviare le variabili di ambiente e quindi passare le variabili all'IC Concourse utilizzando il servizio Systemd.
Crea un nuovo file di ambiente per Concourse web.
sudo nano /opt/concourse/web.env
Popolare il file.
CONCOURSE_SESSION_SIGNING_KEY=/opt/concourse/session_signing_key
CONCOURSE_TSA_HOST_KEY=/opt/concourse/tsa_host_key
CONCOURSE_TSA_AUTHORIZED_KEYS=/opt/concourse/authorized_worker_keys
CONCOURSE_POSTGRES_USER=concourse
CONCOURSE_POSTGRES_PASSWORD=DBPassword
CONCOURSE_POSTGRES_DATABASE=concourse
CONCOURSE_BASIC_AUTH_USERNAME=admin
CONCOURSE_BASIC_AUTH_PASSWORD=StrongPass
CONCOURSE_EXTERNAL_URL=http://192.0.2.1:8080
Modificare il nome utente e la password del BASIC_AUTH
se desiderato. Assicurarsi che il percorso dei file chiave sia corretto e assicurarsi che sia fornito il valore corretto per nome utente e password nella configurazione del database PostgreSQL.
Allo stesso modo, creare un file di ambiente per il lavoratore.
sudo nano /opt/concourse/worker.env
Popolare il file.
CONCOURSE_WORK_DIR=/opt/concourse/worker
CONCOURSE_TSA_WORKER_PRIVATE_KEY=/opt/concourse/worker_key
CONCOURSE_TSA_PUBLIC_KEY=/opt/concourse/tsa_host_key.pub
CONCOURSE_TSA_HOST=127.0.0.1
Poiché i file di ambiente contengono nomi utente e password, modificane le autorizzazioni in modo che non possano accedervi da altri utenti.
sudo chmod 600 /opt/concourse/*.env
Ora crea un nuovo utente per Concourse per eseguire l'ambiente web. Ciò garantirà che il server Web sia in esecuzione in un ambiente isolato.
sudo useradd concourse
Assegnare all'utente dell'atrio la proprietà della directory del file Concourse CI.
sudo chown -R concourse:concourse /opt/concourse
Creare un nuovo file di servizio systemd per il servizio Web Concourse.
sudo nano /etc/systemd/system/concourse-web.service
Popolare il file.
[Unit]
Description=Concourse CI web server
[Service]
Type=simple
User=concourse
Group=concourse
Restart=on-failure
EnvironmentFile=/opt/concourse/web.env
ExecStart=/usr/bin/concourse web
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=concourse_web
[Install]
WantedBy=multi-user.target
Salva e chiudi il file. Creare un nuovo file di servizio per il servizio di lavoratore Concourse.
sudo nano /etc/systemd/system/concourse-worker.service
Popolare il file.
[Unit]
Description=Concourse CI worker process
[Service]
Type=simple
Restart=on-failure
EnvironmentFile=/opt/concourse/worker.env
ExecStart=/usr/bin/concourse worker
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=concourse_worker
[Install]
WantedBy=multi-user.target
Il servizio Web e di lavoro ora può essere avviato direttamente.
sudo systemctl start concourse-web concourse-worker
Per abilitare l'avvio automatico del processo di lavoro e Web all'avvio, eseguire quanto segue.
sudo systemctl enable concourse-worker concourse-web
Per verificare lo stato dei servizi, eseguire quanto segue.
sudo systemctl status concourse-worker concourse-web
Se il servizio non è avviato o nello FAILED
stato, rimuovere la cache dalla /tmp
directory.
sudo rm -rf /tmp/*
Riavvia i servizi.
sudo systemctl restart concourse-worker concourse-web
Si noti che questa volta i servizi sono stati avviati correttamente. L'output al momento della verifica dello stato dei servizi sarà simile al seguente.
[user@vultr ~]$ sudo systemctl status concourse-worker concourse-web
● concourse-worker.service - Concourse CI worker process
Loaded: loaded (/etc/systemd/system/concourse-worker.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2017-08-26 07:27:37 UTC; 55s ago
Main PID: 3037 (concourse)
CGroup: /system.slice/concourse-worker.service
└─3037 /usr/bin/concourse worker
Aug 26 07:27:42 vultr.guest concourse_worker[3037]: {"timestamp":"1503732462.934722900","source":"tsa","message":"t...""}}
Aug 26 07:27:42 vultr.guest concourse_worker[3037]: {"timestamp":"1503732462.941227913","source":"guardian","messag...0"}}
...
● concourse-web.service - Concourse CI web server
Loaded: loaded (/etc/systemd/system/concourse-web.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2017-08-26 07:27:37 UTC; 55s ago
Main PID: 3036 (concourse)
CGroup: /system.slice/concourse-web.service
└─3036 /usr/bin/concourse web
Aug 26 07:27:57 vultr.guest concourse_web[3036]: {"timestamp":"1503732477.925554752","source":"tsa","message":"tsa...ve"}}
Aug 26 07:28:02 vultr.guest concourse_web[3036]: {"timestamp":"1503732482.925430775","source":"tsa","message":"tsa...ve"}}
...
Hint: Some lines were ellipsized, use -l to show in full.
Connessione al server
Una volta avviato il server, è possibile accedere all'interfaccia Web di Concourse CI accedendo a http://192.0.2.1:8080
qualsiasi browser. Accedi utilizzando il nome utente e la password forniti nel file di ambiente.
Per connettersi al server tramite Fly, eseguire quanto segue.
fly -t my-ci login -c http://192.0.2.1:8080
Il comando precedente viene utilizzato per l'accesso iniziale al server. -t
viene utilizzato per fornire un nome di destinazione. sostituire my-ci
con qualsiasi nome di destinazione desiderato. Il comando sopra accederà al team predefinito main
. Chiederà il nome utente e la password forniti nel file di ambiente.
L'output sarà simile al seguente.
[user@vultr ~]$ fly -t my-ci login -c http://192.0.2.1:8080
logging in to team 'main'
username: admin
password:
target saved
L'accesso target verrà salvato per un giorno. Successivamente, scadrà.
Per disconnettersi immediatamente.
fly -t my-ci logout
Fly può essere utilizzato per accedere al server al di fuori della rete, ma solo se il server ha un indirizzo IP pubblico ed è accessibile dall'esterno della rete. Il file binario Windows o MacOS può essere scaricato dal sito di download o dall'interfaccia utente Web del server.
Impostazione del proxy inverso Nginx
Gli accessi e altre informazioni inviate tramite l'interfaccia utente Web al server Concourse non sono protetti. La connessione non è crittografata. Un proxy inverso Nginx può essere impostato con un SSL gratuito Let's Encrypt.
Installa Nginx.
sudo apt -y install nginx
Avvia Nginx e abilita l'avvio automatico all'avvio.
sudo systemctl start nginx
sudo systemctl enable nginx
Aggiungi il repository Certbot.
sudo add-apt-repository --yes ppa:certbot/certbot
sudo apt-get update
Installa Certbot, che è l'applicazione client per Let's Encrypt CA.
sudo apt -y install certbot
Nota : per ottenere certificati da Let's Encrypt CA, il dominio per il quale devono essere generati i certificati deve essere puntato verso il server. In caso contrario, apportare le modifiche necessarie ai record DNS del dominio e attendere la propagazione del DNS prima di effettuare nuovamente la richiesta di certificato. Certbot controlla l'autorità di dominio prima di fornire i certificati.
Genera i certificati SSL.
sudo certbot certonly --webroot -w /var/www/html -d ci.example.com
È probabile che i certificati generati siano archiviati nella /etc/letsencrypt/live/ci.example.com/
directory. Il certificato SSL verrà archiviato come fullchain.pem
e la chiave privata verrà archiviata come privkey.pem
.
Let's Encrypt certificati scadranno tra 90 giorni, quindi si consiglia il rinnovo automatico per i certificati è impostato usando cronjobs. Cron è un servizio di sistema che viene utilizzato per eseguire attività periodiche.
Apri il file di lavoro cron.
sudo crontab -e
Aggiungi la seguente riga alla fine del file.
30 5 * * * /usr/bin/certbot renew --quiet
Il processo cron sopra riportato verrà eseguito ogni giorno alle 5:30. Se il certificato è in scadenza, verrà automaticamente rinnovato.
Crea un nuovo host virtuale.
sudo nano /etc/nginx/sites-available/concourse
Popolare il file.
server {
listen 80;
server_name ci.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443;
server_name ci.example.com;
ssl_certificate /etc/letsencrypt/live/ci.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ci.example.com/privkey.pem;
ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/concourse.access.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:8080;
proxy_read_timeout 90;
proxy_redirect http://localhost:8080 https://ci.example.com;
}
}
Nota : sostituire ci.example.com
con il dominio effettivo.
Attiva il file di configurazione.
sudo ln -s /etc/nginx/sites-available/concourse /etc/nginx/sites-enabled/concourse
Modifica il file Environment creato per l'atrio Web.
sudo nano /opt/concourse/web.env
Modifica il valore di CONCOURSE_EXTERNAL_URL
e aggiungi anche altre due righe alla fine del file.
CONCOURSE_EXTERNAL_URL=https://ci.example.com
CONCOURSE_BIND_IP=127.0.0.1
CONCOURSE_BIND_PORT=8080
Salvare il file e riavviare Concourse Web, Worker e Nginx.
sudo systemctl restart concourse-worker concourse-web nginx
Tutti i dati inviati da e verso il browser sono ora protetti con crittografie SSL.