<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Andrey Smirnov's Blog (devops)</title><link>http://www.smira.ru/</link><description></description><language>en</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.7 - S3 publishing, complex queries</title><link>http://www.smira.ru/en/posts/aptly-08.html</link><dc:creator>Andrey</dc:creator><description>&lt;a class="reference external" href="http://www.aptly.info"&gt;aptly&lt;/a&gt; 0.8 has been released the day before yesterday.
All news about aptly are now published in aptly blog: &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;</description><category>aptly</category><category>devops</category><guid>http://www.smira.ru/en/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/en/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/en/posts/aptly-07.html</guid><pubDate>Tue, 29 Jul 2014 17:22:04 GMT</pubDate></item><item><title>aptly 0.6</title><link>http://www.smira.ru/en/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 has been released on June, 7th. 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;Most important new features are:&lt;/p&gt;
&lt;div class="section" id="multi-component-repository-publishing"&gt;
&lt;h2&gt;Multi-Component Repository Publishing&lt;/h2&gt;
&lt;p&gt;aptly is based on concept of list of packages. Snapshots, mirrors and local repositories are list of packages
(more precisely, list of references to packages). When merging, pulling, copying or moving packages might
move from one list into another. Component is a way to break down packages into groups, usually these groups
make sense only in published repository. At the same time mapping from package to component is not universal,
there's Debian way to group packages into &lt;tt class="docutils literal"&gt;main&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;contrib&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;non-free&lt;/span&gt;&lt;/tt&gt; components, Ubuntu uses
different schema of components, some 3rd party repositories use components in place of different distributions
(like &lt;tt class="docutils literal"&gt;squeeze&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;wheezy&lt;/tt&gt; etc.) or to separate stable and testing versions of software.&lt;/p&gt;
&lt;p&gt;In order to keep aptly simple, I decided that there's no mapping from package to component and package lists
internally aren't split by component. Each list (snapshot, mirror and local repository) is mono-component
(actually there's no component at all). When publishing repository, several lists could be published as
separate components.&lt;/p&gt;
&lt;p&gt;By default, aptly mirrors all components from remote repository and merges them into one "single component".
If we'd like to preserve package split by components, individual mirrors should be created for each component:&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;We can create snapshots from each of the mirrors:&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;And publish all snapshots as single repository preserving component structure  (publishing distribution &lt;tt class="docutils literal"&gt;wheezy&lt;/tt&gt; under
prefix &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 -distribution=wheezy wheezy-main-7.5 wheezy-contrib-7.5 wheezy-non-free-7.5  upstream
&lt;/pre&gt;
&lt;p&gt;aptly is smart enough to figure out component names and distribution from the mirrors, so I can omit
them (commas left to identify number of components):&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;Of course we could do all regular aptly operations: merging snapshots, pulling packages, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="handling-package-conflicts"&gt;
&lt;h2&gt;Handling Package Conflicts&lt;/h2&gt;
&lt;p&gt;Package in Debian universe is identified by triple (architecture, name, version). If two packages have
the same (architecture, name, version) but different content, they are called conflicting packages.
Debian guidelines prohibit including conflicting packages in repositories that could be used together
(which could be present in one &lt;tt class="docutils literal"&gt;apt.sources&lt;/tt&gt; file). Unfortunately, in real word there are conflicting
packages, one such package has been reported in &lt;tt class="docutils literal"&gt;squeeze&lt;/tt&gt; + security updates, another example was
puppet repository which contains packages with the same triple but for different Debian distributions in
several components.&lt;/p&gt;
&lt;p&gt;Before 0.6, aptly would complain when it detects such conflicts and stop processing. In this version
special handling has been added that considers packages with same (architecture, name, version) and different
files as different package entires. There's one restriction though: you can't put packages with duplicate
(architecture, name, version) into one list (one mirror, snapshot, local repo, published repository).
This is in line with Debian guidelines that one repository shouldn't contain duplicate packages.&lt;/p&gt;
&lt;p&gt;This feature works transparently when upgrading from older versions of aptly: conflicts would be
just gone. In the background aptly would be updating references to packages when you update mirrors,
create new snapshots, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="empty-repository-publishing"&gt;
&lt;h2&gt;Empty Repository Publishing&lt;/h2&gt;
&lt;p&gt;Many people are using aptly to handle package repository from various automation tools, e.g.
configuration management systems. For such usage it is convenient to create local repository
(empty initially), publish it, and then add packages and update published repository.&lt;/p&gt;
&lt;p&gt;Before 0.6, aptly would refuse to publish empty repositories. Now this is possible, but
correct architecture list should be supplied when publishing (as aptly can't figure out
architecture list automatically from package list). List of architectures can't be changed
when published repository is updated, you would have drop published repository and create
new one if required.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="merging-snapshots-3rd-strategy"&gt;
&lt;h2&gt;Merging Snapshots: 3rd Strategy&lt;/h2&gt;
&lt;p&gt;There's a feature in aptly that allows to merge two snapshots: this is useful to combine for example
main repository and security updates or main repository and 3rd-party repository. With 0.6, three
merge strategies are available:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;for packages with same (architecture, name) package which comes from latest snapshot on the command line wins (default);&lt;/li&gt;
&lt;li&gt;for packages with same (architecture, name) package with latest version wins (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-latest&lt;/span&gt;&lt;/tt&gt;);&lt;/li&gt;
&lt;li&gt;all versions of packages are preserved (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-no-remove&lt;/span&gt;&lt;/tt&gt;, new in 0.6).&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="all-changes"&gt;
&lt;h2&gt;All Changes&lt;/h2&gt;
&lt;p&gt;Full list of changes in 0.6:&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/en/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/en/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 has been released today. 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;Most important new features are:&lt;/p&gt;
&lt;div class="section" id="local-repository-publishing"&gt;
&lt;h2&gt;Local Repository Publishing&lt;/h2&gt;
&lt;p&gt;Local repositories could be used in two ways:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;test new versions of software&lt;/li&gt;
&lt;li&gt;provide stable distribution of new versions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the second case, it is best to create snapshots of local repositories and publish them.
However, when testing out new versions, there isn't much sense in creating snapshot each time
repository is updated. So aptly since version 0.5 supports
&lt;a class="reference external" href="http://www.aptly.info/#aptly-publish-repo"&gt;direct publishing of repositories&lt;/a&gt;.
Moreover, when local repository is updated, published repository could be updated
as well in &lt;a class="reference external" href="http://www.aptly.info/#aptly-publish-update"&gt;one step&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When local repository is created, default publishing options (distribution and component)
could be specified, so that these options don't need to be specified when publishing:&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/en/posts/aptly-05.html"&gt;Read more…&lt;/a&gt; (3 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>aptly</category><category>devops</category><guid>http://www.smira.ru/en/posts/aptly-05.html</guid><pubDate>Thu, 24 Apr 2014 20:12:18 GMT</pubDate></item><item><title>aptly 0.4</title><link>http://www.smira.ru/en/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; version 0.4 has been released today. Major feature in this version is
&lt;a class="reference external" href="http://www.aptly.info/#aptly-repo"&gt;local package repository management&lt;/a&gt; which allows to manage collection
of your own packages, publish, take snapshots, mix with upstream repositories mirrors.
Please &lt;a class="reference external" href="http://www.aptly.info/#download"&gt;download it&lt;/a&gt; or install from &lt;a class="reference external" href="https://github.com/smira/aptly"&gt;source&lt;/a&gt;,
&lt;a class="reference external" href="https://github.com/smira/aplty/issues"&gt;raise issues&lt;/a&gt;, disscuss in
&lt;a class="reference external" href="https://groups.google.com/forum/#!forum/aptly-discuss"&gt;aptly-discuss group&lt;/a&gt;, follow &lt;a class="reference external" href="https://twitter.com/smira/"&gt;me (@smira)&lt;/a&gt;
to get information about updates.&lt;/p&gt;
&lt;p&gt;Other features in 0.4 worth mentioning are: support for source packages for mirrors and local repositories,
ability to delete unused package files and DB entries, and memory usage optimizations.&lt;/p&gt;
&lt;p&gt;Full list of changes in this version:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;local package repositories are supported&lt;/li&gt;
&lt;li&gt;aptly supports mirroring remote repos with source packages and publishing repositories with sources&lt;/li&gt;
&lt;li&gt;new command: &lt;tt class="docutils literal"&gt;aptly db cleanup&lt;/tt&gt; to remove unreferenced DB entries and files&lt;/li&gt;
&lt;li&gt;aptly peak memory usage has been reduced by factor of 3x&lt;/li&gt;
&lt;li&gt;new flags: &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-keyring&lt;/span&gt;&lt;/tt&gt; &amp;amp; &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-secret-keyring&lt;/span&gt;&lt;/tt&gt; for &lt;tt class="docutils literal"&gt;aptly snapshot publish&lt;/tt&gt; command&lt;/li&gt;
&lt;li&gt;new config: &lt;tt class="docutils literal"&gt;downloadSourcePackages&lt;/tt&gt; to enable source package downloading&lt;/li&gt;
&lt;li&gt;new flag: &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-with-sources&lt;/span&gt;&lt;/tt&gt; for &lt;tt class="docutils literal"&gt;aptly mirror create&lt;/tt&gt; command&lt;/li&gt;
&lt;li&gt;new config &amp;amp; flag: &lt;tt class="docutils literal"&gt;dependencyFollowSource&lt;/tt&gt; &amp;amp; &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-dep-follow-source&lt;/span&gt;&lt;/tt&gt; to follow &lt;tt class="docutils literal"&gt;Source:&lt;/tt&gt; dependencies&lt;/li&gt;
&lt;li&gt;new commands in &lt;tt class="docutils literal"&gt;aptly repo&lt;/tt&gt; family: &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;command &lt;tt class="docutils literal"&gt;aptly snapshot create&lt;/tt&gt; supports creation of snapshots from local repos&lt;/li&gt;
&lt;li&gt;new flag`` -no-remove`` for &lt;tt class="docutils literal"&gt;aptly snapshot pull&lt;/tt&gt;: don't remove other version of packages when pulling (e.g. keep old versions)&lt;/li&gt;
&lt;li&gt;command &lt;tt class="docutils literal"&gt;aptly mirror create&lt;/tt&gt; supports shorthand PPA url: &lt;tt class="docutils literal"&gt;ppa:user/project&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;new config: &lt;tt class="docutils literal"&gt;ppaDistributorID&lt;/tt&gt; &amp;amp; &lt;tt class="docutils literal"&gt;ppaCodename&lt;/tt&gt; to specify PPA url expansion rules&lt;/li&gt;
&lt;li&gt;packages are printed in lists with underscores instead of dashes, e.g. &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pkg_1.3-3_amd64&lt;/span&gt;&lt;/tt&gt; instead of &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;With addition of local package repositories, schema of aptly entities and transitions looks like that:&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/en/posts/aptly-04.html</guid><pubDate>Tue, 11 Mar 2014 12:14:03 GMT</pubDate></item><item><title>aptly 0.3</title><link>http://www.smira.ru/en/posts/aptly-03.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;Today I've released &lt;a class="reference external" href="http://www.aptly.info/"&gt;aptly&lt;/a&gt; version 0.3. It's the first version I would recommend for production usage.
Please &lt;a class="reference external" href="http://www.aptly.info/#download"&gt;download it&lt;/a&gt; or install from &lt;a class="reference external" href="https://github.com/smira/aptly"&gt;source&lt;/a&gt;,
&lt;a class="reference external" href="https://github.com/smira/aplty/issues"&gt;raise issues&lt;/a&gt;, disscuss in
&lt;a class="reference external" href="https://groups.google.com/forum/#!forum/aptly-discuss"&gt;aptly-discuss group&lt;/a&gt;, follow &lt;a class="reference external" href="https://twitter.com/smira/"&gt;me (@smira)&lt;/a&gt;
to get information about updates.&lt;/p&gt;
&lt;p&gt;New features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;using &lt;a class="reference external" href="http://www.aptly.info/#aptly-serve"&gt;aptly serve&lt;/a&gt; command you can quickly serve your published repositories over HTTP,
aptly would even advise right settings for apt sources;&lt;/li&gt;
&lt;li&gt;aptly checks signatures and verifies checksums for downloaded files while mirroring remote repositories, if you don't have
key that was used to sign the mirror in your trusted GnuPG keychain, aptly would give some hints,
&lt;a class="reference external" href="http://www.aptly.info/#aptly-mirror-create"&gt;some hints&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;flat format of Debian repositories is now supported (e.g. &lt;a class="reference external" href="https://build.opensuse.org"&gt;OBS&lt;/a&gt; creates repositories in such format);&lt;/li&gt;
&lt;li&gt;now you can drop &lt;a class="reference external" href="http://www.aptly.info/#aptly-mirror-drop"&gt;mirrors&lt;/a&gt; and
&lt;a class="reference external" href="http://www.aptly.info/#aptly-snapshot-drop"&gt;snapshots&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;aptly can &lt;a class="reference external" href="http://www.aptly.info/#aptly-graph"&gt;draw graph of relationships&lt;/a&gt; between your mirros, snapshots and published
repositories;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/aptly-dev/aptly-bash-completion"&gt;bash completion&lt;/a&gt; is available for aptly, try it out, it's amazing!&lt;/li&gt;
&lt;li&gt;aptly gained ability to &lt;a class="reference external" href="http://www.aptly.info/#aptly-snapshot-create"&gt;create empty snapshot&lt;/a&gt;, it could be useful if you'd
like to extract part of repository by &lt;a class="reference external" href="http://www.aptly.info/#aptly-snapshot-pull"&gt;pulling&lt;/a&gt; packages;&lt;/li&gt;
&lt;li&gt;custom config location could be given with flag &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;Nice picture (actually it's output of &lt;a class="reference external" href="http://www.aptly.info/#aptly-graph"&gt;aptly graph&lt;/a&gt; command):&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/en/posts/aptly-03.html</guid><pubDate>Mon, 10 Feb 2014 19:20:40 GMT</pubDate></item><item><title>aptly 0.2, Moscow DevOps Meetup</title><link>http://www.smira.ru/en/posts/aptly-02-moscow-devops-meetup.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;Two great things have happened recently:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I've released &lt;a class="reference external" href="http://www.aptly.info"&gt;aptly&lt;/a&gt; version 0.2, which is alpha-quality.&lt;/li&gt;
&lt;li&gt;I've presented aptly at &lt;a class="reference external" href="http://tech.yandex.ru/events/yagosti/devops/"&gt;DevOps Meetup Moscow&lt;/a&gt; (in Russian).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Slides from my talk about aptly can be downloaded in &lt;a class="reference external" href="http://www.smira.ru/aptly_devops_meetup_eng.pdf"&gt;PDF&lt;/a&gt; (English version).&lt;/p&gt;
&lt;iframe src="http://www.slideshare.net/slideshow/embed_code/30569026" 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;div style="margin-bottom:5px"&gt; &lt;strong&gt; &lt;a href="https://www.slideshare.net/Smirnov.Andrey/aptly-debian-repository-management-tool" title="aptly: Debian repository management tool" target="_blank"&gt;aptly: Debian repository management tool&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href="http://www.slideshare.net/Smirnov.Andrey" target="_blank"&gt;Andrey Smirnov&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;</description><category>aptly</category><category>devops</category><category>meetup</category><guid>http://www.smira.ru/en/posts/aptly-02-moscow-devops-meetup.html</guid><pubDate>Wed, 29 Jan 2014 08:24:00 GMT</pubDate></item><item><title>Budapest Devops Meetup Nov 18, 2013</title><link>http://www.smira.ru/en/posts/budapest-devops-meetup.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;I've neen invited to join Budapest Devops Meetup by &lt;a class="reference external" href="http://prezi.com/about/peter-halacsy/"&gt;Péter Halácsy&lt;/a&gt; and &lt;a class="reference external" href="http://prezi.com/about/gabor-veszi/"&gt;Gábor Vészi&lt;/a&gt;. I've been talking about DevOps transformation in Qik, how different teams were successful or not in changing the way the deployment and infrastructure changes are handled. I've presented the challenges they faced with monitoring, implementing DRY principle, making teams truly cross-functional and DevOps.Dev and Ops in huge organizations like Skype.&lt;/p&gt;
&lt;p&gt;Presentation is available in &lt;a class="reference external" href="http://www.smira.ru/BPMeetup181013.pdf"&gt;PDF&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.smira.ru/en/posts/budapest-devops-meetup.html"&gt;Read more…&lt;/a&gt; (1 min remaining to read)&lt;/p&gt;</description><category>budapest</category><category>devops</category><category>meetup</category><guid>http://www.smira.ru/en/posts/budapest-devops-meetup.html</guid><pubDate>Tue, 10 Dec 2013 12:44:14 GMT</pubDate></item></channel></rss>