Как да инсталирате и конфигурирате Concourse CI на Ubuntu 16.04

Въведение

Непрекъснатата интеграция е практика за разработка на софтуер DevOps, която позволява на разработчиците често да обединяват модифицирания код в споделеното хранилище много пъти на ден. След всяко сливане се извършват автоматични компилации и тестове за откриване на проблеми в кода. Той позволява на разработчиците да намират и разрешават бързо грешките, за да подобрят качеството на софтуера и да осигурят непрекъсната доставка на софтуера. Превключването насам-натам от Concourse е много лесно, тъй като запазва цялата си конфигурация в декларативни файлове, които могат да бъдат проверени в контрола на версиите. Той също така предоставя уеб потребителски интерфейс, който показва интерактивно информацията за изграждане.

Компоненти на зала.
  • ATC е основният компонент на Concourse. Той отговаря за работата на уеб потребителския интерфейс и API. Той също така се грижи за цялото планиране на тръбопровода.
  • TSA е персонализиран SSH сървър. Той отговаря за сигурното регистриране на работник в ATC.
  • Освен това Workers управлява две различни услуги:
    1. Garden е среда за изпълнение на контейнери и интерфейс за дистанционно организиране на контейнери на работник.
    2. Baggageclaim е сървър за управление на кеша и артефакти.
  • Fly е интерфейс на командния ред, използван за взаимодействие с ATC за конфигуриране на Concourse Pipelines.

Предпоставки

Не забравяйте да замените всички поява на 192.0.2.1 и ci.example.com с вашия действителен публичен IP адрес на Vultr и действителното име на домейн.

Актуализирайте базовата си система с помощта на ръководството Как да актуализирате Ubuntu 16.04 . След като вашата система бъде актуализирана, продължете да инсталирате PostgreSQL.

Инсталирайте и конфигурирайте PostgreSQL база данни

PostgreSQL е система за обектна релационна база данни. Concourse съхранява своите тръбопроводни данни в PostgreSQL база данни. Добавете хранилището на 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

Инсталирайте сървъра на база данни PostgreSQL.

sudo apt -y install postgresql

Стартирайте PostgreSQL сървъра и го активирайте да стартира автоматично при стартиране.

sudo systemctl start postgresql
sudo systemctl enable postgresql

Променете паролата за потребителя на PostgreSQL по подразбиране.

sudo passwd postgres

Влезте като потребител на PostgreSQL:

sudo su - postgres

Създайте нов потребител на PostgreSQL за Concourse CI.

createuser concourse

Забележка : Потребителят на PostgreSQL по подразбиране може да се използва за удостоверяване на базата данни, но се препоръчва да се използва специален потребител за удостоверяване на базата данни Concourse в производствена настройка.

PostgreSQL предоставя обвивка за изпълнение на заявки към базата данни. Превключете към обвивката на PostgreSQL.

psql

Задайте парола за новосъздадения потребител на база данни Concourse.

ALTER USER concourse WITH ENCRYPTED password 'DBPassword';

Важно : Заменете DBPassword със силна парола. Запишете си паролата, тъй като тя ще се изисква по-късно в урока.

Създайте нова база данни за Concourse.

CREATE DATABASE concourse OWNER concourse;

Излезте от psql черупката.

\q

Превключете към потребителя sudo от текущия postgresпотребител.

exit

Изтеглете и инсталирайте Concourse CI

Изтеглете най-новата версия на изпълнимия файл Concourse и го съхранете /usr/bin , за да може да се изпълнява директно. Най-новата версия на двоичните файлове Concourse и Fly може да бъде намерена на страницата за изтегляне на Concourse . Новите издания са много чести. Заменете връзката по-долу с новата връзка за най-новата версия.

sudo wget https://github.com/concourse/concourse/releases/download/v3.10.0/concourse_linux_amd64 -O /usr/bin/concourse

По същия начин изтеглете най-новата версия на изпълнимия файл fly и го запазете в /usr/bin.

sudo wget https://github.com/concourse/concourse/releases/download/v3.10.0/fly_linux_amd64 -O /usr/bin/fly

Fly е интерфейсът на командния ред, използван за свързване към ATC API на Concourse CI. Fly се предлага за множество платформи като Linux, Windows и MacOS.

Задайте разрешение за изпълнение на изтеглените concourse и fly двоични файлове.

sudo chmod +x /usr/bin/concourse /usr/bin/fly

