Научите, как создать среду публикации в оттенках серого.

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

DevUI – это команда, которая занимается как проектированием, так и проектированием, обслуживая HUAWEI CLOUD.DevCloudПлатформа и несколько промежуточных и серверных систем в Huawei предназначены для дизайнеров и проектировщиков.
Официальный сайт:devui.design
Библиотека компонентов Ng:ng-devui(Добро пожаловать в Звезду)

введение

Релиз в оттенках серого, также известный как канареечный релиз.

Термин «канарейка» происходит от традиции шахтеров приносить в шахты канареек в клетках. Шахтеры используют канарейку, чтобы понять концентрацию угарного газа в шахте.Если концентрация угарного газа слишком высока, канарейка будет отравлена, поэтому шахтеры знают, что им следует немедленно эвакуироваться. - «Практическое руководство по DevOps».

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

Конвейер, который интегрирует публикацию в оттенках серого, является очень важным инструментом и эффективной практикой в ​​DevOps, но автор мало знал о конвейерах и публикации в градациях серого до прихода в компанию. Узнавая о новой вещи, сначала логически пройдитесь по всем ключевым ссылкам, а затем выполните простую демонстрацию, что является для нас более интересным путем обучения, поэтому у нас есть эта статья.

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

01 Подготовка сервера

получить сервер

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

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

Получите руководство по облачному серверу:GitHub.com/терминаторы…

Установка инструмента

Git

Во-первых, убедитесь, что git был установлен на вашем сервере.Если нет, используйте следующую команду для его установки.После установки сгенерируйте открытый ключ ssh и поместите его в свой github, который будет использоваться при извлечении кода позже.

yum install git

Nginx

Если на вашем сервере нет Nginx, выполните следующие действия, чтобы установить его.Установить Nginx под Linux очень просто:

sudo yum install nginx

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

На данный момент nginx не запущен, введите в терминалеnginxилиnginx -s reloadКоманду можно запустить, и процессы, связанные с nginx, наблюдаемые в это время, выглядят следующим образом, что указывает на то, что запуск прошел успешно.

Посетите общедоступный IP-адрес вашего сервера в браузере.Если вы видите следующую страницу, это означает, что Nginx может работать нормально.

Дженкинс (долго)

Когда вы впервые встретитесь с Дженкинсом, у вас может возникнуть много вопросов: что такое Дженкинс? Что можно сделать? Зачем мне использовать Дженкинса и еще много чего. Трудно сказать, что такое Дженкинс, поэтому вот краткий обзор того, что может сделать Дженкинс. Проще говоря, Jenkins может помочь вам выполнить любую операционную команду, которую вы выполняете на любом сервере, если вы заранее создадите задачу на Jenkins, укажете содержание задачи и время срабатывания, например, срабатывание по времени или срабатывание при определенных обстоятельствах.

(1) Установка

Список стабильных версий Jenkins:pkg.Jenkins — this.org/RedHat-stab…

// 科学上网会快一些,记得留意网站上java和jenkins版本匹配信息,别下错了
wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.204.5-1.1.noarch.rpm
rpm -ivh jenkins-2.204.5-1.1.noarch.rpm

Измените порт Jenkins, если нет конфликта, вы не можете его изменить.

// line 56 JENKINS_PORT
vi /etc/sysconfig/jenkins

(2) Старт

начать Дженкинс

service jenkins start/stop/restart
// 密码位置
/var/lib/jenkins/secrets/initialAdminPassword

(3) Доступ

Получите доступ к порту 8080 сервера, введите пароль, полученный из указанного выше места, и нажмите «Продолжить».

Создайте учетную запись и войдите

Страница Jenkins Ready означает, что установка завершена и подготовка сервера завершена.

02 Подготовка кода

Подготовьте две копии кода

Из-за развертывания в градациях серого нам нужно подготовить два разных кода, чтобы проверить, эффективна ли реализованная нами операция в градациях серого. Здесь мы решили использовать Angular-CLI Angular для создания кода. Созданный проект не простой, но простой в эксплуатации. Мы готовим сразу два куска кода, чтобы упростить работу на стороне разработки.

// 安装angular-cli,前提是已经安装了node,如果没有node真的要去自行百度了...
npm install -g @angular/cli
// 快速创建一个新项目,一路回车
ng new canaryDemocd canaryDemo
// 运行完这个命令后访问http://localhost:4200 查看页面信息
ng serve

