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
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 CentOS 7 . 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.
sudo rpm -Uvh https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
Installa il server di database PostgreSQL.
sudo yum -y install postgresql96-server postgresql96-contrib
Inizializza il database.
sudo /usr/pgsql-9.6/bin/postgresql96-setup initdb
initdb
crea un nuovo cluster di database PostgreSQL, che è una raccolta di database gestiti da una singola istanza del server. Modifica il pg_hba.conf
file per abilitare l'autenticazione basata su MD5.
sudo nano /var/lib/pgsql/9.6/data/pg_hba.conf
Individuare le seguenti righe e modificare i valori peer
e ident
nella METHOD
colonna trust
e md5
, rispettivamente.
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all all ::1/128 ident
Una volta aggiornata, la configurazione dovrebbe apparire così.
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
Avviare il server PostgreSQL e abilitarlo ad avviarsi automaticamente all'avvio.
sudo systemctl start postgresql-9.6
sudo systemctl enable postgresql-9.6
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 eseguendo:
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 postgres corrente.
exit
Scarica e installa Concourse CI
Scarica l'ultima versione dell'eseguibile di 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.4.1/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.4.1/fly_linux_amd64 -O /usr/bin/fly
Fly è l'interfaccia della riga di comando 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 delle chiavi 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, dovrebbe essere 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 delle chiavi 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 nome 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 adduser --system 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
After=postgresql-9.6.service
[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
After=concourse-web.service
[Service]
Type=simple
User=root
Group=root
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 eseguendo:
sudo systemctl start concourse-web concourse-worker
Per abilitare l'avvio automatico del processo di lavoro e Web all'avvio, eseguire:
sudo systemctl enable concourse-worker concourse-web
Per verificare lo stato dei servizi, eseguire:
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 dovrebbe essere simile.
[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.
Regola il firewall per consentire la porta 8080, su cui è in esecuzione ATS e la porta 2222, su cui è in esecuzione TSA.
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --zone=public --add-port=2222/tcp --permanent
sudo firewall-cmd --reload
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:
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.
Installare il server Web Nginx e Certbot, che è l'applicazione client per Let's Encrypt CA.
sudo yum -y install certbot-nginx nginx
Avvia e abilita Nginx ad avviarsi automaticamente all'avvio:
sudo systemctl start nginx
sudo systemctl enable nginx
Prima di poter effettuare una richiesta per i certificati, è necessario abilitare attraverso il firewall le porte 80 e 443 o i servizi HTTP e HTTPS standard. Certbot controllerà l'autorità di dominio prima di emettere certificati.
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
La porta 8080 non deve più essere consentita attraverso il firewall poiché Concourse verrà ora eseguito sulla porta HTTPS standard. Rimuovere la voce del firewall per consentire la porta 8080.
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload
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 /usr/share/nginx/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 * * 1 /usr/bin/certbot renew --quiet
Il processo cron sopra riportato verrà eseguito ogni lunedì alle 5:30. Se il certificato è in scadenza, verrà automaticamente rinnovato.
Crea un nuovo host virtuale.
sudo nano /etc/nginx/conf.d/concourse-ssl.conf
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.
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 web server:
sudo systemctl restart concourse-worker concourse-web nginx
Tutti i dati inviati da e verso il browser sono ora protetti con crittografie SSL.