Как установить и настроить Concourse CI в Ubuntu 16.04

Вступление

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

Компоненты конкурса.
  • УВД является основным компонентом конкурса. Он отвечает за запуск веб-интерфейса и API. Это также заботится обо всем планировании трубопровода.
  • TSA - это пользовательский SSH-сервер. Он отвечает за безопасную регистрацию работника в УВД.
  • Кроме того, работники работают две разные службы:
    1. Garden - это среда выполнения контейнеров и интерфейс для удаленной организации контейнеров на рабочем месте.
    2. Baggageclaim - сервер управления кешем и артефактами.
  • Fly - это интерфейс командной строки, используемый для взаимодействия с диспетчером УВД для настройки конвейерного конвейера.

Предпосылки

Обязательно замените все вхождения 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 необходимо создать как минимум три пары ключей. Для шифрования данных сеанса создайте session_signing_key. Этот ключ также будет использоваться TSA для подписания запросов, которые он направляет в УВД. Чтобы защитить SSH-сервер TSA, создайте 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"}}

Остановите сервер на данный момент, поскольку еще несколько вещей должны быть настроены.

Запустите Concorse 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 работает на локальном хосте и прослушивает порт по умолчанию 2222.

Хотя веб-сайт Concourse и рабочий процесс можно легко запустить с помощью приведенных выше команд, для управления сервером рекомендуется использовать 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

Измените имя пользователя и пароль по BASIC_AUTH желанию. Убедитесь, что путь к файлам ключей указан правильно, и убедитесь, что указаны правильные значения имени пользователя и пароля в конфигурации базы данных PostgreSQL.

Аналогичным образом создайте файл среды для работника.

sudo nano /opt/concourse/worker.env

Заполните файл.

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

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