Посетите порт 4200 локального хоста, чтобы просмотреть страницу, а затем измените заголовок index.html в src корневого каталога проекта на A-CanaryDemo. Вы увидите, что страница будет обновляться в режиме реального времени. В этом примере мы используем заголовок, чтобы указать код, который необходимо развернуть для разных служб на обеих сторонах процесса публикации в градациях серого.

Затем мы упаковываем его дважды. Названия двух пакетов: A-CanaryDemo и B-CanaryDemo. Отложите эти две папки для последующего использования в качестве новых и старых кодов, которые некоторое время будут выпущены в оттенках серого.

ng build --prod

Настроить Nginx

Когда установка Nginx завершена выше, мы получаем доступ к IP-адресу сервера и видим страницу Nginx.Теперь мы хотим получить доступ к нашей собственной странице.Сначала отправьте пакет A-CanaryDemo, упакованный выше, в любое место на двух серверах, здесь Мы помещаем его в /var/canaryДемо.

// 将A-CanaryDemo 文件夹复制到你的公网服务器上,xx部分是你的服务器公网ip
scp -r ./dist/A-CanaryDemo root@xx.xx.xx.xx:/var/canaryDemo

Перейдите в папку /var на сервере, чтобы узнать, существует ли уже файл, и если да, перейдите к следующему шагу. То есть измените конфигурацию Nginx, чтобы перенаправить запрос на доступ к IP-адресу сервера на страницу, которую мы только что загрузили. Как упоминалось выше, вы можете использовать команду nginx -t для просмотра местоположения файла конфигурации Nginx, На этом этапе мы собираемся отредактировать этот файл.

vi /etc/nginx/nginx.conf

Измените строки 47-50, чтобы добавить содержимое, относящееся к следующему рисунку, то есть перенаправьте трафик на IP-адрес сервера в index.html в /var/canaryDemo.

После модификации сохраните и выйдите, перезапустите nginx

nginx -s reload

В это время, если вы посетите IP-адрес нашего сервера, вы увидите, что страница стала страницей, которую мы только что изменили локально, и заголовок действительно A-CanaryDemo. После завершения работы обоих серверов обе стороны могут получить доступ к странице с заголовком A-CanaryDemo. Состояние на данный момент эквивалентно двум машинам, которые уже предоставляют стабильные услуги в производственной среде.

03 Определите стратегию оттенков серого

Далее нам нужно запустить часть публикации в градациях серого.Перед выполнением связанных операций нам необходимо определить стратегию градаций серого, то есть при каких условиях трафик будет идти в сторону градаций серого, а другой трафик пойдет в сторону нормальных. Для простоты мы используем файл cookie с именем canary, чтобы отличить его.Если значение этого файла cookie определяется как devui, он будет обращаться к пограничному компьютеру с оттенками серого, в противном случае он будет обращаться к обычному пограничному компьютеру. Результат настройки Nginx в соответствии с этим правилом выглядит следующим образом, где 11.11.11.11 и 22.22.22.22 используются для представления IP-адресов двух серверов:

# Canary Deployment
map $COOKIE_canary $group {
  # canary account
  ~*devui$ server_canary;
  default server_default;
}

upstream server_canary {
  # 两台机器的IP,第一台设置端口号8000是为了防止nginx转发出现死循环导致页面报错
  server 11.11.11.11:8000 weight=1 max_fails=1 fail_timeout=30s;
  server 22.22.22.22 weight=1 max_fails=1 fail_timeout=30s;
}

upstream server_default {
  server 11.11.11.11:8000 weight=2 max_fails=1 fail_timeout=30s;
  server 22.22.22.22 weight=2 max_fails=1 fail_timeout=30s;
}

