<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Блог Андрея Смирнова (aptly)</title><link>http://www.smira.ru/</link><description></description><language>ru</language><lastBuildDate>Sun, 11 Jan 2015 19:24:29 GMT</lastBuildDate><generator>http://getnikola.com/</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>aptly 0.8</title><link>http://www.smira.ru/posts/aptly-08.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;Новая версия &lt;a class="reference external" href="http://www.aptly.info"&gt;aptly&lt;/a&gt; 0.8 была выпущена 3-го октября.
Теперь все новости об aptly будут публиковаться в блоге: &lt;a class="reference external" href="http://www.aptly.info/post/aptly-0-8/"&gt;http://www.aptly.info/post/aptly-0-8/&lt;/a&gt;&lt;/p&gt;</description><category>aptly</category><category>devops</category><guid>http://www.smira.ru/posts/aptly-08.html</guid><pubDate>Sat, 04 Oct 2014 20:57:38 GMT</pubDate></item><item><title>aptly 0.7 - S3 publishing, complex queries</title><link>http://www.smira.ru/posts/aptly-07.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;&lt;a class="reference external" href="http://www.aptly.info"&gt;aptly&lt;/a&gt; 0.7 has been released today. aptly is a Debian
repository management tool, it allows to mirror remote repositories, create local
package repositories, manage repositories snapshots and publish them back
as Debian repository. aptly main idea is "owning your own repository": you
can mix and match official repos, 3rd-party repositories, your own packages,
creating your own stable/testing/whatever repositories, allowing reproducible
package installations along with controlled upgrades. It is available for download as
&lt;a class="reference external" href="http://www.aptly.info#download"&gt;binary executables&lt;/a&gt; or from Debian repository:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
deb http://repo.aptly.info/ squeeze main
&lt;/pre&gt;
&lt;p&gt;When installing from repository, don't forget to import key used to sign the release:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ gpg --keyserver keys.gnupg.net --recv-keys 2A194991
$ gpg -a --export 2A194991 | sudo apt-key add -
&lt;/pre&gt;
&lt;p&gt;Aptly has new logo, soon I'm going to launch new website:&lt;/p&gt;
&lt;img alt="aptly logo" src="http://www.smira.ru/galleries/aptly_logo.png"&gt;
&lt;p&gt;Most important new features are:&lt;/p&gt;
&lt;div class="section" id="publishing-to-amazon-s3"&gt;
&lt;h2&gt;Publishing to Amazon S3&lt;/h2&gt;
&lt;p&gt;aptly can publish repositories directly to Amazon S3.&lt;/p&gt;
&lt;p&gt;First, create new S3 bucket using AWS console. Let it be &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;aptly-repo&lt;/span&gt;&lt;/tt&gt;. Remember Amazon region
you have used to create, I'll be using &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;us-west-1&lt;/span&gt;&lt;/tt&gt; in this example. If you're going to
have public repository, enable website hosting for that bucket.&lt;/p&gt;
&lt;p&gt;Go to IAM page, create new user, save access key ID and secret access key and create bash script
&lt;cite&gt;aws.creds.sh&lt;/cite&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# Access Key ID:
# AKIAISHG7G3H8AWBCFG
# Secret Access Key:
# E7aujXChaMZwp3ghfk45+Zabd55

