VADIM GAUZIAK • DEVELOPER • SBERBANK TECHNOLOGY
Как мы искали баг JIRA
и нашли его
AUG SPB
НАШИ ОШИБКИ
ПОИСК БАГА
ДЕЛАЕМ ПРАВИЛЬНО
Agenda
Начало
#JIRAЖИВИ
#JIRAНЕБОЛЕЙ
Melody
Thread Dump
Thread Dump
Thread Dump
Zabbix
LexoRank DB
LexoRank
Сам баг
Продолжение?
Наши Ошибки
Ошибки коммуникации
• Потеря времени
• Редкие взаимодействия администраторов и
разработчиков
• Переключение контекста на другие вопросы
Технические ошибки
• Искали hotfix
• Неправильно локализовали проблему
• Поздно обратились к Atlassian
Делаем правильно
Рекомендации по коммуникациям
• При возникновении проблемы – сразу же сообщить всем
администраторам
• Если проблема не решена за короткий срок (менее ~1
часа) сообщить всей команде
• Одновременная работа разработчика и администратора
• Изолируйте команду
Технические рекомендации
• Ищите проблему, а не hotfix
• Работайте параллельно с Atlassian
Thank you!
VADIM GAUZIAK • DEVELOPER • SBERBANK TECHNOLOGY
GONCHIK TSYMZHITOV • ATLASSIAN ADMINISTRATOR • ITIVITI • FB: GONCHIK
Updates, updates and updates
или как обновляться с меньшей болью
МОТИВАЦИЯ
ОСНОВНЫЕ СЦЕНАРИИ
CLEANUP
МИНИЗАЦИЯ РИСКОВ
План
ШАГИ ОБНОВЛЕНИЯ
Кто мы?
Под брендом Itiviti [Айтивити] в 2016 году объединились компании:
• Orc Group, - разработчик финансового программного обеспечения;
• CameronTec Group - эксперт в области инфраструктуры финансового обмена сообщениями и
подключений к электронным биржам;
• Tbricks AB - автор одной из самых быстрых в мире систем для торговли на электронных биржах.
Основные офисы компании находятся в Стокгольме, Санкт-Петербурге, Чикаго и Гонконге.
Основные сценарии
SLA Решение Ссылка на документацию
Он есть, и нужно нет окна JIRA Data Center Managing zero downtime
upgrades
Есть и есть окно для
обновления
Proxy. Staging and Production
apps
Upgrading JIRA with a fallback
method
Нет, и есть окно обновления VM snapshot, (backup DB,
files)
Upgrading JIRA using a rapid
upgrade method
JIRA DATA CENTER
Zero Downtime update
Обновление
с возможностью отката
Обновление с долгим откатом
• Cleanup JIRA
• VM Snapshot
• Backup DB
• Rsync Files ($JIRA_INSTALL, $JIRA_HOME)
• Disable all add-ons (UPM compability)
• Restart with new installation directory
• Enable add-on by add-on (/update)
Что я получу
от обновления?
• Features from Release notes
• Bug fixes
• Performance or regression?! (Tests?)
Crashes and Performance Issues
Веб-сайт?
• Java App (Oracle JDK)
• JDBC driver
• СУБД? (Database schema)
• OS
Что есть JIRA? Глобально?
Что делать с JVM?
Взято с сайта
Шипилёва Алексея
Подробно разбирали
AUG на митапе
«Performance tricks»
• systemd/init.d with predefined variables
Уменьшаем количество шагов
[Unit]
Description=“JIRA acceptance test server”
After=syslog.target network.target mysqld.target
[Service]
Type=forking
User=jira
Environment="JIRA_HOME=/jira/home"
Environment="JAVA_HOME=/usr/java/latest"
Environment="JRE_HOME=/usr/java/latest/jre"
ExecStart=/jira/current/bin/start-jira.sh
ExecStop=/jira/current/bin/stop-jira.sh
TimeoutSec=180
Restart=on-failure
UMask=0022
[Install]
WantedBy=multi-user.target
#!/bin/sh
# description: JIRA acceptance test server
JAVA_HOME=/usr/java/latest/
export JAVA_HOME
JIRAUSER="jira"
case "$1" in
start)
su - ${JIRAUSER} /jira/current/bin/startup.sh
;;
stop)
su - ${JIRAUSER} /jira/current/bin/shutdown.sh
;;
*)
echo "Usage: $0 {start|stop|forcestop}"
exit 1
;;
esac
CONFSERVER-51937
JRE_HOME is not set
Linux(x64) installer
• JDK/JRE
- symlink (/usr/java/latest)
- $JAVA_HOME
• DB connector latest
- symlink
Причина:
• https://jdbc.postgresql.org/
• https://dev.mysql.com/downloads/connector/j/
Уменьшаем количество шагов
• Config template files in scripts, git/svn
Уменьшаем количество шагов
Это все прекрасно. А
тестовые стенды?
https://bitbucket.org/almworks/pocker
• Git flow
• Оркестрация (Chef,
puppet, ansible,
salstack)
• Docker Pocker
Минизация рисков
https://forge.puppet.com/puppet/jira
Может
в ходе обновления
пересмотреть
сущности JIRA?
А есть смысл?
https://www.atlassian.com/blog
Cleanup
• Пересмотр всех плагинов и проверка совместимости через UPM
• Fields, Screen, Issue type, Permission, Notification, schemes (в помощь Scheme
cleaner)
• Проверка коллизий, ошибок на уровне пользователей (в помощь Botron S.
Integrity checker)
• Архивирование проектов, изменение видимости и т.п. ( в помощь
документация)
• Логи, кэши
Admin cleanup tools
Инструмент Плюсы Минусы Комментарий
Scheme Cleaner for
JIRA
Удобно смотреть
смотреть даты
обновления и общие
манипуляции со
схемами
Не интуитивно
понятный интерфейс,
не поддерживает
последние версии
Проверяю на тестовых
инстансах для
понимания ситуации в
промышленной среде
Cleaner for JIRA Сразу видим
статистику, и можно
делать выводы
На промышленной
среде будет регрессия
по производительности
Проверять только на
тестовых инстансах
Admin Tools for JIRA Подобный функционал
предыдущего плагина
На промышленной
среде будет регрессия
по производительности
Проверять только на
тестовых инстансах
Свои скрипты Можно брать и делать Можно вдумчиво в
продакшен
Статистика сущностей
Пример:
на основе скринов
Life hack:
• поиск по слову Delete на странице,
• Или запрос в БД
Пример на основе полей
Life hack:
• Python jira-api
• Или запрос в БД
Дальше и больше
• Статистика Resolution
• Время жизни в статусах
• Внедрение новой функциональности
Категорий проектов и онлайн
архивирование
Для наглядности
убрал условия
Основной обновления.
Плагины.
• Для отключения плагинов, с 7.3 версий появилась директива
--disable-all-addons (or /disablealladdons for Windows users)
--disable-addons=<addon keys> or (/disableaddons=<addon keys> for Windows users)
• Ранее апдейт в БД
• Или просто перемещали из `mv $JIRA HOME/plugins/installed-plugins{,.bk}`
2.--disable-addons=<addon keys> or (/disableaddons=<addon keys> for Windows users)
Итак, всё вместе
• UPM проверка совместимости плагинов и отключение их пере обновлением
• Обновления на тестовых стендах (не забываем disable mail and app links)
• По максимуму cleanup, и архивирование отдельных проектов, задач
• Запуск части тестировщиков
• Обновление staging и далее разогрев кэша посредством REST API запросов
• Баннер и другие оповещения, после согласований
• Смена proxy_pass перенаправление линков
• Успех или rollback
JIRA Upgrade Notes
Благодарю за
внимание!
GONCHIK TSYMZHITOV • ATLASSIAN ADMINISTRATOR • ITIVITI • FB:GONCHIK
Extra. СовместимостьAPI?
Старое Поновее
getCustomFieldObjectByName(fieldName) getCustomFieldObjectsByName(fieldName).iterator().next()
issue.getResolutionObject issue.getResolution
issue.getPriorityObject() issue.getPriority()
issue.getStatusObject() issue.getStatus()
issue.getIssueTypeObject() issue.getIssueType()
jiraHelper.getProjectObject jiraHelper.getProject
com.atlassian.jira.plugin.webfragment.conditions.AbstractIssueCondition com.atlassian.jira.plugin.webfragment.conditions.AbstractIssueWebCondition
com.atlassian.jira.security.Permissions com.atlassian.jira.permission.ProjectPermissions
Group jiraUserGroup = userManager.getGroup(groupnames[i]);
userUtil.addUserToGroup(jiraUserGroup, user);
GroupManager groupManager = ComponentAccessor.getGroupManager();
try {
Group jiraUserGroup = userManager.getGroup(groupnames[i]);
log.debug("PREPARE add custom user groups");
if (jiraUserGroup == null) {
log.debug("Group does not found");
}
groupManager.addUserToGroup(user, jiraUserGroup);
log.debug("add User into Group");
} catch (Throwable e) {
log.error("Exception thrown on " + e);
e.printStackTrace();
}

Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки

  • 1.
    VADIM GAUZIAK •DEVELOPER • SBERBANK TECHNOLOGY Как мы искали баг JIRA и нашли его AUG SPB
  • 2.
  • 3.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
    Ошибки коммуникации • Потерявремени • Редкие взаимодействия администраторов и разработчиков • Переключение контекста на другие вопросы
  • 16.
    Технические ошибки • Искалиhotfix • Неправильно локализовали проблему • Поздно обратились к Atlassian
  • 17.
  • 18.
    Рекомендации по коммуникациям •При возникновении проблемы – сразу же сообщить всем администраторам • Если проблема не решена за короткий срок (менее ~1 часа) сообщить всей команде • Одновременная работа разработчика и администратора • Изолируйте команду
  • 19.
    Технические рекомендации • Ищитепроблему, а не hotfix • Работайте параллельно с Atlassian
  • 20.
    Thank you! VADIM GAUZIAK• DEVELOPER • SBERBANK TECHNOLOGY
  • 21.
    GONCHIK TSYMZHITOV •ATLASSIAN ADMINISTRATOR • ITIVITI • FB: GONCHIK Updates, updates and updates или как обновляться с меньшей болью
  • 22.
  • 23.
    Кто мы? Под брендомItiviti [Айтивити] в 2016 году объединились компании: • Orc Group, - разработчик финансового программного обеспечения; • CameronTec Group - эксперт в области инфраструктуры финансового обмена сообщениями и подключений к электронным биржам; • Tbricks AB - автор одной из самых быстрых в мире систем для торговли на электронных биржах. Основные офисы компании находятся в Стокгольме, Санкт-Петербурге, Чикаго и Гонконге.
  • 24.
    Основные сценарии SLA РешениеСсылка на документацию Он есть, и нужно нет окна JIRA Data Center Managing zero downtime upgrades Есть и есть окно для обновления Proxy. Staging and Production apps Upgrading JIRA with a fallback method Нет, и есть окно обновления VM snapshot, (backup DB, files) Upgrading JIRA using a rapid upgrade method
  • 25.
    JIRA DATA CENTER ZeroDowntime update
  • 26.
  • 27.
    Обновление с долгимоткатом • Cleanup JIRA • VM Snapshot • Backup DB • Rsync Files ($JIRA_INSTALL, $JIRA_HOME) • Disable all add-ons (UPM compability) • Restart with new installation directory • Enable add-on by add-on (/update)
  • 28.
    Что я получу отобновления? • Features from Release notes • Bug fixes • Performance or regression?! (Tests?) Crashes and Performance Issues
  • 29.
    Веб-сайт? • Java App(Oracle JDK) • JDBC driver • СУБД? (Database schema) • OS Что есть JIRA? Глобально?
  • 30.
    Что делать сJVM? Взято с сайта Шипилёва Алексея Подробно разбирали AUG на митапе «Performance tricks»
  • 31.
    • systemd/init.d withpredefined variables Уменьшаем количество шагов [Unit] Description=“JIRA acceptance test server” After=syslog.target network.target mysqld.target [Service] Type=forking User=jira Environment="JIRA_HOME=/jira/home" Environment="JAVA_HOME=/usr/java/latest" Environment="JRE_HOME=/usr/java/latest/jre" ExecStart=/jira/current/bin/start-jira.sh ExecStop=/jira/current/bin/stop-jira.sh TimeoutSec=180 Restart=on-failure UMask=0022 [Install] WantedBy=multi-user.target #!/bin/sh # description: JIRA acceptance test server JAVA_HOME=/usr/java/latest/ export JAVA_HOME JIRAUSER="jira" case "$1" in start) su - ${JIRAUSER} /jira/current/bin/startup.sh ;; stop) su - ${JIRAUSER} /jira/current/bin/shutdown.sh ;; *) echo "Usage: $0 {start|stop|forcestop}" exit 1 ;; esac CONFSERVER-51937 JRE_HOME is not set Linux(x64) installer
  • 32.
    • JDK/JRE - symlink(/usr/java/latest) - $JAVA_HOME • DB connector latest - symlink Причина: • https://jdbc.postgresql.org/ • https://dev.mysql.com/downloads/connector/j/ Уменьшаем количество шагов
  • 33.
    • Config templatefiles in scripts, git/svn Уменьшаем количество шагов
  • 34.
    Это все прекрасно.А тестовые стенды? https://bitbucket.org/almworks/pocker • Git flow • Оркестрация (Chef, puppet, ansible, salstack) • Docker Pocker
  • 35.
  • 36.
  • 37.
  • 38.
    Cleanup • Пересмотр всехплагинов и проверка совместимости через UPM • Fields, Screen, Issue type, Permission, Notification, schemes (в помощь Scheme cleaner) • Проверка коллизий, ошибок на уровне пользователей (в помощь Botron S. Integrity checker) • Архивирование проектов, изменение видимости и т.п. ( в помощь документация) • Логи, кэши
  • 39.
    Admin cleanup tools ИнструментПлюсы Минусы Комментарий Scheme Cleaner for JIRA Удобно смотреть смотреть даты обновления и общие манипуляции со схемами Не интуитивно понятный интерфейс, не поддерживает последние версии Проверяю на тестовых инстансах для понимания ситуации в промышленной среде Cleaner for JIRA Сразу видим статистику, и можно делать выводы На промышленной среде будет регрессия по производительности Проверять только на тестовых инстансах Admin Tools for JIRA Подобный функционал предыдущего плагина На промышленной среде будет регрессия по производительности Проверять только на тестовых инстансах Свои скрипты Можно брать и делать Можно вдумчиво в продакшен
  • 40.
  • 41.
    Пример: на основе скринов Lifehack: • поиск по слову Delete на странице, • Или запрос в БД
  • 42.
    Пример на основеполей Life hack: • Python jira-api • Или запрос в БД
  • 43.
    Дальше и больше •Статистика Resolution • Время жизни в статусах • Внедрение новой функциональности
  • 44.
    Категорий проектов ионлайн архивирование Для наглядности убрал условия
  • 45.
    Основной обновления. Плагины. • Дляотключения плагинов, с 7.3 версий появилась директива --disable-all-addons (or /disablealladdons for Windows users) --disable-addons=<addon keys> or (/disableaddons=<addon keys> for Windows users) • Ранее апдейт в БД • Или просто перемещали из `mv $JIRA HOME/plugins/installed-plugins{,.bk}` 2.--disable-addons=<addon keys> or (/disableaddons=<addon keys> for Windows users)
  • 46.
    Итак, всё вместе •UPM проверка совместимости плагинов и отключение их пере обновлением • Обновления на тестовых стендах (не забываем disable mail and app links) • По максимуму cleanup, и архивирование отдельных проектов, задач • Запуск части тестировщиков • Обновление staging и далее разогрев кэша посредством REST API запросов • Баннер и другие оповещения, после согласований • Смена proxy_pass перенаправление линков • Успех или rollback JIRA Upgrade Notes
  • 47.
    Благодарю за внимание! GONCHIK TSYMZHITOV• ATLASSIAN ADMINISTRATOR • ITIVITI • FB:GONCHIK
  • 48.
    Extra. СовместимостьAPI? Старое Поновее getCustomFieldObjectByName(fieldName)getCustomFieldObjectsByName(fieldName).iterator().next() issue.getResolutionObject issue.getResolution issue.getPriorityObject() issue.getPriority() issue.getStatusObject() issue.getStatus() issue.getIssueTypeObject() issue.getIssueType() jiraHelper.getProjectObject jiraHelper.getProject com.atlassian.jira.plugin.webfragment.conditions.AbstractIssueCondition com.atlassian.jira.plugin.webfragment.conditions.AbstractIssueWebCondition com.atlassian.jira.security.Permissions com.atlassian.jira.permission.ProjectPermissions Group jiraUserGroup = userManager.getGroup(groupnames[i]); userUtil.addUserToGroup(jiraUserGroup, user); GroupManager groupManager = ComponentAccessor.getGroupManager(); try { Group jiraUserGroup = userManager.getGroup(groupnames[i]); log.debug("PREPARE add custom user groups"); if (jiraUserGroup == null) { log.debug("Group does not found"); } groupManager.addUserToGroup(user, jiraUserGroup); log.debug("add User into Group"); } catch (Throwable e) { log.error("Exception thrown on " + e); e.printStackTrace(); }