# 相应地,要配置8000端口的转发规则,8000端口默认不开启访问,需要去云服务器控制台安全组新增8000
server {
  listen 8000;
  server_name _;
  root /var/canaryDemo;

  # Load configuration files for the default server block.
  include /etc/nginx/default.d/*.conf;

  location / {
    root /var/canaryDemo;
    index index.html;
  }
}

server {
  listen 80 default_server;
  listen [::]:80 default_server;
  server_name _;
  # root /usr/share/nginx/html;
  root /var/canaryDemo;

  # Load configuration files for the default server block.
  include /etc/nginx/default.d/*.conf;

  location / {
    proxy_pass http://$group;
    # root /var/canaryDemo;
    # index index.html;
  }

  error_page 404 /404.html;
    location = /40x.html {
  }

  error_page 500 502 503 504 /50x.html;
  location = /50x.h
}

В этот момент как полутоновый трафик, так и обычный трафик случайным образом распределяются между машинами по обе стороны от AB. Затем мы реализуем публикацию в градациях серого, создав задачу Jenkins для выполнения модификации файла Nginx.

04 Реализовать публикацию в оттенках серого

Сортировка процессов

Прежде чем создавать задачу Jenkins для выпуска оттенков серого, давайте разберемся, какие задачи необходимы для достижения цели выпуска оттенков серого и за что каждая задача отвечает. Публикация в оттенках серого обычно следует этому процессу (при условии, что у нас есть два сервера AB для предоставления услуг в производственной среде, мы называем это стороной AB):

(1) Новый код развертывается на стороне A

(2) Небольшая часть трафика, который соответствует политике оттенков серого, обрезается на стороне A, а большая часть оставшегося трафика по-прежнему направляется на сторону B.

(3) Вручную проверьте, доступна ли функция стороны A в обычном режиме.

(4) После проверки правильности большая часть трафика идет на сторону А, а полутоновый трафик идет на сторону Б.

(5) Вручную проверьте, доступна ли функция B-стороны в обычном режиме.

(6) После проверки правильность трафика равномерно распределяется на сторону AB, как обычно.

Разборка задачи

Посредством описанного выше разбора мы получили шесть шагов публикации в градациях серого, среди которых (3) и (5) — ссылки, требующие ручной проверки, поэтому мы используем эти две задачи в качестве точек разделения для создания трех задач Дженкинса (Jenkins The задача строится на машине стороны А) следующим образом:

(1) Canary_A (тест A в оттенках серого), эта задача состоит из двух частей: обновить код на стороне A, а затем изменить стратегию распределения трафика, чтобы трафик в оттенках серого достиг A, а другой трафик достигал B

(2) Canary_AB (онлайн-тест оттенков серого B), обновите код стороны B, трафик в оттенках серого достигает B, а другой трафик достигает A

(3) Canary_B (онлайн B), весь трафик равномерно распределяется на AB

Создать задачу

Сначала создайте три задачи FreeStyle Jenkins в соответствии с настройками в разделе разборки задач.Не забудьте использовать английское имя.Создать папку после китайского имени проблематично. Сведения о задаче можно оставить пустыми, просто сохраните их напрямую.Далее мы настроим конкретную информацию для каждой задачи.

Задачи конфигурации

Теперь, когда созданы три задачи, сначала нажмите, чтобы войти в каждую задачу, чтобы выполнить пустую сборку (в противном случае измененная задача сборки может не запуститься позже), а затем мы подробно настроим каждую задачу.

Современные интерфейсные проекты требуют этапа сборки и упаковки. Но дешевые облачные серверы немного не в состоянии завершить сборку, и процессор часто взрывается.Таким образом, мы помещаем упакованный производственный пакет в управление git здесь, и каждое обновление кода будет синхронизировать последний производственный пакет с github, поэтому задача Jenkins извлекает производственный пакет и помещает его в указанное место для завершения нового кода один раз.

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

Во-первых, настройте тест оттенков серого A. Содержание этой задачи в основном объяснено выше.Во-первых, свяжите задачу с удаленным репозиторием github (вам нужно создать его вручную, сохранить B-CanaryDemo, упакованный выше, и назвать его dist), чтобы дайте знать Где я могу получить последний код.

Выполните задачу сборки (этап git fetch нестабилен и иногда занимает много времени), а затем щелкните эту сборку, чтобы просмотреть вывод консоли, вы можете определить, что место выполнения задачи Jenkins — /var/lib/jenkins/ рабочая область на сервере /Canary_A

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

(1) Сначала извлеките последний код

(2) Скопируйте каталог dist из корневого каталога кода в место, где развернут код, где мы указываем /var/canaryDemo

(3)Изменить конфигурацию NginxНаправьте трафик в градациях серого на сторону А

Что касается шага (3), способ изменения потока оттенков серого на самом делеПри желании аннотируйте файл конфигурации Nginx.В содержании метод аннотации для достижения теста в оттенках серого A выглядит следующим образом.

upstream server_canary {
  # 灰度流量访问A 边
  server 11.11.11.11:8080 weight=1 max_fails=1 fail_timeout=30s;
  # server 22.22.22.22 weight=1 max_fails=1 fail_timeout=30s;
}

upstream server_default {
  # 正常流量访问B 边,为了在修改文件的时候把这段的配置和上面的server_canary 区分开,我们把这里的weight 设为2
  # server 11.11.11.11:8080 weight=2 max_fails=1 fail_timeout=30s;
  server 22.22.22.22 weight=2 max_fails=1 fail_timeout=30s;
}

Команда оболочки, заполненная на этом шаге, может столкнуться с проблемами прав доступа при выполнении пользователем jenkins.Вы можете сначала войти в систему с пользователем root и изменить владельца каталога /var на пользователя jenkins./etc/nginx/ngix.conf также необходимо добавить разрешение на запись. Исходя из этого, окончательная команда оболочки выглядит следующим образом:

git pull
rm -rf /var/canaryDemo
scp -r dist /var/canaryDemo
sed -i 's/server 22.22.22.22 weight=1/# server 22.22.22.22 weight=1/' /etc/nginx/nginx.conf
sed -i 's/server 11.11.11.11:8000 weight=2/# server 11.11.11.11:8000 weight=2/' /etc/nginx/nginx.conf
nginx -s reload

Конфигурация содержимого задачи теста в градациях серого A завершена, а затем по очереди настройте онлайн A, тест в градациях серого B и онлайн B.

Задача, которую нужно выполнить в тесте оттенков серого B, состоит в том, чтобы вытащить последний код на сторону A (поскольку наши задачи Jenkins построены на стороне A), скопировать код из dist на сторону B Nginx, чтобы указать место доступа, и затем измените настройку Nginx на стороне A, чтобы трафик в градациях серого достигал стороны B.

git pull
rm -rf canaryDemo
mv dist canaryDemo
scp -r canaryDemo root@xx.xx.xx.xx:/var
sed -i 's/# server 22.22.22.22 weight=1/server 22.22.22.22 weight=1/' /etc/nginx/nginx.conf
sed -i 's/# server 11.11.11.11:8000 weight=2/server 11.11.11.11:8000 weight=2/' /etc/nginx/nginx.conf
sed -i 's/server 22.22.22.22 weight=2/# server 22.22.22.22 weight=2/' /etc/nginx/nginx.conf
sed -i 's/server 11.11.11.11:8000 weight=1/# server 11.11.11.11:8000 weight=1/' /etc/nginx/nginx.conf
nginx -s reload

Содержание задачи на этом шаге включает отправку кода с сервера стороны А на сервер стороны Б. Этот процесс обычно требует ввода пароля сервера стороны Б. Мы хотим выполнять отправку без пароля, поэтому нам нужно добавить содержимое в ~/.ssh/id_rsa.pub на машине стороны A на сервер стороны B ~/.ssh/authorized_keys, чтобы у A было разрешение на отправлять файлы типа B без пароля.

В строке B весь трафик распределяется поровну на сторону AB путем раскомментирования конфигурации Nginx на стороне A.

sed -i 's/# server 22.22.22.22 weight=2/server 22.22.22.22 weight=2/' /etc/nginx/nginx.conf
sed -i 's/# server 11.11.11.11:8000 weight=1/server 11.11.11.11:8000 weight=1/' /etc/nginx/nginx.conf
nginx -s reload

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

Суммировать

В этом документе представлен необходимый процесс создания среды публикации в оттенках серого с нуля из четырех аспектов: подготовка сервера, подготовка кода, формулировка политики в градациях серого и публикация в градациях серого. Суть публикации в градациях серого заключается в реализации направленного распределения трафика путем изменения файла Nginx. Содержание довольно простое, но весь процесс от нуля до единицы по-прежнему относительно громоздкий, надеюсь, вы сможете извлечь из этого пользу.

Кроме того, это всего лишь самая простая демонстрация. В реальный процесс разработки DevOps необходимо интегрировать другие операции, такие как компиляция и построение, проверка кода, сканирование безопасности и автоматизированные тестовые примеры. Мы с нетерпением ждем дополнительных специальных расширений от других участников. следственной группы!

Присоединяйтесь к нам

МыКоманда DevUIДобро пожаловать и присоединяйтесь к нам, чтобы создать элегантную и эффективную систему человеко-машинного проектирования/исследований и разработок. Электронная почта для приема на работу:muyang2@huawei.com.

Текст/DevUIШаодун

Рекомендуемые статьи в прошлом

«Front-end Quick Build Mock App»

«Как измерить эффективность и качество НИОКР начальных проектов (часть 1)»

«Гибкое проектирование, эффективное сотрудничество, подчеркивание ценности совместной работы дизайнерских устройств и облака»