Увод
Предуслови
Инсталирајте и конфигуришите ПостгреСКЛ базу података
Преузмите и инсталирајте Цонцоурсе ЦИ
Генеришите и подесите РСА кључеве
Стартинг Цонцоурс
Конфигуришите окружење и Системд услугу
Повезивање са сервером
Подешавање Нгинк обрнутог проксија
Увод
Континуирана интеграција је ДевОпс пракса развоја софтвера која омогућава програмерима да често спајају модификовани код у заједничко складиште много пута дневно. Након сваког спајања, изводе се аутоматске израде и тестови да би се открили проблеми у коду. Омогућава програмерима да брзо пронађу и отклоне грешке како би побољшали квалитет софтвера и обезбедили континуирану испоруку софтвера. Пребацивање са Цонцоурсе-а на и назад је веома једноставно јер сву своју конфигурацију чува у декларативним датотекама које се могу проверити у контроли верзија. Такође обезбеђује веб кориснички интерфејс који интерактивно приказује информације о изградњи.
Цонцоурсе Цомпонентс.
- АТЦ је главна компонента Цонцоурса. Одговоран је за покретање веб корисничког интерфејса и АПИ-ја. Такође се брине о целокупном распореду цевовода.
- ТСА је прилагођени ССХ сервер. Одговоран је за безбедну регистрацију радника у АТЦ-у.
- Радници даље воде две различите услуге:
- Гарден је време извођења контејнера и интерфејс за даљинско оркестрирање контејнера на раднику.
- Баггагецлаим је сервер за управљање кешом и артефактима.
- Фли је интерфејс командне линије који се користи за интеракцију са АТЦ-ом за конфигурисање Цонцоурсе Пипелинеа.
Предуслови
Обавезно замените сва појављивања 192.0.2.1и ci.example.comса својом стварном Вултр јавном ИП адресом и стварним именом домена.
Ажурирајте свој основни систем помоћу водича Како да ажурирате ЦентОС 7 . Када је ваш систем ажуриран, наставите да инсталирате ПостгреСКЛ.
Инсталирајте и конфигуришите ПостгреСКЛ базу података
ПостгреСКЛ је објектно релациони систем базе података. Цонцоурсе складишти своје податке цевовода у ПостгреСКЛ базу података. Додајте ПостгреСКЛ спремиште.
sudo rpm -Uvh https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
Инсталирајте ПостгреСКЛ сервер базе података.
sudo yum -y install postgresql96-server postgresql96-contrib
Иницијализујте базу података.
sudo /usr/pgsql-9.6/bin/postgresql96-setup initdb
initdbкреира нови кластер ПостгреСКЛ базе података, који је колекција база података којима управља једна инстанца сервера. Уредите pg_hba.confдатотеку да бисте омогућили аутентификацију засновану на МД5.
sudo nano /var/lib/pgsql/9.6/data/pg_hba.conf
Пронађите следеће редове и промените вредности peerи identу METHODколони у trustи md5, респективно.
# 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
Након ажурирања, конфигурација би требало да изгледа овако.
# 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
Покрените ПостгреСКЛ сервер и омогућите му да се аутоматски покреће при покретању.
sudo systemctl start postgresql-9.6
sudo systemctl enable postgresql-9.6
Промените лозинку за подразумеваног корисника ПостгреСКЛ.
sudo passwd postgres
Пријавите се као ПостгреСКЛ корисник:
sudo su - postgres
Креирајте новог ПостгреСКЛ корисника за Цонцоурсе ЦИ.
createuser concourse
Напомена : Подразумевани ПостгреСКЛ корисник се може користити за аутентификацију базе података, али се препоручује коришћење наменског корисника за аутентификацију Цонцоурсе базе података у производном подешавању.
ПостгреСКЛ обезбеђује љуску за покретање упита у бази података. Пребаците се на ПостгреСКЛ шкољку тако што ћете покренути:
psql
Поставите лозинку за новокреираног корисника базе података Цонцоурсе.
ALTER USER concourse WITH ENCRYPTED password 'DBPassword';
Важно : Замените DBPasswordјаком лозинком. Забележите лозинку јер ће бити потребна касније у водичу.
Креирајте нову базу података за Цонцоурсе.
CREATE DATABASE concourse OWNER concourse;
Изађите из psqlљуске.
\q
Пребаците се на судо корисника са тренутног постгрес корисника.
exit
Преузмите и инсталирајте Цонцоурсе ЦИ
Преузмите најновију верзију извршног програма Цонцоурсе и сачувајте га /usr/binтако да се може директно извршити. Најновија верзија Цонцоурсе и Фли бинарних датотека може се наћи на страници за преузимање Цонцоурсе . Нова издања су веома честа. Замените везу испод новом везом за најновију верзију.
sudo wget https://github.com/concourse/concourse/releases/download/v3.4.1/concourse_linux_amd64 -O /usr/bin/concourse
Слично томе, преузмите најновију верзију извршне датотеке за летење и сачувајте је у /usr/bin.
sudo wget https://github.com/concourse/concourse/releases/download/v3.4.1/fly_linux_amd64 -O /usr/bin/fly
Фли је интерфејс командне линије за повезивање са АТЦ АПИ-јем Цонцоурсе ЦИ. Фли је доступан за више платформи као што су Линук, Виндовс и МацОС.
Доделите дозволу за извршавање преузетим concourseи flyбинарним датотекама.
sudo chmod +x /usr/bin/concourse /usr/bin/fly
Проверите да ли Цонцоурсе и Фли раде исправно тако што ћете проверити њихову верзију.
concourse -version
fly -version
Генеришите и подесите РСА кључеве
РСА парови кључева обезбеђују начин за шифровање комуникације између компоненти Цонцоурсе-а.
Да би Цонцоурсе радио, морају се генерисати најмање три пара кључева. За шифровање података сесије, генеришите session_signing_key. Овај кључ ће такође користити ТСА за потписивање захтева које упути АТЦ-у. Да бисте обезбедили ТСА ССХ сервер, генеришите tsa_host_key. На крају, генеришите worker_keyза сваког радника.
Креирајте нови директоријум за чување кључева и конфигурације у вези са Цонцоурсе ЦИ.
sudo mkdir /opt/concourse
Генеришите потребне кључеве.
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
Овластите јавни кључ радника копирањем његовог садржаја у authorized_worker_keysдатотеку:
sudo cp /opt/concourse/worker_key.pub /opt/concourse/authorized_worker_keys
Стартинг Цонцоурс
Цонцоурсе пружа две одвојене компоненте које треба покренути, веб и радника. Покрените веб Цонцоурсе.
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
Промените корисничко име и лозинку basic-authако желите. Уверите се да је путања до датотека са кључевима исправна и да ли је наведена тачна вредност за корисничко име и лозинку у конфигурацији ПостгреСКЛ базе података.
Напомена : АТЦ ће слушати подразумевани порт, 8080а ТСА ће слушати порт 2222. Ако аутентификација није пожељна, проследите --no-really-i-dont-want-any-authопцију након што уклоните основне опције аутентификације .
Once the web server is started, the following output should be displayed.
{"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"}}
Stop the server for now, as a few more things still must be setup.
Start the 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
The above command will assume that the TSA is running on localhost and listening to the default port 2222.
Though the Concourse web and worker can be started easily using the commands above, it is recommended to use Systemd to manage the server.
Using Systemd service for managing the application ensures that the application is automatically started on failures and at boot time. The Concourse server does not take data from any configuration file, but it can access the data from environment variables. Instead of setting global environment variables, create a new file to store the environment variables and then pass the variables to the Concourse CI using the Systemd service.
Create a new environment file for Concourse web.
sudo nano /opt/concourse/web.env
Populate the 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
Change the username and password of the BASIC_AUTH if desired. Make sure that the path to the key files are correct and make sure that the correct value for username and password in the PostgreSQL database configuration is provided.
Similarly, create an environment file for the worker.
sudo nano /opt/concourse/worker.env
Populate the 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
As the environment files contain username and passwords, change its permissions so that it cannot be accessed by other users.
sudo chmod 600 /opt/concourse/*.env
Now create a new user for Concourse to run the web environment. This will ensure that the web server is running in an isolated environment.
sudo adduser --system concourse
Give the concourse user ownership over Concourse CI file's directory.
sudo chown -R concourse:concourse /opt/concourse
Create a new systemd service file for the Concourse web service.
sudo nano /etc/systemd/system/concourse-web.service
Populate the 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
Save and close the file. Create a new service file for the Concourse worker service.
sudo nano /etc/systemd/system/concourse-worker.service
Populate the 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
The web and worker service can now be started directly by running:
sudo systemctl start concourse-web concourse-worker
To enable the worker and web process to automatically start at boot time, run:
sudo systemctl enable concourse-worker concourse-web
To check the status of services, run:
sudo systemctl status concourse-worker concourse-web
If the service is not started, or in the FAILED state, remove the cache from the /tmp directory.
sudo rm -rf /tmp/*
Restart the services.
sudo systemctl restart concourse-worker concourse-web
Notice that this time the services have started correctly. The output upon verifying the status of the services should be simil.
[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.
Adjust your firewall to allow port 8080, on which ATS is running and port 2222, on which TSA is running.
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --zone=public --add-port=2222/tcp --permanent
sudo firewall-cmd --reload
Connecting to the Server
Once the server is started, the web interface of the Concourse CI can be accessed by going to http://192.0.2.1:8080 in any browser. Log in using the username and password provided in the environment file.
To connect to the server using Fly, run:
fly -t my-ci login -c http://192.0.2.1:8080
The above command is used for initial login to the server. -t is used to provide a target name. replace my-ci with any desired target name. The above command will log in to the default team main. It will ask for the username and password provided in the environment file.
The output will look like the following.
[user@vultr ~]$ fly -t my-ci login -c http://192.0.2.1:8080
logging in to team 'main'
username: admin
password:
target saved
The target login will be saved for a day. After that, it will expire.
To log out immediately.
fly -t my-ci logout
fly can be used to login to the server outside of the network, but only if the server has a public IP address and it is accessible from outside the network. The Windows or MacOS binary can be downloaded from the download site or from the web UI of the server.
Setting Up Nginx Reverse Proxy
Logins, and other information sent through the web UI to the Concourse server is not secured. The connection is not encrypted. An Nginx reverse proxy can be set up with a Let's Encrypt free SSL.
Install the Nginx web server and Certbot, which is the client application for the Let's Encrypt CA.
sudo yum -y install certbot-nginx nginx
Start and enable Nginx to automatically start at boot time:
sudo systemctl start nginx
sudo systemctl enable nginx
Пре него што се може упутити захтев за сертификате, порт 80 и 443, или стандардне ХТТП и ХТТПС услуге, морају бити омогућени преко заштитног зида. Цертбот ће проверити ауторитет домена пре издавања сертификата.
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
Порт 8080 више не треба да буде дозвољен кроз заштитни зид јер ће Цонцоурсе сада бити покренут на стандардном ХТТПС порту. Уклоните унос заштитног зида да бисте дозволили порт 8080.
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload
Белешка
To obtain certificates from Let's Encrypt CA, the domain for which the certificates are to be generated must be pointed towards the server. If not, make the necessary changes to the DNS records of the domain and wait for the DNS to propagate before making the certificate request again. Certbot checks the domain authority before providing the certificates.
Генеришите ССЛ сертификате.
sudo certbot certonly --webroot -w /usr/share/nginx/html -d ci.example.com
Генерисани сертификати ће вероватно бити ускладиштени у /etc/letsencrypt/live/ci.example.com/директоријуму. ССЛ сертификат ће бити сачуван као, fullchain.pemа приватни кључ ће бити сачуван као privkey.pem.
Лет'с Енцрипт сертификати истичу за 90 дана, па се препоручује да се аутоматско обнављање сертификата подеси помоћу цроњобс-а. Црон је системска услуга која се користи за извршавање периодичних задатака.
Отворите црон датотеку посла.
sudo crontab -e
Додајте следећи ред на крај датотеке.
30 5 * * 1 /usr/bin/certbot renew --quiet
Горњи црон посао ће се изводити сваког понедељка у 5:30. Ако сертификат истекне, аутоматски ће се обновити.
Креирајте нови виртуелни хост.
sudo nano /etc/nginx/conf.d/concourse-ssl.conf
Попуните датотеку.
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;
}
}
Напомена : Замените ci.example.comстварним доменом.
Уредите датотеку окружења креирану за веб скуп.
sudo nano /opt/concourse/web.env
Промените вредност CONCOURSE_EXTERNAL_URLи такође додајте још два реда на крају датотеке.
CONCOURSE_EXTERNAL_URL=https://ci.example.com
CONCOURSE_BIND_IP=127.0.0.1
CONCOURSE_BIND_PORT=8080
Сачувајте датотеку и поново покрените Цонцоурсе Веб, Воркер и Нгинк веб сервер:
sudo systemctl restart concourse-worker concourse-web nginx
Сви подаци који се шаљу у и из претраживача су сада заштићени ССЛ енкрипцијом.