Проверете дали Concourse и Fly работят правилно, като проверите тяхната версия.

concourse -version
fly -version

Генериране и настройка на RSA ключове

RSA двойките ключове осигуряват начин за криптиране на комуникацията между компонентите на Concourse.

За да работи Concourse, трябва да се генерират поне три чифта ключове. За криптиране на данните за сесията генерирайте session_signing_key. Този ключ също ще се използва от TSA за подписване на заявките, които прави към ATC. За да защитите TSA SSH сървъра, генерирайте tsa_host_key. Накрая генерирайте worker_key за всеки работник.

Създайте нова директория за съхраняване на ключовете и конфигурацията, свързани с Concourse CI.

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

Начална зала

Concourse предоставя два отделни компонента, които трябва да бъдат стартирани: мрежата и работника. Стартирайте мрежата 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

Променете потребителското име и паролата на, basic-auth ако желаете. Уверете се, че пътят към ключовите файлове е правилен и се уверете, че е предоставена правилната стойност за потребителско име и парола в конфигурацията на базата данни PostgreSQL.

Забележка : ATC ще слуша порта по подразбиране, 8080 а TSA ще слуша порта 2222. Ако удостоверяването не е желано, предайте --no-really-i-dont-want-any-authопцията, след като премахнете основните опции за удостоверяване.

След като уеб сървърът бъде стартиран, ще се покаже следният изход.

{"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"}}

Спрете сървъра засега, тъй като трябва да се настроят още няколко неща.

Стартирайте 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

Горната команда ще приеме, че TSA работи на localhost и слуша порта по подразбиране 2222.

Въпреки че Concourse web и worker могат да бъдат стартирани лесно с помощта на командите по-горе, се препоръчва използването на Systemd за управление на сървъра.

Конфигурирайте среда и услуга Systemd

Използването на услугата Systemd за управление на приложението гарантира, че приложението се стартира автоматично при неуспехи и по време на зареждане. Сървърът Concourse не взема данни от нито един конфигурационен файл, но има достъп до данните от променливи на средата. Вместо да задавате глобални променливи на средата, създайте нов файл за съхраняване на променливите на средата и след това предайте променливите на Concourse CI с помощта на услугата Systemd.

Създайте нов файл на средата за Concourse web.

sudo nano /opt/concourse/web.env

Попълнете файла.

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 usernames 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 useradd 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

