Архив рубрики: Публикации

Книга: C # на примерах

Книга: C # на примерах

Книга: C# на примерах. Евдокимов П. В. 4-е издание.

Эта книга является превосходным учебным пособием для изучения языка программирования C # на примерах. Изложение ведется
последовательно: от развертывания .NET и написания первой программы, до многопоточного программирования, создания клиентсерверных приложений и разработки программ для мобильных устройств. По ходу книги даются все необходимые пояснения и
комментарии. В четвертом издании был частично переработан текст по ходу изложения всей книги, а также обновлены некоторые
примеры. Книга написана простым и доступным языком. Лучший выбор для результативного изучения С#. Начните сразу писать программы на С#!

Скачать с mail облака

2021-08-21T08:28:03Книги и Курсы

Книга: C# для чайников [2019] Мюллер Джон Пол

Книга: C# для чайников [2019] Мюллер Джон Пол

C# для чайников [2019] Мюллер Джон Пол

C# — мощный язык программирования, который стал любимым инструментом программистов, работающих с Visual Studio, и эта книга поможет вам быстро и безболезненно освоить новейшую его версию.
Вы научитесь создавать приложения для Windows, использовать графику, потоки, контейнеры, базы данных и многое другое, узнаете, что такое .NET Framework, полиморфизм, наследование и обобщенное программирование, а также изучите множество других важных и интересных вещей.

Из книги «C# для чайников» вы узнаете не только о типах, конструкциях и операторах языка C#, но и о ключевых концепциях объектно-ориентированного программирования, реализованных в этом языке, который в настоящее время представляет собой один из наиболее приспособленных для создания программ для Windows-инструментов

Если вы в начале большого пути в программирование, смелее покупайте книгу «C# для чайников»: она послужит вам отличным путеводителем, который облегчит ваши первые шаги на этом длинном, но очень увлекательном пути

Из книги «C# для чайников» Вы узнаете, как создать консольное приложение и что такое делегаты, события и интерфейсы. C# — мощный язык программирования, который стал любимым инструментом программистов, работающих с Visual Studio, и эта книга поможет вам быстро и безболезненно освоить новейшую его версию

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

В книге «C# для чайников»:

* Создание приложений для Windows
* Циклы и условные переходы
* Синтаксис коллекций
* Интерфейсы и объектно-ориентированные концепции
* Делегаты и события
* Безопасный код
* Работа с разнообразными источниками данных
* Создание приложений для работы в Интернете

Даже если вы никогда не имели дела с программированием, книга «C# для чайников» поможет вам освоить язык C# и научиться писать на нем программы любой сложности. Для читателей, которые уже знакомы с каким-либо языком программирования, процесс изучения C# только упростится, но иметь опыт программирования для чтения книги совершенно необязательно

Джон Пол Мюллер — независимый автор и технический редактор. На сегодняшний день он написал 104 книги и более 600 статей на самые разные темы: от сетей до искусственного интеллекта и от управления базами данных до головокружительного программирования. Некоторые из его текущих работ включают книгу о машинном обучении, пару книг по Python и книгу о MATLAB. Благодаря навыкам технического редактора Джон помог более чем 70 авторам усовершенствовать свои рукописи. Джон всегда интересовался разработкой программного обеспечения и писал о самых разных языках программирования

Скачать с mail облака

2021-08-20T22:44:10Книги и Курсы

Microsoft Surface Go 2 — самый маленький планшетный компьютер 2-в-1

Microsoft снова удивила нас своим самым маленьким съемным планшетным компьютером для бизнеса — Surface Go 2.

Microsoft Surface Go 2 — доступный планшетный компьютер для бизнеса на базе Windows 10 для повседневных задач. Он был анонсирован вместе с   ноутбуком Microsoft Surface Book 3 прошлой весной.

Этот трансформируемый планшет получил 10,5-дюймовый дисплей PixelSense, батарею с увеличенным сроком службы, но при этом оставался очень портативным. Кроме того, дополнительная возможность LTE — это дополнительное преимущество, которое позволяет пользователям оставаться на связи практически в любом месте. Давайте подробнее рассмотрим возможности планшета Microsoft Surface Go 2.

 

Microsoft Surface Go 2: цены и конфигурации