sudo chmod 600 /opt/concourse/*.env

Теперь создайте нового пользователя для Concourse для запуска веб-среды. Это обеспечит работу веб-сервера в изолированной среде.

sudo useradd concourse

Дайте пользователю права владения каталогом файла CI Concourse.

sudo chown -R concourse:concourse /opt/concourse

Создайте новый файл службы systemd для веб-службы Concourse.

sudo nano /etc/systemd/system/concourse-web.service

Заполните файл.

[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

Сохраните и закройте файл. Создайте новый файл службы для рабочей службы Concourse.

sudo nano /etc/systemd/system/concourse-worker.service

Заполните файл.

[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

Веб-сервис и служба для рабочих теперь могут быть запущены напрямую.

sudo systemctl start concourse-web concourse-worker

Чтобы рабочий и веб-процесс автоматически запускались во время загрузки, выполните следующее.

sudo systemctl enable concourse-worker concourse-web

Чтобы проверить состояние служб, выполните следующее.

sudo systemctl status concourse-worker concourse-web

Если служба не запущена или находится в FAILED состоянии, удалите кеш из /tmp каталога.

sudo rm -rf /tmp/*

Перезапустите сервисы.

sudo systemctl restart concourse-worker concourse-web

Обратите внимание, что на этот раз службы были запущены правильно. Вывод после проверки статуса услуг будет аналогичен следующему.

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

Подключение к серверу

После запуска сервера доступ к веб-интерфейсу Concourse CI можно получить, открыв http://192.0.2.1:8080 любой браузер. Войдите в систему, используя имя пользователя и пароль, указанные в файле среды.

Чтобы подключиться к серверу с помощью Fly, выполните следующее.

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

Приведенная выше команда используется для первоначального входа на сервер. -t используется для предоставления целевого имени. заменить my-ci на любое желаемое имя цели. Приведенная выше команда войдет в команду по умолчанию main. Он запросит имя пользователя и пароль, указанные в файле среды.

Вывод будет выглядеть следующим образом.

[user@vultr ~]$ fly -t my-ci login -c http://192.0.2.1:8080
logging in to team 'main'

username: admin
password:

target saved

Целевой логин будет сохранен на один день. После этого он истечет.

Выйти сразу.

fly -t my-ci logout

Fly можно использовать для входа на сервер за пределами сети, но только если сервер имеет общедоступный IP-адрес и доступен из-за пределов сети. Двоичный файл Windows или MacOS можно загрузить с сайта загрузки или с веб-интерфейса сервера.

Настройка обратного прокси Nginx

Логины и другая информация, отправляемая через веб-интерфейс на сервер Concourse, не защищены. Соединение не зашифровано. Обратный прокси-сервер Nginx можно настроить с помощью бесплатного шифрования 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

Отредактируйте файл Environment, созданный для конкурса 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.



Leave a Comment

Как установить Foreman на Ubuntu 16.04 LTS

Как установить Foreman на Ubuntu 16.04 LTS

Используете другую систему? Foreman - это бесплатный инструмент с открытым исходным кодом, который помогает вам настраивать физические и виртуальные серверы и управлять ими. Forema

Использование Chef-solo для настройки приложения Django в Ubuntu

Использование Chef-solo для настройки приложения Django в Ubuntu

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

Как установить и настроить Concourse CI на CentOS 7

Как установить и настроить Concourse CI на CentOS 7

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

Как установить Jenkins на CentOS 7

Как установить Jenkins на CentOS 7

Jenkins - это популярный инструмент CI (Continuous Integration) с открытым исходным кодом, который широко используется для разработки, развертывания и автоматизации проектов. Эта статья будет

Как установить и настроить GoCD на CentOS 7

Как установить и настроить GoCD на CentOS 7

Используете другую систему? GoCD - это система непрерывной доставки и автоматизации с открытым исходным кодом. Это позволяет моделировать сложные рабочие процессы, используя

Vultr Load Balancers

Vultr Load Balancers

Что такое балансировщик нагрузки? Балансировщики нагрузки располагаются перед вашим приложением и распределяют входящий трафик между несколькими экземплярами вашего приложения. Fo

Как установить SaltStack в CentOS 7

Как установить SaltStack в CentOS 7

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

Начало работы с SaltStack в Ubuntu 17.04

Начало работы с SaltStack в Ubuntu 17.04

SaltStack - это программа управления конфигурацией на основе Python, оптимизированная для автоматизации файлов конфигурации, развертываний и всего остального

Как установить Drone CI в Ubuntu 18.04

Как установить Drone CI в Ubuntu 18.04

Введение Drone - это автоматизированная платформа для непрерывного тестирования и доставки, работающая на собственной инфраструктуре. Дрон поддерживает любой язык, сервис o

Как установить и н��строить Ansible в Debian 9 для использования с Windows Server

Как установить и н��строить Ansible в Debian 9 для использования с Windows Server

Используете другую систему? Ansible - это инструмент с открытым исходным кодом для автоматизации задач. Он управляет конфигурацией ваших серверов Linux и Windows. Это работает

Создание снимков с упаковщиком

Создание снимков с упаковщиком

Что такое упаковщик? Packer - это инструмент для создания образа сервера, разработанный HashiCorp. Серверная визуализация; или, альтернативно, неизменная инфраструктура; это популярный альтернативный

Как установить Strider CD на Ubuntu 18.04

Как установить Strider CD на Ubuntu 18.04

Введение Strider CD - это платформа непрерывного развертывания с открытым исходным кодом. Приложение написано в Node.js и использует MongoDB в качестве бэкэнда хранилища. Stride

Использование SaltStack с колоннами в Ubuntu 17.04

Использование SaltStack с колоннами в Ubuntu 17.04

Хотя SaltStack - отличный инструмент для одновременного выполнения операций на многих серверах, он также поддерживает предустановки конфигурации для каждого хоста, сохраненные в

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

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

Используете другую систему? Ansible - это инструмент с открытым исходным кодом для автоматизации задач. Он управляет конфигурацией ваших серверов Linux и Windows. Это работает

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

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

Введение Chocolatey обеспечивает управление пакетами, облегчающее администрирование программного обеспечения и зависимостей в Linux и Windows. Вы можете быстро и легко

Как установить Foreman на CentOS 7

Как установить Foreman на CentOS 7

Используете другую систему? Foreman - это бесплатный инструмент с открытым исходным кодом, который помогает вам настраивать физические и виртуальные серверы и управлять ими. Forema

Изучение 26 методов анализа больших данных: часть 1

Изучение 26 методов анализа больших данных: часть 1

Изучение 26 методов анализа больших данных: часть 1

6 невероятных фактов о Nintendo Switch

6 невероятных фактов о Nintendo Switch

Многие из вас знают Switch, который выйдет в марте 2017 года, и его новые функции. Для тех, кто не знает, мы подготовили список функций, которые делают «Switch» обязательным гаджетом.

Технические обещания, которые все еще не выполнены

Технические обещания, которые все еще не выполнены

Вы ждете, когда технологические гиганты выполнят свои обещания? проверить, что осталось недоставленным.

Функциональные возможности уровней эталонной архитектуры больших данных

Функциональные возможности уровней эталонной архитектуры больших данных

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

Как ИИ может вывести автоматизацию процессов на новый уровень?

Как ИИ может вывести автоматизацию процессов на новый уровень?

Прочтите это, чтобы узнать, как искусственный интеллект становится популярным среди небольших компаний и как он увеличивает вероятность их роста и дает преимущество перед конкурентами.

CAPTCHA: как долго она может оставаться жизнеспособным методом различения между человеком и ИИ?

CAPTCHA: как долго она может оставаться жизнеспособным методом различения между человеком и ИИ?

CAPTCHA стало довольно сложно решать пользователям за последние несколько лет. Сможет ли он оставаться эффективным в обнаружении спама и ботов в ближайшем будущем?

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

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

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

Телемедицина и удаленное здравоохранение: будущее уже здесь

Телемедицина и удаленное здравоохранение: будущее уже здесь

Что такое телемедицина, дистанционное здравоохранение и их влияние на будущее поколение? Это хорошее место или нет в ситуации пандемии? Прочтите блог, чтобы узнать мнение!

Вы когда-нибудь задумывались, как хакеры зарабатывают деньги?

Вы когда-нибудь задумывались, как хакеры зарабатывают деньги?

Возможно, вы слышали, что хакеры зарабатывают много денег, но задумывались ли вы когда-нибудь о том, как они зарабатывают такие деньги? Давайте обсудим.

Обновление дополнения к macOS Catalina 10.15.4 вызывает больше проблем, чем решает

Обновление дополнения к macOS Catalina 10.15.4 вызывает больше проблем, чем решает

Недавно Apple выпустила macOS Catalina 10.15.4, дополнительное обновление для исправления проблем, но похоже, что это обновление вызывает больше проблем, приводящих к поломке компьютеров Mac. Прочтите эту статью, чтобы узнать больше