/ ubuntu

Aptly - 自建 Debian Repo 的好工具

這套工具只能說太神奇,省了我很多時間,也很方便管理(也許是我沒幾個東西要放?哈!)。

基本的環境需求如下:

當然你須先裝 homebrew 然後再透過它來安裝 golang #1 or #2,這樣相對後面再升級 golang 的時候會比較好處理。

安裝 Aptly

當然透過 apt-get 來裝在系統是很美妙的一件事情,不需花太多時間,請參考 Aptly 頁面。或是直接從這邊來下載 binary 來跑也是很簡單。

但是基於手賤的理由,還是跑跑流程,從 Github - Aptly 的源碼開始來做吧!

go get -u github.com/mattn/gom
mkdir -p $GOPATH/src/github.com/smira/aptly
git clone https://github.com/smira/aptly $GOPATH/src/github.com/smira/aptly
cd $GOPATH/src/github.com/smira/aptly
gom -production install
gom build -o $GOPATH/bin/aptly

建立 aptly.conf

這邊的 rootDir 的設定,建議大家用絕對路徑,因為在 Mac 上用相對路徑似乎會有對應上的問題,就是你會開很多 aptly repo db ,所以別搞自己了。我是沒有在 Ubuntu 的環境下測試過,也許 Ubuntu 的環境會比較正常。

{
    "rootDir": "/Users/charles/.aptly_repo",
    "downloadConcurrency": 4,
    "downloadSpeedLimit": 0,
    "architectures": [ "amd64" ],
    "dependencyFollowSuggests": false,
    "dependencyFollowRecommends": false,
    "dependencyFollowAllVariants": false,
    "dependencyFollowSource": false,
    "gpgDisableSign": false,
    "gpgDisableVerify": false,
    "downloadSourcePackages": false,
    "ppaDistributorID": "ubuntu",
    "ppaCodename": "trusty",
    "SwiftPublishEndpoints": {
       "saio": {
            "osname": "<username>",
            "password": "<password>",
            "authurl": "http://192.168.190.21/auth/v1.0",
            "container": "repo"
        }
    }
}

關於這 SwiftPublishEndpoints 的部分,你可以直接發佈到 OpenStack Swift (Object storage) 上指定的 Container (類似 Amazon S3 的 Bucket) 裡面,然後你就可以直接把 Swift 當成一個 Ubuntu repo 來用,細節請參考 發佈到 OpenStack Swift 的文件,不過我在使用的時候有遇到問題,細節請參考 Bug #457 ,有點白爛的 Bug ,這就是人生啊!

    "SwiftPublishEndpoints": {
       "saio": {
            "osname": "<username>",
            "password": "<password>",
            "authurl": "http://192.168.10.21/auth/v1.0",
            "container": "repo"
        }
    }

當然 Aptly 也是有提供相對應發佈到 Amazon s3的文件,請自己參考啦!

建立 Local repo

$ aptly repo list

# 建立 helloworld 的 repo
$ aptly repo create helloworld

# 把 debian 加入到這個 repo
$ aptly repo add helloworld *.deb

# 可以顯示在這個 repo 下所包含的所有 packages
$ aptly repo show -with-packages helloworld

# 移除特定的 package
$ aptly repo remove helloworld python-pkg1.all

# 建立 snapshot 方便後面把資料直接 push 到 OpenStack Swift or S3 上
$ aptly snapshot create release from repo helloworld 

首次 publish 到 OpenStack Swift

這邊的選項 -gpg-key="<KEY_ID>" 是必須的,如果你沒給,他會找預設的,但是我常常搞不清楚他用哪把去做簽核的動作,所以請參考我之前的文章 GPG Suite - Mac上管理 GPG Keys 的好工具 建立一組 gpg key ,然後選你想要的 key 去用。最後,記得同步到 public key server 上面,這樣想使用這個 repo 的人才有地方拉 key。

# Ubuntu
$ aptly -gpg-key="B0FFFFF1" -distribution=trusty publish snapshot release swift:saio:

# Debian
$ aptly -gpg-key="B0FFFFF1" -distribution=jessie publish snapshot release swift:saio:

下完上面的指令,大致上都完成了。

更新 swift 上的 repo

其實,更新的方式就是打一個新的 snapshot ,然後在 publish 上去一次。我記得官方文件寫了一堆,但是我發現透過 snapshot 比較簡單。

# Ubuntu
$ aptly -gpg-key="B0FFFFF1" publish switch trusty swift:saio: release-2

# Debian
$ aptly -gpg-key="B0FFFFF1" publish switch jessie swift:saio: release-2

細節請參考 完整文件

接下來再找時間寫:

  • 使用者應該如何取用這個 repo
  • OpenStack Swift 應如何設定 container ACL