Microsoft предлагает несколько  конфигураций Surface Go 2 по цене от 399,99 до 729,99 долларов. Все модели поддерживают стандарт беспроводной связи 802.11a/b/g/n/ac/ax и технологию Bluetooth Wireless 5.0.

  • Самая дешевая базовая модель Microsoft Surface Go 2 поставляется с процессором Intel Pentium Gold 4425Y, 4 ГБ оперативной памяти и 64 ГБ памяти eMMC.
  • Базу можно настроить на 8 ГБ ОЗУ и 128 ГБ SSD-накопителя при покупке за дополнительные 150 долларов (цена 549,99 долларов).
  • Существует также конфигурация на базе процессора Intel Core M3 Wi-Fi с 8 ГБ оперативной памяти и 128 ГБ SSD.
  • Версия LTE модели M3 стоит 729,99 долларов.

 

Microsoft Surface Go 2: крышка типа Surface и ручка Microsoft Pen

Отметим, что крышка Surface Type Cover продается отдельно. Но добавление крышки клавиатуры в основном превращает этот 10,5-дюймовый планшет в ультрапортативный портативный компьютер. И все благодаря полной версии Windows 10 S Mode. Корпорация Майкрософт предлагает следующие варианты расцветки обучаемых чехлов для клавиатуры: Ice Blue, Poppy Red, Black и Platinum.

Планшет также поддерживает  Surface Pen  и беспроводную мышь Bluetooth.

 

Microsoft Surface Go 2: дизайн и дисплей

Планшет Microsoft Surface Go 2 по дизайну чем-то похож на более мощную   модель Microsoft Surface Pro 7. Он оснащен серебристым магниевым корпусом с зеркальным логотипом Microsoft на задней панели. Однако, будучи 10,5-дюймовой моделью, версия Surface Go 2 заметно меньше и легче, чем ее 12,3-дюймовые аналоги серии Surface Pro. Модель имеет толщину 0,3 дюйма и весит всего 0,57 кг. С другой стороны, Surface Pro 7 весит 0,77 кг. Конечно, он также имеет лучшее оборудование.

Что касается дисплея, то это сенсорный экран PixelSense с разрешением 1920 x1280 FHD. Эта версия также имеет немного более высокую плотность пикселей — 220 пикселей на дюйм и соотношение сторон 3:2. И хотя это стандартно для режима планшета, вы заметите это при использовании Surface Go 2 в качестве замены ноутбука. Например, в широкоэкранном формате видео вы увидите черные полосы над и под отснятым материалом.

Microsoft Surface Go 2 - самый маленький планшетный компьютер 2-в-1

 

Microsoft Surface Go 2: камеры, порты и аудио

Как и все планшеты и кабриолеты Surface, Surface Go 2 оснащен HD-камерами на передней и задней панели. Фронтальная камера с разрешением 5,0 МП 1080p поддерживает функцию аутентификации Windows Hello Face и в основном используется для звонков по телефону и видеоконференций. На задней панели также есть разрешение 1080p HD и автофокус на 8,0 МП, что отлично подходит для фото- и видеосъемки.

Surface Pro Go 2 оснащен удивительным количеством портов для такого небольшого устройства. У вас есть порт USB-C, комбинированный разъем для наушников и разъем Surface на правой стороне. На левой стороне вы найдете устройство для чтения карт памяти microSD, кнопку питания и ручки регулировки громкости.

Также стоит упомянуть, что в планшете установлены стереодинамики Dolby Audio Premium мощностью 2 Вт, обеспечивающие приличное качество звука. Так что прослушивание музыки, подкастов, аудиокниг и потоковых передач на этом планшете может быть весьма приятным. Но если вы ищете более глубокий звук и большую громкость, неизбежно приобретение пары качественных внешних динамиков или наушников.

 

Общая производительность Microsoft Surface Go 2

Обратите внимание, что Microsoft Surface Go 2 ни в коем случае не является мощным устройством. И хотя планшет поддерживает все приложения для Windows, он предназначен для решения основных повседневных задач. С помощью Surface Go 2 вы можете делать заметки, записывать идеи, делать наброски, проверять электронную почту и многое другое. Вы даже можете делать презентации с помощью Microsoft Pen. Самое приятное то, что планшет обеспечивает непрерывное использование в течение 10 часов без необходимости подзарядки. Кроме того, в промежутках между ними вы можете играть в бесплатные игры для Windows.

Кроме того, вы можете выбирать, как использовать свое программное обеспечение. Например, работа в режиме S дает вам доступ к широкому спектру приложений из Microsoft Store.

 

Заключительные слова