[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

[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

The web and worker service can now be started directly.

sudo systemctl start concourse-web concourse-worker

To enable the worker and web process to automatically start at boot time, run the following.

sudo systemctl enable concourse-worker concourse-web

To check the status of services, run the following.

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 will be similar to the following.

[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.

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 the following.

fly -t my-ci login -c http://192.0.2.1:8080

The above command is used for the 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

Входовете и друга информация, изпратена през уеб потребителския интерфейс до сървъра на Concourse, не са защитени. Връзката не е криптирана. Обратно прокси Nginx може да бъде настроено с безплатен SSL Let's Encrypt.

Инсталирайте Nginx.

sudo apt -y install nginx

Стартирайте Nginx и го активирайте да стартира автоматично при стартиране.

sudo systemctl start nginx
sudo systemctl enable nginx

Добавете хранилището на Certbot.

sudo add-apt-repository --yes ppa:certbot/certbot
sudo apt-get update

Инсталирайте Certbot, което е клиентското приложение за Let's Encrypt CA.

sudo apt -y install certbot

Забележка : За да получите сертификати от Let's Encrypt CA, домейнът, за който трябва да се генерират сертификатите, трябва да бъде насочен към сървъра. Ако не, направете необходимите промени в DNS записите на домейна и изчакайте DNS да се разпространи, преди да направите отново заявка за сертификат. Certbot проверява авторитета на домейна, преди да предостави сертификатите.

Генерирайте SSL сертификати.

sudo certbot certonly --webroot -w /var/www/html -d ci.example.com

Генерираните сертификати вероятно ще се съхраняват в /etc/letsencrypt/live/ci.example.com/ директорията. SSL сертификатът ще се съхранява като, fullchain.pem а частният ключ ще се съхранява като privkey.pem.

Сертификатите Let's Encrypt изтичат след 90 дни, така че се препоръчва автоматичното подновяване на сертификатите да се настрои с помощта на cronjobs. Cron е системна услуга, която се използва за изпълнение на периодични задачи.

Отворете файла за задание на cron.

sudo crontab -e

Добавете следния ред в края на файла.

30 5 * * * /usr/bin/certbot renew --quiet

Горната задача на cron ще се изпълнява всеки ден в 5:30 сутринта. Ако сертификатът изтича, той автоматично ще бъде подновен.

Създайте нов виртуален хост.

sudo nano /etc/nginx/sites-available/concourse

Попълнете файла.

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 ln -s /etc/nginx/sites-available/concourse /etc/nginx/sites-enabled/concourse

Редактирайте файла на средата, създаден за Concours Web.

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

Запазете файла и рестартирайте Concourse Web, Worker и Nginx.

sudo systemctl restart concourse-worker concourse-web nginx

Всички данни, изпращани към и от браузъра, вече са защитени със SSL криптиране.


Как да инсталирате Jenkins на CentOS 7

Как да инсталирате Jenkins на CentOS 7

Jenkins е популярен инструмент за CI (непрекъсната интеграция) с отворен код, който се използва широко за разработване, внедряване и автоматизация на проекти. Тази статия ще

Как да инсталирате и конфигурирате Concourse CI на Ubuntu 16.04

Как да инсталирате и конфигурирате Concourse CI на Ubuntu 16.04

Използване на различна система? Въведение Непрекъснатата интеграция е практика за разработка на софтуер DevOps, която позволява на разработчиците често да обединяват

Как да инсталирате и конфигурирате Ansible на Debian 9 за използване с Windows Server

Как да инсталирате и конфигурирате Ansible на Debian 9 за използване с Windows Server

Използване на различна система? Ansible е инструмент с отворен код за автоматизиране на задачи. Той управлява конфигурацията на вашите Linux и Windows сървъри. Да работи

Как да инсталирате и конфигурирате GoCD на CentOS 7

Как да инсталирате и конфигурирате GoCD на CentOS 7

Използване на различна система? GoCD е система за непрекъсната доставка и автоматизация с отворен код. Той ви позволява да моделирате сложни работни потоци, като използвате неговия паралел

Използване на SaltStack с стълбове в Ubuntu 17.04

Използване на SaltStack с стълбове в Ubuntu 17.04

Докато SaltStack е чудесен инструмент за изпълнение на операции на много сървъри едновременно, той също така поддържа предварително зададени конфигурационни настройки за всеки хост, съхранявани в

Как да инсталирате и конфигурирате Ansible на CentOS 7 за използване с Windows Server

Как да инсталирате и конфигурирате Ansible на CentOS 7 за използване с Windows Server

Използване на различна система? Ansible е инструмент с отворен код за автоматизиране на задачи. Той управлява конфигурацията на вашите Linux и Windows сървъри. Да работи

Как да инсталирате Drone CI на Ubuntu 18.04

Как да инсталирате Drone CI на Ubuntu 18.04

Въведение Drone е автоматизирана, непрекъсната платформа за тестване и доставка, която работи на вашата собствена инфраструктура. Дрон поддържа всеки език, услуга o

Балансьори на натоварване Vultr

Балансьори на натоварване Vultr

Какво е Load Balancer Балансьорите на натоварване седят пред вашето приложение и разпределят входящия трафик между множество инстанции на вашето приложение. Fo

Как да инсталирате Foreman на CentOS 7

Как да инсталирате Foreman на CentOS 7

Използване на различна система? Foreman е безплатен инструмент с отворен код, който ви помага с конфигурирането и управлението на физически и виртуални сървъри. Forema

Как да инсталирате SaltStack на CentOS 7

Как да инсталирате SaltStack на CentOS 7

SaltStack, или Salt, е популярно решение за управление на конфигурация с отворен код, което може да се използва за внедряване на отдалечено изпълнение, управление на конфигурация, cod

Как да инсталирате Strider CD на Ubuntu 18.04

Как да инсталирате Strider CD на Ubuntu 18.04

Въведение Strider CD е платформа за непрекъснато внедряване с отворен код. Приложението е написано на Node.js и използва MongoDB като бекенд за съхранение. Разкрачвайте се

Използване на Chocolatey Package Manager в Windows

Използване на Chocolatey Package Manager в Windows

Въведение Chocolatey предоставя управление на пакети, което прави администрирането на софтуер и зависимостите лесно в Linux, на Windows. Можете бързо и лесно

Създаване на моментни снимки с Packer

Създаване на моментни снимки с Packer

Какво е Packer? Packer е инструмент за създаване на сървърни изображения, разработен от HashiCorp. Изобразяване на сървър; или алтернативно, неизменна инфраструктура; е популярна алтернатива

Как да инсталирате и конфигурирате Concourse CI на CentOS 7

Как да инсталирате и конфигурирате Concourse CI на CentOS 7

Използване на различна система? Въведение Непрекъснатата интеграция е практика за разработка на софтуер DevOps, която позволява на разработчиците често да обединяват

Използване на Chef-solo за конфигуриране на приложение Django в Ubuntu

Използване на Chef-solo за конфигуриране на приложение Django в Ubuntu

Има много начини за автоматизиране на процеса на настройка и конфигуриране на кутия. По каквато и да е причина, ако цялата ни система в този момент се състои от справедливи

Как да инсталирате Foreman на Ubuntu 16.04 LTS

Как да инсталирате Foreman на Ubuntu 16.04 LTS

Използване на различна система? Foreman е безплатен инструмент с отворен код, който ви помага с конфигурирането и управлението на физически и виртуални сървъри. Forema

Първи стъпки със SaltStack в Ubuntu 17.04

Първи стъпки със SaltStack в Ubuntu 17.04

SaltStack е базирана на Python програма за управление на конфигурацията, която е оптимизирана за автоматизиране на конфигурационни файлове, внедряване и всичко друго.

Възходът на машините: Реални приложения на AI

Възходът на машините: Реални приложения на AI

Изкуственият интелект не е в бъдещето, тук е точно в настоящето. В този блог Прочетете как приложенията за изкуствен интелект са повлияли на различни сектори.

DDOS атаки: кратък преглед

DDOS атаки: кратък преглед

Вие също сте жертва на DDOS атаки и сте объркани относно методите за превенция? Прочетете тази статия, за да разрешите вашите запитвания.

Чудили ли сте се как хакерите печелят пари?

Чудили ли сте се как хакерите печелят пари?

Може би сте чували, че хакерите печелят много пари, но чудили ли сте се някога как печелят такива пари? нека обсъдим.

Революционни изобретения на Google, които ще улеснят живота ви.

Революционни изобретения на Google, които ще улеснят живота ви.

Искате ли да видите революционни изобретения на Google и как тези изобретения промениха живота на всяко човешко същество днес? След това прочетете в блога, за да видите изобретенията на Google.

Friday Essential: Какво се случи с колите, задвижвани от изкуствен интелект?

Friday Essential: Какво се случи с колите, задвижвани от изкуствен интелект?

Концепцията за самоуправляващи се автомобили да тръгват по пътищата с помощта на изкуствен интелект е мечта, която имаме от известно време. Но въпреки няколкото обещания, те не се виждат никъде. Прочетете този блог, за да научите повече…

Технологична сингулярност: далечно бъдеще на човешката цивилизация?

Технологична сингулярност: далечно бъдеще на човешката цивилизация?

Тъй като науката се развива с бързи темпове, поемайки много от нашите усилия, рискът да се подложим на необяснима сингулярност също нараства. Прочетете какво може да означава сингулярността за нас.

Еволюция на съхранението на данни – инфографика

Еволюция на съхранението на данни – инфографика

Методите за съхранение на данните може да се развиват от раждането на данните. Този блог обхваща развитието на съхранението на данни на базата на инфографика.

Функционалности на референтните архитектурни слоеве за големи данни

Функционалности на референтните архитектурни слоеве за големи данни

Прочетете блога, за да разберете различни слоеве в архитектурата на големи данни и техните функционалности по най-простия начин.

6 невероятни предимства от наличието на интелигентни домашни устройства в живота ни

6 невероятни предимства от наличието на интелигентни домашни устройства в живота ни

В този дигитално задвижван свят устройствата за интелигентен дом се превърнаха в решаваща част от живота. Ето няколко невероятни предимства на интелигентните домашни устройства за това как те правят живота ни струващ и по-опростен.

Актуализацията на допълнението на macOS Catalina 10.15.4 причинява повече проблеми, отколкото решава

Актуализацията на допълнението на macOS Catalina 10.15.4 причинява повече проблеми, отколкото решава

Наскоро Apple пусна macOS Catalina 10.15.4 допълнителна актуализация за отстраняване на проблеми, но изглежда, че актуализацията причинява повече проблеми, водещи до блокиране на mac машини. Прочетете тази статия, за да научите повече