export AWS_ACCESS_KEY_ID="AKIAISHG7G3H8AWBCFG" AWS_SECRET_ACCESS_KEY="E7aujXChaMZwp3ghfk45+Zabd55"
&lt;/pre&gt;
&lt;p&gt;In IAM console, attach new custom policy for that user:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1405592139000",
      "Effect": "Allow",
      "Action": [
        "s3:DeleteObject",
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": [
        "arn:aws:s3:::aptly-repo/*", "arn:aws:s3:::aptly-repo"
      ]
    }
  ]
}
&lt;/pre&gt;
&lt;p&gt;This user would have limited access only to the bucket you've created.&lt;/p&gt;
&lt;p&gt;Now, configure aptly, edit configuration file &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/.aptly.conf&lt;/span&gt;&lt;/tt&gt; and add key &lt;tt class="docutils literal"&gt;S3PublishEndpoints&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
"S3PublishEndpoints": {
  "aptly-repo": {
    "region": "us-west-1",
    "bucket": "aptly-repo",
    "acl": "public-read"
  }
}
&lt;/pre&gt;
&lt;p&gt;If you're going to have public repository, set &lt;tt class="docutils literal"&gt;acl&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;public-read&lt;/span&gt;&lt;/tt&gt;, otherwise set
&lt;tt class="docutils literal"&gt;acl&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;private&lt;/tt&gt;. Now you're ready to do your first publish. For example, to publish
snapshot &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;my-snapshot&lt;/span&gt;&lt;/tt&gt; to the mentioned bucket, run:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
aptly publish snapshot my-snapshot s3:aptly-repo:
&lt;/pre&gt;
&lt;p&gt;As with publishes to local filesystem, you can publish under prefix:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
aptly publish snapshot my-snapshot s3:aptly-repo:debian/
&lt;/pre&gt;
&lt;p&gt;All regular publish commands are supported: you can switch between snapshots (atomically),
update published local repositories, drop published repos, etc. aptly would do its best to upload
package files only once to package pool in S3.&lt;/p&gt;
&lt;p&gt;In order to use published repository, for public repositories use regular HTTP protocol in
&lt;tt class="docutils literal"&gt;/etc/apt/sources.list&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
deb http://s3-us-west-1.amazonaws.com/aptly-repo wheezy main
&lt;/pre&gt;
&lt;p&gt;For private repositories you would need special &lt;a class="reference external" href="https://github.com/kyleshank/apt-s3"&gt;apt s3 transport&lt;/a&gt;,
after installing transport you can use it like that:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
deb s3://AWS_ACCESS_ID:[AWS_SECRET_KEY_IN_BRACKETS]@s3-us-west-1.amazonaws.com/aptly-repo wheezy main
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="package-queries"&gt;
&lt;h2&gt;Package Queries&lt;/h2&gt;
&lt;p&gt;Before 0.7, aptly supported only Debian dependency-like package queries. In version 0.7, complex queries
were introduced. Query syntax matches reprepro query language, reference could be found in the
&lt;a class="reference external" href="http://www.aptly.info/#package-query"&gt;docs&lt;/a&gt;. I'll give some examples.&lt;/p&gt;
&lt;p&gt;Now you can filter mirrors to include only packages with limited priorities:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
aptly mirror create -filter="Priority (required)" wheezy-required http://mirror.yandex.ru/debian/ wheezy main
&lt;/pre&gt;
&lt;p&gt;Or download single packages and all its dependencies:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
aptly mirror create -filter="nginx" -filter-with-deps wheezy-required http://mirror.yandex.ru/debian/ wheezy main
&lt;/pre&gt;
&lt;p&gt;Pull packages with complex conditions:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
aptly snapshot pull snapshot1 source snapshot2 '!Name (% *-dev), $Version (&amp;gt;= 3.5)'
&lt;/pre&gt;
&lt;p&gt;Or remove packages based on query:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
aptly repo remove local-repo 'Name (% http-*) | $Source (webserver)'
&lt;/pre&gt;
&lt;p&gt;In the next version, package queries would be used to filter snapshots, search for packages in
repos/snapshots and local repos, and do whole "world" package searching.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="other-features"&gt;
&lt;h2&gt;Other Features&lt;/h2&gt;
&lt;p&gt;aptly can now pull all matching packages with &lt;tt class="docutils literal"&gt;aptly snapshot pull&lt;/tt&gt; command using flag &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-all-matches&lt;/span&gt;&lt;/tt&gt;, e.g.
one can pull subset of versions from 0.7 to 0.9:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
aptly snapshot pull stable1 foo-snapsot stable2 'foo (&amp;gt;= 0.7), foo (&amp;lt;= 0.9)'
&lt;/pre&gt;
&lt;p&gt;Download speed could be limited while mirroring using config option &lt;cite&gt;downloadSpeedLimit&lt;/cite&gt;, so that aptly
won't consume all bandwidth.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="all-changes"&gt;
&lt;h2&gt;All Changes&lt;/h2&gt;
&lt;p&gt;Full ist of changes since 0.7:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;direct &lt;a href="http://www.aptly.info/#s3-publishing"&gt;publishing to Amazon S3&lt;/a&gt; (&lt;a href="https://github.com/smira/aptly/issues/15"&gt;#15&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;support for new, powerful &lt;a href="http://www.aptly.info/#package-query"&gt;query language&lt;/a&gt; in many commands:
    &lt;a href="http://www.aptly.info/#aptly-snapshot-pull"&gt;aptly snapshot pull&lt;/a&gt;, &lt;a href="http://www.aptly.info/#aptly-repo-move"&gt;aptly repo move&lt;/a&gt;,
    &lt;a href="http://www.aptly.info/#aptly-repo-copy"&gt;aptly repo copy&lt;/a&gt;, &lt;a href="http://www.aptly.info/#aptly-repo-import"&gt;aptly repo import&lt;/a&gt; and
    &lt;a href="http://www.aptly.info/#aptly-repo-remove"&gt;aptly repo remove&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;bug fix: files from conflicting packages might override each other while publishing (&lt;a href="https://github.com/smira/aptly/issues/65"&gt;#65&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;partial mirrors: filter package lists when mirroring (&lt;a href="https://github.com/smira/aptly/issues/64"&gt;#64&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;new commands: &lt;a href="http://www.aptly.info/#aptly-mirror-rename"&gt;mirrors&lt;/a&gt;, &lt;a href="http://www.aptly.info/#aptly-repo-rename"&gt;local repositories&lt;/a&gt; and &lt;a href="http://www.aptly.info/#aptly-snapshot-rename"&gt;snapshots&lt;/a&gt; can be renamed (&lt;a href="https://github.com/smira/aptly/issues/63"&gt;#63&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;new command: &lt;a href="http://www.aptly.info/#aptly-mirror-edit"&gt;aptly mirror edit&lt;/a&gt; allows to change mirror filtering (&lt;a href="https://github.com/smira/aptly/issues/63"&gt;#63&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;download transfer rate could be limited either via &lt;a href="http://www.aptly.info/#configuration"&gt;configuration&lt;/a&gt; file parameter &lt;code&gt;downloadSpeedLimit&lt;/code&gt; or with flag &lt;code&gt;-download-limit&lt;/code&gt; for command &lt;a href="http://www.aptly.info/#aptly-mirror-update"&gt;aptly mirror update&lt;/a&gt; (&lt;a href="https://github.com/smira/aptly/issues/62"&gt;#62&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;new flag: &lt;code&gt;-all-matches&lt;/code&gt; for &lt;a href="http://www.aptly.info/#aptly-snapshot-pull"&gt;aptly snapshot pull&lt;/a&gt; enables pulling of all matching
  packages (&lt;a href="https://github.com/smira/aptly/pull/70"&gt;#70&lt;/a&gt;), thanks to &lt;a href="https://github.com/simonaquino"&gt;Simon Aquino&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;when matching single package in &lt;a href="http://www.aptly.info/#aptly-snapshot-pull"&gt;aptly snapshot pull&lt;/a&gt; latest version would be pulled (&lt;a href="https://github.com/smira/aptly/pull/67"&gt;#67&lt;/a&gt;), thanks to &lt;a href="https://github.com/simonaquino"&gt;Simon Aquino&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;new flag: &lt;code&gt;-sort&lt;/code&gt; for &lt;a href="http://www.aptly.info/#aptly-snapshot-list"&gt;aptly snapshot list&lt;/a&gt; allows to change order of snapshots in the list (&lt;a href="https://github.com/smira/aptly/pull/73"&gt;#73&lt;/a&gt;), thanks to &lt;a href="https://github.com/simonaquino"&gt;Simon Aquino&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;bug fix: publish update fails on empty multi-component repo (&lt;a href="https://github.com/smira/aptly/issues/66"&gt;#66&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;bug fix: &lt;a href="http://www.aptly.info/#aptly-snapshot-pull"&gt;aptly snapshot pull&lt;/a&gt; might remove already pulled packages (&lt;a href="https://github.com/smira/aptly/issues/78"&gt;#78&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;bug fix: aptly package was missing &lt;code&gt;bzip2&lt;/code&gt; dependency (&lt;a href="https://github.com/smira/aptly/issues/84"&gt;#84&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;aptly binary packages are built with go1.3&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><category>aptly</category><category>devops</category><guid>http://www.smira.ru/posts/aptly-07.html</guid><pubDate>Tue, 29 Jul 2014 17:22:04 GMT</pubDate></item><item><title>Golang Meetup July 2014</title><link>http://www.smira.ru/posts/golang-meetup-july-2014.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;Вчера прошел отличный &lt;a class="reference external" href="http://www.meetup.com/Golang-Moscow/events/194773402/"&gt;Golang Moscow Meetup&lt;/a&gt; в офисе Google. Было
очень много участников, что не может не радовать. Интересный crash course Go от Дмитрия Вьюкова, "секретный" проект по
автоматической генерации кода от Алексея Палажченко. Всем большое спасибо!&lt;/p&gt;
&lt;p&gt;Выкладываю слайды своего доклада:&lt;/p&gt;
&lt;iframe src="//www.slideshare.net/slideshow/embed_code/37354492" width="597" height="486" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen&gt; &lt;/iframe&gt;</description><category>aptly</category><category>golang</category><category>meetup</category><category>разработка</category><guid>http://www.smira.ru/posts/golang-meetup-july-2014.html</guid><pubDate>Fri, 25 Jul 2014 12:37:35 GMT</pubDate></item><item><title>aptly 0.6</title><link>http://www.smira.ru/posts/aptly-06.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;Новая версия &lt;a class="reference external" href="http://www.aptly.info"&gt;aptly&lt;/a&gt; 0.6 была выпущена 7-го июня. aptly можно скачать
в виде  &lt;a class="reference external" href="http://www.aptly.info#download"&gt;исполняемых файлов&lt;/a&gt; или подключив Debian-репозиторий:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
deb http://repo.aptly.info/ squeeze main
&lt;/pre&gt;
&lt;p&gt;При установке из репозитория в первый раз, не забудьте проимпортировать ключ, которым подписан релиз:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ gpg --keyserver keys.gnupg.net --recv-keys 2A194991
$ gpg -a --export 2A194991 | sudo apt-key add -
&lt;/pre&gt;
&lt;p&gt;Вот самые важные новые возможности этой версии:&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;Публикация репозиториев из нескольких компонентов&lt;/h2&gt;
&lt;p&gt;Одной из основных идей aptly является список пакетов: snapshotы, зеркала и локальные репозитории -
это списки пакетов (если быть более точным, списки ссылок на пакетов). Когда происходит операции
слияния, перетаскивания, копирования или перемещения пакетов - пакеты перемещаются между списками.
Компоненты - это способ разбить список пакетов на группы, обычно эти группы имеют смысл только
для опубликованных репозиториев. В то же самое время сопоставление пакета и компонента
не является универсальным: Debian группирует пакеты в компоненты &lt;tt class="docutils literal"&gt;main&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;contrib&lt;/tt&gt; и &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;non-free&lt;/span&gt;&lt;/tt&gt;,
Ubuntu использует другое разделение на компоненты, а сторонние репозитории используют компоненты
для разделения пакетов для разных версий Debian (например, &lt;tt class="docutils literal"&gt;squeeze&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;wheezy&lt;/tt&gt; и т.п.)  или для
обозначения стабильных и тестовый версий пакетов.&lt;/p&gt;
&lt;p&gt;Чтобы не переусложнять aptly, я решил, что не стоит создавать отображение пакетов на компоненты и
не разбивать списки пакетов на компоненты. Каждый список (snapshot, зеркало или локальный репозиторий)
состоит из "одного компонента" (на самом деле в нем нет компонентов вообще). Во время публикация репозитория
несколько таких списков могут быть опубликованы как отдельные компоненты.&lt;/p&gt;
&lt;p&gt;По умолчанию при создании зеркала aptly объединяет все компоненты в единый список. Если мы хотим
сохранить разделения, для каждого исходного комопонента необходимо создать зеркало:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
aptly mirror create wheezy-main http://ftp.ru.debian.org/debian/ wheezy main
aptly mirror create wheezy-contrib http://ftp.ru.debian.org/debian/ wheezy main
aptly mirror create wheezy-non-free http://ftp.ru.debian.org/debian/ wheezy non-free

aptly mirror list -raw | xargs -n 1 aptly mirror update
&lt;/pre&gt;
&lt;p&gt;Затем мы создадим snapshot для каждого зеркала:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
aptly snapshot create wheezy-main-7.5 from mirror wheezy-main
aptly snapshot create wheezy-contrib-7.5 from mirror wheezy-contrib
aptly snapshot create wheezy-non-free-7.5 from mirror wheezy-non-free
&lt;/pre&gt;
&lt;p&gt;И опубликуем все snapshotы в едином репозитории, сохраняя исходную структуру компонентов
(мы публикуем distribution &lt;tt class="docutils literal"&gt;wheezy&lt;/tt&gt; в префикс &lt;tt class="docutils literal"&gt;upstream&lt;/tt&gt;):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
aptly publish snapshot -component=main,contrib,non-free -distrubtion=wheezy wheezy-main-7.5 wheezy-contrib-7.5 wheezy-non-free-7.5  upstream
&lt;/pre&gt;
&lt;p&gt;aptly достаточно умен, чтобы самостоятельно определить имена компонентов и название дистрибутива, так что можно
опустить их имена (запятые необходимы, чтобы aptly знал количество компонентов):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
aptly publish snapshot -component=,, wheezy-main-7.5 wheezy-contrib-7.5 wheezy-non-free-7.5 upstream
&lt;/pre&gt;
&lt;p&gt;Конечно, мы могли выполнять все обычные операции, которые поддерживает aptly: объединение snapshotов,
перетаскивание пакетов и т.п.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;Обработка конфликтов пакетов&lt;/h2&gt;
&lt;p&gt;Пакет во вселенной пакетов Debian идентифицируется тройкой (architecture, name, version). Если у двух пакетов
одинаковые (architecture, name, version), но разное содержимое, такую ситуацию называют конфликтом
пакетов. Руководство Debian запрещение включение конфликтующих пакетов в репозитории, которые могут
использоваться совместно на одной машине (такие репозитории, которые могут быть включены в один файл
&lt;tt class="docutils literal"&gt;apt.sources&lt;/tt&gt;). К сожалению, в действительности такие конфликты встречаются не так уж редко:
один такой пакет существует в репозиториях &lt;tt class="docutils literal"&gt;squeeze&lt;/tt&gt; + security updates, другая такая же ситуация
в репозитории puppet, где собраны одни и те же версии пакетов для разных дистрибутивов Debian в одном
репозитории и разных компонентах.&lt;/p&gt;
&lt;p&gt;До версии 0.6 при обнаружении конфликта aptly останавливался и не позволял продолжать операцию. В новой версии
aptly умеет обрабатывать такие конфликты, есть только одно ограничение: конфликт не должен произойти
в рамках одного списка (в одном snapshot, одном зеркале или локальном репозитории). Но это ограничение
вполне естественно, иначе конфликт может опубликован в одном репозитории, что точно недопустимо.&lt;/p&gt;
&lt;p&gt;Это изменение незаметно для пользователей, обновившихся до версии 0.6: aptly в фоновом режиме по мере
обновления зеркал или создания новых snapshot обновляет способ хранения ссылок на пакеты.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;Публикация пустых репозиториев&lt;/h2&gt;
&lt;p&gt;Многие люди используют aptly для автоматизации каких-то процессов, в том числе и с использованием
систем управления конфигурацией. Для таких сценариев использования удобно создать локальный
репозиторий (пустой), сразу его опубликовать, чтобы создать точку для &lt;tt class="docutils literal"&gt;apt.sources&lt;/tt&gt;, а потом
добавлять пакеты и обновлять опубликованный репозиторий.&lt;/p&gt;
&lt;p&gt;До версии 0.6 aptly не позволял публиковать пустые репозитории, теперь это ограничение снято.
При публикации пустого репозитория необходимо сразу корректно задать список архитектур
(обычно aptly автоматически определяет список архитектур по списку пакетов, в случае пустого
списка это невозможно). После публикации изменить список архитектур уже неовзможно, для его
изменения потребуется удалить опубликованный репозиторий и опубликовать заново.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="snapshot"&gt;
&lt;h2&gt;Объединение snapshotов: новая стратегия&lt;/h2&gt;
&lt;p&gt;aptly поддерживает слияние snapshotов - это может быть полезно для объединения основного репозитория
с обновлениями безопасности или со сторонним репозиторием. В версии 0.6 доступно три стратегии
объединения:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;из пакетов с одинаковой парой (architecture, name) остается тот, который принадлежит snapshotу, который
расположен "правее" в командной строке (по умолчанию);&lt;/li&gt;
&lt;li&gt;из пакетов с одинаковой парой (architecture, name) остается тот, версия которого больше (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-latest&lt;/span&gt;&lt;/tt&gt;);&lt;/li&gt;
&lt;li&gt;все версии пакетов сохраняются (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-no-remove&lt;/span&gt;&lt;/tt&gt;, новое в 0.6).&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="id5"&gt;
&lt;h2&gt;Полный список изменений&lt;/h2&gt;
&lt;p&gt;Вот полный список изменений в версии 0.5:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;support for multi-component published repositories (&lt;a href="https://github.com/smira/aptly/issues/36"&gt;#36&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;handling duplicate packages with different content gracefully (&lt;a href="https://github.com/smira/aptly/issues/60"&gt;#60&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;repositories published by aptly now can be consumed by debian-installer (&lt;a href="https://github.com/smira/aptly/issues/61"&gt;#61&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;new flag: &lt;code&gt;-no-remove&lt;/code&gt; for &lt;a href="http://www.aptly.info/#aptly-snapshot-merge"&gt;aptly snapshot merge&lt;/a&gt; to merge snapshots with all package versions preserved (&lt;a href="https://github.com/smira/aptly/issues/57"&gt;#57&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;publishing of empty snapshots/repositories is possible (&lt;a href="https://github.com/smira/aptly/issues/55"&gt;#55&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.aptly.info/#aptly-repo-add"&gt;aptly repo add&lt;/a&gt; now exists with 1 if any of files failed to add (&lt;a href="https://github.com/smira/aptly/issues/53"&gt;#53&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;bug fix: &lt;code&gt;Package:&lt;/code&gt; line comes first in package metadata (&lt;a href="https://github.com/smira/aptly/issues/49"&gt;#49&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;bug fix: when command parsing fails, aptly returns exit code 2 (&lt;a href="https://github.com/smira/aptly/issues/52"&gt;#52&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;bug fix: pulling more than 128 packates at once (&lt;a href="https://github.com/smira/aptly/issues/53"&gt;#53&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;bug fix: &lt;a href="http://www.aptly.info/#aptly-graph"&gt;aptly graph&lt;/a&gt; may get confused with package pull requests (&lt;a href="https://github.com/smira/aptly/issues/58"&gt;#58&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><category>aptly</category><category>devops</category><guid>http://www.smira.ru/posts/aptly-06.html</guid><pubDate>Sun, 08 Jun 2014 20:57:38 GMT</pubDate></item><item><title>aptly 0.5</title><link>http://www.smira.ru/posts/aptly-05.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;Новая версия &lt;a class="reference external" href="http://www.aptly.info"&gt;aptly&lt;/a&gt; 0.5 была выпущена сегодня. aptly можно скачать
в виде  &lt;a class="reference external" href="http://www.aptly.info#download"&gt;исполняемых файлов&lt;/a&gt; или подключив Debian-репозиторий:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
deb http://repo.aptly.info/ squeeze main
&lt;/pre&gt;
&lt;p&gt;При установке из репозитория в первый раз, не забудьте проимпортировать ключ, которым подписан релиз:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ gpg --keyserver keys.gnupg.net --recv-keys 2A194991
$ gpg -a --export 2A194991 | sudo apt-key add -
&lt;/pre&gt;
&lt;p&gt;Вот самые важные новые возможности в этой версии:&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;Публикация локальных репозиториев&lt;/h2&gt;
&lt;p&gt;Есть два основных случая использования локальных репозиториев:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;тестирование новых версий пакетов&lt;/li&gt;
&lt;li&gt;предоставление стабильного способа распространения новых версий&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Во втором случае лучше всего создать snapshot локального репозитория и опубликовать его.
Однако когда активно тестируются новые версии, создание snapshot при каждом изменении выглядит
не очень разумным. aptly начиная с версии 0.5 поддерживает
&lt;a class="reference external" href="http://www.aptly.info/#aptly-publish-repo"&gt;публикацию локальных репозиториев напрямую&lt;/a&gt;.
Более того, когда репозиторий обновляет, его опубликованное представление можно обновить в
&lt;a class="reference external" href="http://www.aptly.info/#aptly-publish-update"&gt;один шаг&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;При создании локального репозитория можно указать параметры, которые будут использоваться
по умолчанию при публикации  (distribution and component):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
aptly repo create -distribution=wheezy testing-wheezy
aptly repo add -remove-files testing-wheezy incoming/*.deb
aptly publish repo testing-wheezy
...
aptly repo add -remove-files testing-wheezy incoming/*.deb
aptly publish update wheezy
&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://www.smira.ru/posts/aptly-05.html"&gt;Читать далее…&lt;/a&gt; (3 минут чтения осталось)&lt;/p&gt;&lt;/div&gt;</description><category>aptly</category><category>devops</category><guid>http://www.smira.ru/posts/aptly-05.html</guid><pubDate>Thu, 24 Apr 2014 20:12:18 GMT</pubDate></item><item><title>aptly: система управления репозиториями пакетов (РИТ-2014)</title><link>http://www.smira.ru/posts/aptly-rit-2014.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;Еще одним докладом на &lt;a class="reference external" href="http://ritconf.ru"&gt;РИТ&lt;/a&gt; был рассказ про &lt;a class="reference external" href="http://www.aptly.info"&gt;aptly&lt;/a&gt;. Презентация
не очень сильно отличалась от &lt;a class="reference external" href="http://www.smira.ru/posts/aptly-02-moscow-devops-meetup.html"&gt;доклада на Devops Meetup&lt;/a&gt;, из существенного
нового была только &lt;a class="reference external" href="http://www.aptly.info/#aptly-repo"&gt;поддержка локальных репозиториев&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Было много вопросов про поддержку yum-репозиториев, надо будет обязательно добавить возможность работать с ними
как с Debian репозиториями.&lt;/p&gt;
&lt;p&gt;Слайды доклада:&lt;/p&gt;
&lt;iframe src="http://www.slideshare.net/slideshow/embed_code/33516298?rel=0" width="597" height="486" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%;" allowfullscreen&gt; &lt;/iframe&gt;&lt;p&gt;Новая версия aptly 0.5 все еще задерживается, никак не могу выделить достаточное количество времени, чтобы закончить
разработку. Но скоро уже все должно быть!&lt;/p&gt;</description><category>aptly</category><category>рит</category><guid>http://www.smira.ru/posts/aptly-rit-2014.html</guid><pubDate>Mon, 14 Apr 2014 19:41:26 GMT</pubDate></item><item><title>aptly 0.4</title><link>http://www.smira.ru/posts/aptly-04.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;Сегодня вышла версия &lt;a class="reference external" href="http://www.aptly.info/"&gt;aptly&lt;/a&gt; 0.4: теперь aptly поддерживает работу с
&lt;a class="reference external" href="http://www.aptly.info/#aptly-repo"&gt;локальными репозиториями пакетов&lt;/a&gt;. Теперь с помощью aptly можно
управлять коллекцией собственных пакетов, публиковать их, создавать snapshotы, объединять их с upstream
репозиториями.
&lt;a class="reference external" href="http://www.aptly.info/#download"&gt;Скачивайте&lt;/a&gt; или собирайте из &lt;a class="reference external" href="https://github.com/smira/aptly"&gt;исходников&lt;/a&gt;,
&lt;a class="reference external" href="https://github.com/smira/aplty/issues"&gt;пишите багрепорты&lt;/a&gt;, обсуждайте в
&lt;a class="reference external" href="https://groups.google.com/forum/#!forum/aptly-discuss"&gt;группе aptly-discuss&lt;/a&gt;, читайте &lt;a class="reference external" href="https://twitter.com/smira/"&gt;меня (@smira)&lt;/a&gt;
в Twitter, чтобы получить информацию о новых релизах.&lt;/p&gt;
&lt;p&gt;К заметным нововведениям в версии 0.4 также можно отнести поддержку source пакетов, возможность удаления неиспользуемых
файлов, очистка базы данных и оптимизация объема используемой памяти.&lt;/p&gt;
&lt;p&gt;Полный список изменений:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;поддержка локальных репозиториев пакетов&lt;/li&gt;
&lt;li&gt;aptly поддерживает зеркалирование и публикацию source-пакетов в дополнение к бинарным пакетам&lt;/li&gt;
&lt;li&gt;новая команда: &lt;tt class="docutils literal"&gt;aptly db cleanup&lt;/tt&gt; убирает неиспользуемые файлы пакетов и записи в БД&lt;/li&gt;
&lt;li&gt;пиковое использование памяти было уменьшено в три раза&lt;/li&gt;
&lt;li&gt;новые параметры: &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-keyring&lt;/span&gt;&lt;/tt&gt; и &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-secret-keyring&lt;/span&gt;&lt;/tt&gt; в команде &lt;tt class="docutils literal"&gt;aptly snapshot publish&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;новый конфигурационный параметр: &lt;tt class="docutils literal"&gt;downloadSourcePackages&lt;/tt&gt; включает зеркалирование source-пакетов&lt;/li&gt;
&lt;li&gt;новый параметр: &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-with-sources&lt;/span&gt;&lt;/tt&gt; в команде &lt;tt class="docutils literal"&gt;aptly mirror create&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;новые параметры: &lt;tt class="docutils literal"&gt;dependencyFollowSource&lt;/tt&gt;  и &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-dep-follow-source&lt;/span&gt;&lt;/tt&gt;, позволяющие отслеживать``Source:`` зависимости&lt;/li&gt;
&lt;li&gt;новый команды в группе &lt;tt class="docutils literal"&gt;aptly repo&lt;/tt&gt;: &lt;tt class="docutils literal"&gt;add&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;copy&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;create&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;drop&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;import&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;list&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;move&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;remove&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;show&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;команда &lt;tt class="docutils literal"&gt;aptly snapshot create&lt;/tt&gt; поддерживает создание snapshot локальных репозиториев&lt;/li&gt;
&lt;li&gt;новый параметр `` -no-remove`` в команде &lt;tt class="docutils literal"&gt;aptly snapshot pull&lt;/tt&gt;: не удалять другие версии пакетов при перетаскивании
(сохранять старые версии)&lt;/li&gt;
&lt;li&gt;команда &lt;tt class="docutils literal"&gt;aptly mirror create&lt;/tt&gt; поддерживает сокращенные PPA url: &lt;tt class="docutils literal"&gt;ppa:user/project&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;новый конфигурационные параметры: &lt;tt class="docutils literal"&gt;ppaDistributorID&lt;/tt&gt; и &lt;tt class="docutils literal"&gt;ppaCodename&lt;/tt&gt; для указания правил обработки PPA url&lt;/li&gt;
&lt;li&gt;пакеты в списках печатаюся с подчеркиваниями вместо дефисов, например, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pkg_1.3-3_amd64&lt;/span&gt;&lt;/tt&gt; вместо &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pkg-1.3-3-amd64&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;С возможностью работы с локальными репозиториями, схема сущностей aptly и связей между ними теперь выглядит так:&lt;/p&gt;
&lt;img alt="aptly schema" src="http://www.smira.ru/galleries/schema.png"&gt;</description><category>aptly</category><category>devops</category><guid>http://www.smira.ru/posts/aptly-04.html</guid><pubDate>Tue, 11 Mar 2014 12:14:03 GMT</pubDate></item><item><title>Оптимизация использования памяти в aptly</title><link>http://www.smira.ru/posts/aptly-memory-usage-optimization.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;В следующей версии (0.4) &lt;a class="reference external" href="http://www.aptly.info"&gt;aptly&lt;/a&gt; использование памяти в самых частых
операциях сократится в три раза благодаря несложным оптимизациям. Т.к. aptly написана на Go,
это будет короткая история об оптимизации использования памяти программами на Go.&lt;/p&gt;
&lt;p&gt;Когда я начинал разрабатывать aptly, я подозревал, что использование памяти будет далеко не
оптимальным, т.к. aptly "переваривает" большое количество метаданных пакетов (например, зеркало
Debian репозитория может содержать информацию о 30 тыс. пакетов). Я не замечал, что aptly использует
много памяти до того, как не начал тестировать на виртуалке с 512 Мб памяти. aptly работала крайне
медленно из-за постоянного свопирования. Я такого никак не ожидал: почему используется столько памяти?&lt;/p&gt;
&lt;p&gt;Для начала я применил тривиальные оптимизации:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;некоторые долгие операции (например, зеркалирование репозитория), происходят в рамках выполнения одной функции,
и некоторые структуры данных становятся ненужными до окончания работы функции. Так, обнуляя (присваивая &lt;tt class="docutils literal"&gt;nil&lt;/tt&gt;) переменные,
можено дать возможноть garbage collectorу освободить ненужную память до окончания выполнения функции.&lt;/li&gt;
&lt;li&gt;повторное использование буферов для сериализации структур (это безопасно, т.к. нет конкурентного доступа, а результат
сериализации немедленно копируется).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Вместо того, чтобы создавать буфер каждый раз...&lt;/p&gt;
&lt;pre class="code go literal-block"&gt;
&lt;span class="c1"&gt;// Encode does msgpack encoding of Package
&lt;/span&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Package&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;buf&lt;/span&gt; &lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Buffer&lt;/span&gt;

    &lt;span class="nx"&gt;encoder&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nx"&gt;codec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NewEncoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;codec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MsgpackHandle&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="nx"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;... можно использовать его повторно:&lt;/p&gt;
&lt;pre class="code go literal-block"&gt;
&lt;span class="c1"&gt;// Internal buffer reused by all Package.Encode operations
&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;encodeBuf&lt;/span&gt; &lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Buffer&lt;/span&gt;

&lt;span class="c1"&gt;// Encode does msgpack encoding of Package, []byte should be copied, as buffer would
// be used for the next call to Encode
&lt;/span&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Package&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;encodeBuf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nx"&gt;encoder&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nx"&gt;codec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NewEncoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;encodeBuf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;codec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MsgpackHandle&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="nx"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;encodeBuf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Во-вторых, необходимо начать измерять то, что мы пытаемся оптимизировать: использование памяти. С помощью &lt;a class="reference external" href="http://blog.cloudflare.com/recycling-memory-buffers-in-go"&gt;поста в блоге CloudFlare&lt;/a&gt; это сделать совсем несложно. Вот что я обнаружил:&lt;/p&gt;
&lt;img alt="mem stats for aptly snapshot verify" src="http://www.smira.ru/galleries/mem-verify0.png"&gt;
&lt;img alt="mem stats for aptly snapshot verify" src="http://www.smira.ru/galleries/mem-mirror-update1.png"&gt;
&lt;p&gt;&lt;a href="http://www.smira.ru/posts/aptly-memory-usage-optimization.html"&gt;Читать далее…&lt;/a&gt; (1 минут чтения осталось)&lt;/p&gt;</description><category>aptly</category><category>go</category><category>golang</category><category>программирование</category><guid>http://www.smira.ru/posts/aptly-memory-usage-optimization.html</guid><pubDate>Wed, 05 Mar 2014 13:21:41 GMT</pubDate></item><item><title>aptly 0.3</title><link>http://www.smira.ru/posts/aptly-03.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;Сегодня вышла новая версия 0.3 &lt;a class="reference external" href="http://www.aptly.info/"&gt;aptly&lt;/a&gt;. Это первая версия, которую я рекомендую для широкого
использования, &lt;a class="reference external" href="http://www.aptly.info/#download"&gt;скачивайте&lt;/a&gt; или собирайте из &lt;a class="reference external" href="https://github.com/smira/aptly"&gt;исходников&lt;/a&gt;,
&lt;a class="reference external" href="https://github.com/smira/aplty/issues"&gt;пишите багрепорты&lt;/a&gt;, обсуждайте в
&lt;a class="reference external" href="https://groups.google.com/forum/#!forum/aptly-discuss"&gt;группе aptly-discuss&lt;/a&gt;, читайте &lt;a class="reference external" href="https://twitter.com/smira/"&gt;меня (@smira)&lt;/a&gt;
в Twitter, чтобы получить информацию о новых релизах.&lt;/p&gt;
&lt;p&gt;Новые возможности:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;с помощью команды &lt;a class="reference external" href="http://www.aptly.info/#aptly-serve"&gt;aptly serve&lt;/a&gt; можно быстро раздать по HTTP все опубликованные
репозитории, aptly подскажет строчки для apt sources;&lt;/li&gt;
&lt;li&gt;при зеркалировании удаленных репозиториев aptly проверяет цифровую подпись и контрольные суммы загружаемых файлов, если в
в вашей связке ключей GnuPG не хватает ключа для данного репозитория,
aptly &lt;a class="reference external" href="http://www.aptly.info/#aptly-mirror-create"&gt;подскажет&lt;/a&gt; что делать;&lt;/li&gt;
&lt;li&gt;поддерживается flat-формат Debian-репозиториев (такие создает, например, &lt;a class="reference external" href="https://build.opensuse.org"&gt;OBS&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;теперь можно удалять &lt;a class="reference external" href="http://www.aptly.info/#aptly-mirror-drop"&gt;зеркала (mirror)&lt;/a&gt; и
&lt;a class="reference external" href="http://www.aptly.info/#aptly-snapshot-drop"&gt;слепки (snapshot)&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;aptly может &lt;a class="reference external" href="http://www.aptly.info/#aptly-graph"&gt;визуализировать граф зависимостей&lt;/a&gt; между созданными зеркалами, слепками
и опубликованными репозиториями;&lt;/li&gt;
&lt;li&gt;для aptly есть &lt;a class="reference external" href="https://github.com/aptly-dev/aptly-bash-completion"&gt;bash completion&lt;/a&gt;, попробуйте, это очень удобно!&lt;/li&gt;
&lt;li&gt;aptly теперь умеет &lt;a class="reference external" href="http://www.aptly.info/#aptly-snapshot-create"&gt;создавать пустой слепок&lt;/a&gt; (snapshot);&lt;/li&gt;
&lt;li&gt;можно указать расположение конфигурационного файла с помощью ключа &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-config&lt;/span&gt;&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Картинка для привлечения внимания (пример того, что может сделать &lt;a class="reference external" href="http://www.aptly.info/#aptly-graph"&gt;aptly graph&lt;/a&gt;):&lt;/p&gt;
&lt;img alt="output of aptly graph command" src="http://www.smira.ru/galleries/aptlygraph.png"&gt;</description><category>aptly</category><category>devops</category><guid>http://www.smira.ru/posts/aptly-03.html</guid><pubDate>Mon, 10 Feb 2014 19:20:40 GMT</pubDate></item><item><title>aptly 0.2, Встреча DevOps Moscow январь 2013</title><link>http://www.smira.ru/posts/aptly-02-moscow-devops-meetup.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;Случилось два хороших события: вышла версия 0.2 &lt;a class="reference external" href="http://www.aptly.info"&gt;aptly&lt;/a&gt;, и я представил aptly на
&lt;a class="reference external" href="http://tech.yandex.ru/events/yagosti/devops/"&gt;январской встрече DevOps в Москве&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;aptly - это система управления репозиториями пакетами Debian (в будущем и rpm-репозиториями), которая позволяет
контролировать то, какие версии пакетов будут установлены, а также изменять версии пакетов контролируемым образом.
Базовой концепцией aptly является snapshot - неизменяняемый срез репозитория пакетов, который обеспечивает
повторяемость. Операции над срезами позволяют, например, перетащить новую версию nginx из backports или
добавить к основному репозиторию пакет Percona MySQL Server из репозитория Percona.&lt;/p&gt;
&lt;p&gt;К середине февраля должна выйти версия 0.3, в которой будут добавлены небольшие возможности, чтобы пользоваться
aptly было удобнее.&lt;/p&gt;
&lt;p&gt;Пару слов про DevOps Meetup: огранизовано все было отлично, пришло очень много народу, интересные доклады.
&lt;a class="reference external" href="http://www.meetup.com/DevOps-Moscow-in-Russian/"&gt;Следите&lt;/a&gt; за следующими встречами! Видео моего доклада
про aptly &lt;a class="reference external" href="http://tech.yandex.ru/events/yagosti/devops/talks/1598/"&gt;Яндекс уже выложил&lt;/a&gt;. Слайды
доклада можно скачать в формате &lt;a class="reference external" href="http://www.smira.ru/aptly_devops_meetup.pdf"&gt;PDF&lt;/a&gt; или посмотреть  в онлайне под катом.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.smira.ru/posts/aptly-02-moscow-devops-meetup.html"&gt;Читать далее…&lt;/a&gt; (1 минут чтения осталось)&lt;/p&gt;</description><category>aptly</category><category>devops</category><category>meetup</category><guid>http://www.smira.ru/posts/aptly-02-moscow-devops-meetup.html</guid><pubDate>Wed, 29 Jan 2014 08:24:00 GMT</pubDate></item></channel></rss>