Microsoft Surface Go 2 может пригодиться в дороге. Он служит одновременно планшетом и ноутбуком благодаря дополнительной съемной крышке клавиатуры. Surface Go 2 позволяет транслировать любимые шоу, делать заметки и многое другое, что делает его идеальным маленьким попутчиком. Самое приятное то, что планшет практически умещается в кармане. К сожалению, Microsoft не включает Surface Pen и Type Cover в эту модель, что вынуждает пользователей тратить дополнительные средства на эти важные аксессуары. Но, учитывая возможности планшета по такой умеренной цене, мы думаем, что тратить деньги на клавиатуру того стоит.



2021-08-20T19:12:41
Microsoft

Книга: Язык Go Для Начинающих

Книга: Язык Go  Для Начинающих

Книга: Язык Go Для Начинающих. Привет, меня зовут Максим. Сейчас ты будешь читать мою книгу, которая поможет тебе начать разрабатывать современные приложения на языке программирования Go.

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

Язык я начал изучать в полевых условиях, так как мне нужно было буквально за 1-2 дня сделать тестовое задание на Go при приеме на новую работу. Тогда было совсем мало хорошего материала по этому языку, особенно в рунете. Недавно я решил заново повторить основы и заполнить пробелы в фундаментальных
знаниях Go. Тут мне пришла идея структурировать все знания и опыт для ребят, которые только начинают свой путь с этим языком.

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

Скачать с mail облака

2021-08-20T08:26:54Книги и Курсы

Создание Jenkins backup/restore в Unix/Linux

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




Полезное чтиво:




Установка Jenkins в Unix/Linux




Работа с Jenkins-CLI в Unix/Linux




Установка Jenkins и Jenkins-slave в Unix/Linux




Настройка языка в Jenkins




Создание Jenkins backup/restore в Unix/Linux




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




  • Thin backup
  • Backup Plugin
  • Periodic Backup
  • SCM Sync configuration




Можно заюзать и другие решения:




  • Использовать Git и взять «$JENKINS_HOME» под него.
  • Написать BASH скрипт и создать джобу на ее выполнение.




Перейдем к решениям!




Использование Thin backup плагина для backup/restore Jenkins-а в Unix/Linux




Переходим «Manage Jenkins» -> «Manage Plugins» и устанавливаем «Thin backup». Я обычно всегда перезапускаю дженкинс для того, чтобы применились все настройки и все работало.




PS: Для перезагрузки дженкинс-сервера, я использую «Restart Safely» плагин.




Настройки бекапа, переходим в «Manage Jenkins» -> «ThinBackup»:




Плагин ThinBackup для Jenkins-а




В данном плагине имеются:




  • Backup Now — Кнопка чтобы сделать бекап сейчас.
  • Restore — Служит для рестора данных.
  • Settings — Настройка для бэкапа.




Начнем с настройки, нажимаем по нему:




Настройка thinBackup плагина для бэкапа дженкинса




Я отметил нужные мне поля и нажал на кнопку «Save». Т. е у меня будут выполнятся бэкапы по заданному расписанию и складыватся в «/backups» папку. Теперь можно запустить «Backup now» чтобы выполнился бэкап.




Вот и все. Можно юзать данный плагин для бэкаа и рестора.




Использование Backup Plugin плагина для backup/restore Jenkins-а в Unix/Linux




Переходим «Manage Jenkins» -> «Manage Plugins» и устанавливаем «Backup plugin». Я обычно всегда перезапускаю дженкинс для того, чтобы применились все настройки и все работало.




Настройки бекапа, переходим в «Manage Jenkins» -> «Backup manager»:







В данном плагине имеются:




  • Setup — Служит для настройки бэкапов.
  • Backup Hudson configuration — Чтобы создать бэкап.
  • Restore Hudson configuration — Для рестора бэкапа.




Я привел настройку к такому виду:







После настроек нажимаем на «Save». Нажимаем на «Backup Hudson configuration» для создания бэкапа.




Использование Periodic Backup плагина для backup/restore Jenkins-а в Unix/Linux




Переходим «Manage Jenkins» -> «Manage Plugins» и устанавливаем «Periodic Backup». Я обычно всегда перезапускаю дженкинс для того, чтобы применились все настройки и все работало.




Настройки бекапа, переходим в «Manage Jenkins» -> «Periodic Backup Manager»:




Меню Periodic Backup plugin




Плагин не сконфигурирован и его нужно отконфигурить. Что я и сделаю сейчас, нажимаем на «Configure»:




Настройка Periodic Backup plugin




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




Использование SCM Sync configuration плагина для backup/restore Jenkins-а в Unix/Linux




Переходим «Manage Jenkins» -> «Manage Plugins» и устанавливаем «SCM Sync configuration». Я обычно всегда перезапускаю дженкинс для того, чтобы применились все настройки и все работало.




Создам проект в гитлабе, например «configurations/jenkins».В данной проекте я буду хранить все настройки.




Переходим в «Manage Jenkins» -> «Configure System» и находим поле «SCM» и заполняем поля. У меня не получилось подружится с этим плагином вообще. Снес его!




Использование bash-скрипта для backup/restore Jenkins-а в Unix/Linux




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




Переходим «Manage Jenkins» -> «Manage Plugins» и устанавливаем «Exclusive Execution». Я обычно всегда перезапускаю дженкинс для того, чтобы применились все настройки и все работало. Создам структуру: Projects->Configurations. Т.е папка Projects в ней будут проекты, в данном случае «Configurations» — конфиги (Для создания папки, нажмите «New item» и выбирете «folder»).




Переходим в проект и нажимаем на «New item» и кликаем по «Freestyle project». Вводим имя для проекта, у меня — «jenkins-backup» и нажимаем на «OK»:




Freestyle project для Jenkins бекапа




Потом переходим в созданный проект и нажимаем на «Configure» и находим поле «Source Code Management» и прописываем УРЛ где будет лежать скрипт для бэкапа у меня это готовое решение какого-то чела, например:




настройка SCM




Идем дальше и переходим во «Build Triggers» вкладку и заполним:







Т.е заполним переодичность с которой будет запускаться скрипт.sh1 lines




H 3 * * *




После этого переходим во «Build» вкладку и затем, из списка выбираем «Execute shell». и прописываем параметры для запуска:




Настройка запуска скрипта с параметрами через Build-execute shell




Добавляем в поле следующий текст:sh1 lines




./jenkins-backup.sh $JENKINS_HOME /backups/backup_`date +"%Y_%m_%d_%H:%M:%S"`.tar.gz




И на этом все, нажимаем на «Save». После этого, будет выполнятся бекап по заданному времени. Если есть необходимость, то можно запустить джобу маннуалли (Нажав на «Build Now»).




PS: Можно сделать бэкап-ротейт чтобы все старые бэкапы удалялись автоматом, например, можно добавить еще один «Execute shell» команду:sh1 lines




find /backups/backup_* -mtime +7 -delete




Т.е бэкапы будут хранится 7 дней, остальные будут удалены.




Вот еще один пример скрипта, который можно использовать:sh42 lines




#!/bin/bash

# Setup
#
# - Create a new Jenkins Job
# - Mark "None" for Source Control Management
# - Select the "Build Periodically" build trigger
#   - configure to run as frequently as you like
# - Add a new "Execute Shell" build step
#   - Paste the contents of this file as the command
# - Save
#  
# NOTE: before this job will work, you'll need to manually navigate to the $JENKINS_HOME directory 
# and do the initial set up of the git repository.  
# Make sure the appropriate remote is added and the default remote/branch set up.
#  

# Jenkins Configuraitons Directory
cd $JENKINS_HOME

# Add general configurations, job configurations, and user content
git add -- *.xml jobs/*/*.xml userContent/*

# only add user configurations if they exist
if [ -d users ]; then
    user_configs=`ls users/*/config.xml`

    if [ -n "$user_configs" ]; then
        git add $user_configs
    fi
fi

# mark as deleted anything that's been, well, deleted
to_remove=`git status | grep "deleted" | awk '{print $3}'`

if [ -n "$to_remove" ]; then
    git rm --ignore-unmatch $to_remove
fi

git commit -m "Automated Jenkins commit"

git push -q -u origin master




Как по мне, все тут логично и понятно что он делаеет… Аналогичным способом можно сделать джобу и запускать переодически. Тем самым, все конфиг-файлы, будут попадать в гит.




Вывод: Я протестировал несколько плагинов и выбрал — использовать скрипты или Thin backup, Periodic Backup плагины. Но если есть другие решения, — пишите, дополню материал.




Я для клиента писал вот такой скрипт:sh38 lines




#!/usr/bin/env bash


# JENKINS_HOME
#  +- config.xml     (jenkins root configuration)
#  +- *.xml          (other site-wide configuration files)
#  +- userContent    (files in this directory will be served under your http://server/userContent/)
#  +- fingerprints   (stores fingerprint records)
#  +- nodes          (slave configurations)
#  +- plugins        (stores plugins)
#  +- secrets        (secretes needed when migrating credentials to other servers)
#  +- workspace (working directory for the version control system)
#      +- [JOBNAME] (sub directory for each job)
#  +- jobs
#      +- [JOBNAME]      (sub directory for each job)
#          +- config.xml     (job configuration file)
#          +- latest         (symbolic link to the last successful build)
#          +- builds
#              +- [BUILD_ID]     (for each build)
#                  +- build.xml      (build result summary)
#                  +- log            (log file)
#                  +- changelog.xml  (change log)

echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
echo "==================== Jenkins backup ====================";
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";

JENKINS_DIR="/mnt/data/jenkins"
JENKINS_BACKUP_DIR="/mnt/data/jenkins_backup"

cp -r ${JENKINS_DIR}/*.xml ${JENKINS_BACKUP_DIR}
cp -r ${JENKINS_DIR}/userContent ${JENKINS_BACKUP_DIR}
cp -r ${JENKINS_DIR}/fingerprints ${JENKINS_BACKUP_DIR}
cp -r ${JENKINS_DIR}/nodes ${JENKINS_BACKUP_DIR}
cp -r ${JENKINS_DIR}/plugins ${JENKINS_BACKUP_DIR}
cp -r ${JENKINS_DIR}/secrets ${JENKINS_BACKUP_DIR}
cp -r ${JENKINS_DIR}/workspace ${JENKINS_BACKUP_DIR}
cp -r ${JENKINS_DIR}/jobs ${JENKINS_BACKUP_DIR}




Проверялось, — работает!











Резервное копирование для Jenkins




Все, кто занимается задачами CI/CD, так или иначе знают про Jenkins, даже если им посчастливилось не иметь с ним дела.




Этот непотопляемый кадавр продолжает жить и процветать по следующим причинам:




  • гибкость настроек (от настраиваемых диалоговых окон до встроенного Groovy);
  • архитектура с поддержкой плагинов и обширный набор готовых плагинов на все случаи жизни;
  • и самое главное — большой накопленный объём пользовательских проектов, которые проще продолжать развивать и поддерживать в среде Дженкинса, чем пытаться мигрировать на более современные и приятные платформы.




Очевидно, что чем важнее данные внутри Дженкинса для тех, кто им пользуется, тем актуальнее для них резервное копирование этих данных.




Однако здесь возникают два небольших препятствия:




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




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




Список предварительных пожеланий к нему был примерно таким:




  • резервная копия должна иметь минимальный размер и максимальную скорость создания (например, дамп виртуальной машины или снимок ZFS с сотнями гигабайт проектов не годится);
  • после восстановления нам достаточно иметь полностью настроенный сервер без предыдущего состояния — который знает, как выполнять новые job’ы, но ничего не помнящий про старые;
  • поскольку настройки имеют текстовый вид, пусть они сохраняются в Git-репозиторий;
  • если Jenkins предназначен для автоматического выполнения заданий, пусть самостоятельно выполняет всю работу по своему обслуживанию.




Общая схема:




  • в $JENKINS_HOME создаётся Git-репозиторий;
  • на Git-сервере для него создаётся origin (далее приводятся настройки для Gitlab);
  • в Дженкинсе создаётся периодическое задание, которое сохраняет в Git ключевые файлы;
  • для уменьшения размера от плагинов сохраняются только манифесты, при восстановлении плагины скачиваются заново.




Сначала создайте пользователя и репозиторий в Gitlab’e:




  • пользователь = jenkins-backup-robot;
  • репозиторий = jenkins-configs;
  • URL репозитория скопируйте в буфер обмена;
  • откройте Repository => Settings => Members;
  • назначьте jenkins-backup-robot мантейнером (иначе Gitlab не даст сделать ему первый push в пустой репозиторий).




Теперь идите в командную строку сервера, на котором работает Jenkins:




  • нам требуется создать SSH-ключ и Git-репозиторий:




sudo -Hiu jenkins

cd ~

git init

git config --global user.name Jenkins

git config --global user.email "jenkins@$(hostname -f)"

git remote add origin ВСТАВЬТЕ_ЗДЕСЬ_URL_GIT_РЕПОЗИТОРИЯ

test -s ~/.ssh/id_rsa.pub || ssh-keygen

cat ~/.ssh/id_rsa.pub




Созданный SSH-ключ надо импортировать в Gitlab:




  • Это делается в разделе Admin => Users => jenkins-backup-robot => Impersonate => Personal Settings => SSH keys.




Создайте в Дженкинсе новое задание:




  • Name: Backup Jenkins configs to Git
  • Type: Free job
  • Label: master
  • SCM: None
  • Build: Build Periodically
  • Schedule: 20 04 * * *
  • Build step: Execute Shell
  • Command:




#!/bin/sh -e



cd "$JENKINS_HOME"



# Add general configurations, secrets, job configurations, nodes, user content, users and plugins info:

ls -1d *.xml secrets/ jobs/*/*.xml nodes/*/*.xml userContent/* users/*/config.xml 

    plugins/*/META-INF/MANIFEST.MF 2>/dev/null | grep -v '^queue.xml$' | xargs -r -d 'n' git add --



# Track deleted files:

LANG=C git status | awk '$1 == "deleted:" { print $2; }' | xargs -r git rm --ignore-unmatch



LANG=C git status | grep -q '^nothing to commit' || {

    git commit -m "Automated Jenkins commit at $(date '+%Y-%m-%d %H:%M')"

    git push -q -u origin master

}




  • SAVE




Пояснения:




  • Метка “master” нужна, если у Дженкинса есть slave-узлы. Если их нет, метку в задании можете не указывать. Если они есть, то в списке узлов отредактируйте свойства мастера и в поле “Labels” добавьте “master”. Если вы этого не сделаете, Дженкинс попытается выполнять задание через агентов на всех узлах, а это явно не то, что нам требуется.
  • Если для подключения к Git-серверу используется SSH, перед выполнением задания не забудьте подключиться к нему вручную, чтобы git push не завершался с ошибкой из-за StrictHostKeyChecking.




Заключительный шаг в Gitlab’e после успешного git push:




  • в свойствах репозитория откройте раздел Members и понизьте уровень доступа для Дженкинса с Maintainer до Developer;
  • в Settings => Repository => Protected branches поменяйте для ветки “master” разрешение “Allow to push” с Maintainers на Maintainers+Developers.




Восстановление плагинов:




  • Т.к. мы сохраняем только манифесты плагинов, после восстановления из резервной копии нам потребуется просканировать каталог с манифестами и составить список команд для загрузки дистрибутивов:




sudo -Hiu jenkins

cd ~/plugins/

gawk 'BEGIN     { RS = "rn" }

      BEGINFILE { n = v = "" }

      ENDFILE   { printf "curl -sS -L -O http://updates.jenkins-ci.org/download/plugins/%s/%s/%s.hpin", n, v, n }

      $1 == "Short-Name:"     { n = $2 }

      $1 == "Plugin-Version:" { v = $2 }

    ' ./*/META-INF/MANIFEST.MF > ./download_all_plugins.sh




  • Обратите внимание, что вместо awk используется gawk (GNU awk), т.к. классический awk не понимает BEGINFILE и ENDFILE. В некоторых дистрибутивах gawk устанавливается по умолчанию, в некоторых его потребуется установить вручную.
  • Если gawk отработает без ошибок, запустите сгенерированный им файл:




sudo -Hiu jenkins

cd ~/plugins/

gawk 'BEGIN     { RS = "rn" }

      BEGINFILE { n = v = "" }

      ENDFILE   { printf "curl -sS -L -O http://updates.jenkins-ci.org/download/plugins/%s/%s/%s.hpin", n, v, n }

      $1 == "Short-Name:"     { n = $2 }

      $1 == "Plugin-Version:" { v = $2 }

    ' ./*/META-INF/MANIFEST.MF > ./download_all_plugins.sh




  • Самостоятельно распаковывать и устанавливать скачанные hpi-файлы не требуется — перезапустите Дженкинс и он сделает это сам.




Источники: https://linux-notes.org/sozdanie-jenkins-backup-restore-v-unix-linux/ и https://cdnnow.ru/blog/jenkins-backup/



2021-08-19T10:17:29
Software

Многоступенчатая сборка Docker-образов / Multi-Stage Docker Builds




Это особенно актуально для приложений, разработка которых ведется на компилируемых языках программирования. Используя эту возможность, вы сможете существенно сокращать размер вашего итогового образа не, прибегая к хитрым трюкам, которые я описывал в статье «6 советов по уменьшению Docker образа» Суть подхода заключается в том, чтобы не заботиться о количестве получающихся слоев в процессе сборки вашего приложения и копировать результаты сборки из одного образа в другой. В этой статье я покажу, как это реализуется на практике. Выдумывать ничего не буду, а просто покажу вам это на уже готовых примерах из официальной документации.




Процесс до появления многоэтапных сборок




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




Вообще говоря, это очень распространенная практика использовать несколько Dockerfile-ов в одном проекте: один для разработки (содержит все необходимое для создания вашего приложения), другой оптимизированный для создания итогового образа, который будет использоваться в продуктиве, в котором должно быть только ваше приложение и все то, что необходимо для его запуска. Эта практика в свое время получила название «шаблон строителя». Однако, поддержание в актуальном состоянии двух Dockerfile-ов не есть что-то удобное.




Вот пример двух Dockerfile-ов (Dockerfile.build и Dockerfile), речь о которых идет выше:




Dockerfile:





FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY app .
CMD ["./app"]




Dockerfile.build:





FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go .
RUN go get -d -v golang.org/x/net/html 
  && CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .




И конечно же скрипт, автоматизирующий всю работу:




build.sh:





#!/bin/sh
echo Building alexellis2/href-counter:build

docker build --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy   
    -t alexellis2/href-counter:build . -f Dockerfile.build

docker create --name extract alexellis2/href-counter:build  
docker cp extract:/go/src/github.com/alexellis/href-counter/app ./app  
docker rm -f extract

echo Building alexellis2/href-counter:latest

docker build --no-cache -t alexellis2/href-counter:latest .
rm ./app




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




Многоэтапные сборки значительно упрощают эту ситуацию!




Использование многоэтапных (multi-stage) сборок




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




Dockerfile:





FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]





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




docker build -t avmaksimov/href-counter:latest .




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




Как это работает? Вторая команда FROM начинает новый этап сборки с базового образа alpine:latest. Инструкция COPY — from = 0 копирует артефакты с предыдущего этапа сборки на текущий этап, благодаря чему необходимые для сборки Go SDK и любые промежуточные артефакты не сохраняются в конечном образе.




Именование этапов сборки




По умолчанию этапы никак не называются, и вы ссылаетесь на них по их целочисленному номеру, начиная с 0 для первой инструкции FROM. Тем не менее, у вас есть возможность давать своим этапам понятные имена, добавив как в команду FROM. Этот пример улучшает предыдущий, используя имена для этапов. Это также означает, что даже если порядок инструкций в вашем Dockerfile со временем изменится, инструкции COPY не сломаются.




Dockerfile:





FROM golang:1.7.3 as builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go    .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"] 




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










Многоступенчатая сборка Docker-образов




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




Замечание. Для этого нужен Docker 17.05 или более поздний.




Начнем с простой программы на Go:




package mainimport "fmt"func main() {
fmt.Println("Hello world!")
}




Соберем ее с помощью образа golang:alpine одноступенчатым способом (single-stage build). Вот Dockerfile:




FROM golang:alpine
WORKDIR /app
ADD . /app
RUN cd /app && go build -o goapp
ENTRYPOINT ./goapp




Теперь соберем образ и запустим контейнер:




docker build -t treeder/hello .
docker run --rm treeder/hello




Все работает, но давайте посмотрим на размер с помощью docker images | grep treeder/hello.







258 МБ — многовато для крошечного бинарного файла. Теперь давайте попробуем многоступенчатуюсборку (multi-stage build) с использованием нового Dockerfile:




# стадия сборки
FROM golang:alpine AS build-env
ADD . /src
RUN cd /src && go build -o goapp

# финальная стадия
FROM alpine
WORKDIR /app
COPY --from=build-env /src/goapp /app/
ENTRYPOINT ./goapp




Соберем и запустим снова:




docker build -t treeder/hello .
docker run --rm treeder/hello




Проверим размер:







6,35 МБ — намного лучше.




Что это означает? Что многоступенчатые сборки — отличная вещь. Ими стоит пользоваться практически в любом случае!







Источник: https://medium.com/southbridge/%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D1%87%D0%B0%D1%82%D0%B0%D1%8F-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0-docker-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2-8b766785f75a



2021-08-18T19:41:17
Software