お気に入りのユーザー用に10個のパッケージを収集し、それぞれが2つのディストリビューション(たとえば、Debian不安定版とUbuntu jaunty)、および2つのアーキテクチャ(amd64とi386)用に収集するとします。 リポジトリを作成するための優れたツール、repreproについて学びました。 それ以来、彼はリポジトリのパックにパッケージを含める方法を学びませんでした-一度に1つだけ。 これは、gpg-signatureを10 * 2 * 2 = 40回入力する必要があることを意味します。 これらの10個のパッケージを効率的に収集する方法、特にそれらが毎日更新される場合はどうですか?
実際、私の状況はさらに悪化しました。 合計すると、qutIMリポジトリを更新するときに、176回(1767回)の短いgpgキーを決して入力する必要がありませんでした。 私はそれを完全に疲れて怠を克服するまでに、この手順をわずか3分で実行しました。 しかし、私たちはあなたを拷問しません、私たちはすぐに状況を修正します。 そのため、gnupg-agentパッケージをインストールして〜/ .bashrcファイルを編集し、最後に次の行を追加します。
# # GnuPG # gpg-agent --daemon --enable-ssh-support --write-env-file " ${HOME} /.gpg-agent-info" if [ -f " ${HOME} /.gpg-agent-info" ] ; then . " ${HOME} /.gpg-agent-info" export GPG_AGENT_INFO export SSH_AUTH_SOCK export SSH_AGENT_PID fi
# # GnuPG # gpg-agent --daemon --enable-ssh-support --write-env-file " ${HOME} /.gpg-agent-info" if [ -f " ${HOME} /.gpg-agent-info" ] ; then . " ${HOME} /.gpg-agent-info" export GPG_AGENT_INFO export SSH_AUTH_SOCK export SSH_AGENT_PID fi
# # GnuPG # gpg-agent --daemon --enable-ssh-support --write-env-file " ${HOME} /.gpg-agent-info" if [ -f " ${HOME} /.gpg-agent-info" ] ; then . " ${HOME} /.gpg-agent-info" export GPG_AGENT_INFO export SSH_AUTH_SOCK export SSH_AGENT_PID fi
# # GnuPG # gpg-agent --daemon --enable-ssh-support --write-env-file " ${HOME} /.gpg-agent-info" if [ -f " ${HOME} /.gpg-agent-info" ] ; then . " ${HOME} /.gpg-agent-info" export GPG_AGENT_INFO export SSH_AUTH_SOCK export SSH_AGENT_PID fi
# # GnuPG # gpg-agent --daemon --enable-ssh-support --write-env-file " ${HOME} /.gpg-agent-info" if [ -f " ${HOME} /.gpg-agent-info" ] ; then . " ${HOME} /.gpg-agent-info" export GPG_AGENT_INFO export SSH_AUTH_SOCK export SSH_AGENT_PID fi
# # GnuPG # gpg-agent --daemon --enable-ssh-support --write-env-file " ${HOME} /.gpg-agent-info" if [ -f " ${HOME} /.gpg-agent-info" ] ; then . " ${HOME} /.gpg-agent-info" export GPG_AGENT_INFO export SSH_AUTH_SOCK export SSH_AGENT_PID fi
# # GnuPG # gpg-agent --daemon --enable-ssh-support --write-env-file " ${HOME} /.gpg-agent-info" if [ -f " ${HOME} /.gpg-agent-info" ] ; then . " ${HOME} /.gpg-agent-info" export GPG_AGENT_INFO export SSH_AUTH_SOCK export SSH_AGENT_PID fi
# # GnuPG # gpg-agent --daemon --enable-ssh-support --write-env-file " ${HOME} /.gpg-agent-info" if [ -f " ${HOME} /.gpg-agent-info" ] ; then . " ${HOME} /.gpg-agent-info" export GPG_AGENT_INFO export SSH_AUTH_SOCK export SSH_AGENT_PID fi
# # GnuPG # gpg-agent --daemon --enable-ssh-support --write-env-file " ${HOME} /.gpg-agent-info" if [ -f " ${HOME} /.gpg-agent-info" ] ; then . " ${HOME} /.gpg-agent-info" export GPG_AGENT_INFO export SSH_AUTH_SOCK export SSH_AGENT_PID fi
# # GnuPG # gpg-agent --daemon --enable-ssh-support --write-env-file " ${HOME} /.gpg-agent-info" if [ -f " ${HOME} /.gpg-agent-info" ] ; then . " ${HOME} /.gpg-agent-info" export GPG_AGENT_INFO export SSH_AUTH_SOCK export SSH_AGENT_PID fi
ここで、ローカルコンソールの起動時に、gpg-agentを起動し、しばらく入力したgpg-keyを「記憶」します。 出来上がり、1つの大きな問題を取り除きました。
次は? パッケージのさらなるアセンブリ。 同じお気に入りのqutIMの例を使用して説明します。収集するパッケージには、ほぼ毎日svnから更新されるものがありますが、一度ダウンロードされてから更新中に再構築されたものもありますqutIMカーネル。
はじめに、ディレクトリ構造とパッケージの命名がどのように構成されているかについて少しお話します。
アセンブリディレクトリのルートには、最初はアセンブリ用のスクリプトと、svnから更新されないパッケージのディレクトリ(qutim-plugin-floatiesなど)しかありません。 svnからのすべてのソースディレクトリは、アセンブリディレクトリのルートにポンプで送られ、収集されたパッケージが置かれます。 また、このディレクトリには、パッケージ用のdebianフォルダーを含む素晴らしいサブディレクトリコントロールがあります。 たとえば、qutim-protocol-jabberパッケージのdebianフォルダーを見つけるには、controls / qutim-protocol-jabber / debian /に移動します
さて、rep /ディレクトリには、さまざまなディストリビューションのリポジトリディレクトリがあります-rep / jaunty /、rep / unstable /など。
これから構築します。
それでは、アセンブリに関与するシェルスクリプトのヘッダーから始めましょう。
- #!/ bin / bash
- BUILDERRORS = "" #アセンブリエラーが書き込まれる変数
- MAJORVERSION = "0.2a" #各パッケージのメインバージョン
- DISTRIBUTIONS = "unstable testing stable jaunty" #リポジトリ名
次に、2つの小さな単純な関数を作成します。1つはすべてのディストリビューションとアーキテクチャの現在のディレクトリからパッケージを収集し、2つ目はすべてのpbuilderシェルのパッケージバージョンを更新します。
- build_it ( ) {
- OLDDIR = ` pwd`
- cd $ 1
- $ DISTRIBUTIONSの i する
- i386 amd64のj する
- DIST = $ i ARCH = $ j pdebuild ---basetgz / var / cache / pbuilder / $ i- $ j -base.tgz
- if [ [ $? ! = "0" ] ]
- それから
- BUILDERRORS = " $ BUILDERRORS
- $ 1- $ i- $ j "
- fi
- やった
- やった
- cd $ OLDDIR
- }
- update_it ( ) {
- echo "pbuilder環境を更新しています..."
- $ DISTRIBUTIONSの i する
- i386 amd64のj する
- DIST = $ i ARCH = $ j pbuilder --update --basetgz / var / cache / pbuilder / $ i- $ j -base.tgz
- if [ [ $? ! = "0" ] ]
- それから
- BUILDERRORS = " $ BUILDERRORS
- 更新中- $ i- $ j "
- fi
- やった
- やった
- }
簡単ですね。 最初の関数は入力としてディレクトリ名を受け取り、そこに行き、すべてのアーキテクチャ用のパッケージをアセンブルしようとします。 2番目のものは何も必要としません。すべてのpbuilderシェルを更新するだけです。 エラーが発生した場合、両方のチームは何もせず、エラーログにメッセージを追加するだけです。
次に、バッグを収集する汎用機能を作成する必要があります。 すべてのパッケージは、名前、バージョン、および入手先が互いに異なります。 これが使用されます。 まず、controlsフォルダーにあるdebian / changelogファイルに、バージョンではなく「--VERSION--」と書きました。 そして次に、私はここにそのような素晴らしい小さな機能を書きました:
- make_package ( ) {
- _REV = 1ドル
- _URL = 2ドル
- _NAME = 3ドル
- _DIR = 4ドル
- _BREV = 5ドル
- DIRNAME = ""
- PACKAGENAME = ""
- if [ [ $ _URL ! = "" ] ]
- それから
- rm -rf " $ _DIR "
- export $ _REV = ` LANG = C svn export $ _URL $ _DIR | awk '$ 1 == "エクスポート済み" && $ 2 == "リビジョン" {print $ 3}' | sed 's /.$//' '
- if [ [ $ {!_ REV} = "" ] ]
- それから
- echo "エラー! $ _NAMEリビジョンを取得できません!" && 出口 1
- fi
- echo " $ _NAMEリビジョンを受け取りました: $ {!_ REV} "
- 他に
- export $ _REV = "1"
- fi
- export REVISION = " $ {!_ REV} "
- DIRNAME = " $ {_ DIR} - $ {_ BREV} 。 $ {!_ REV} "
- PACKAGENAME = " $ {_ DIR} _ $ {_ BREV} 。 $ {!_ REV} "
- echo " $ _NAMEディレクトリ: $ DIRNAME "
- rm -rf " $ {PACKAGENAME} .orig.tar.gz" " $ DIRNAME "
- cp -r " $ _DIR " " $ DIRNAME "
- tar czf " $ {PACKAGENAME} .orig.tar.gz" " $ DIRNAME "
- echo " $ _NAMEソースアーカイブ: $ {PACKAGENAME} .orig.tar.gz"
- cp -r "controls / $ {_ DIR} / debian" " $ DIRNAME /"
- sed -i "s#-VERSION-# $ {_ BREV} 。 $ {!_ REV} -1#" " $ DIRNAME / debian / changelog"
- echo "Building $ _NAME ..."
- build_it " $ DIRNAME "
- }
この関数の機能を詳しく見てみましょう。 5つのパラメーターを順番に入力に渡します。
- ダウンロードしたリビジョンの番号を置く変数の名前。
- ソースのダウンロード元のアドレス。
- パッケージ名、ログメッセージでの呼び出し方法。
- debianパッケージ名。
- シニアバージョン番号
この関数はユニバーサルです-URLが渡されると、ソースがダウンロードされ、.orig.tar.gzアーカイブが自動的に作成されます。 転送されない場合、既存のディレクトリから作成されます。
これで、パッケージを1行で組み立てることができます。
- make_package "QREV" "qutim.org/svn/qutim" "qutIM" "qutim" " $ MAJORVERSION "
なぜ最初に渡されたQREVパラメーターが必要なのですか? パッケージをビルドするとき、qutIMに「0.2a」の「古い」バージョンを渡し、「0.2a.294-1」などのパッケージ自体のバージョンを取得します。 プロトコルパッケージを作成する場合、カーネルバージョンをそのバージョンに含める必要があります。
- make_package "MRIM_REV" "qutim.org/svn/mrim" "MRIM" "qutim-protocol-mrim" " $ MAJORVERSION 。 $ QREV "
出力では、バージョン「0.2a.294.357-1」を取得します。 便利じゃないですか? このようにして、取得したソースコードのバージョンを常に把握しています。
パッケージがローカルにあり、svnからダウンロードせずにパッケージを再構築する場合は、問題ありません。URLとして空のパラメーターを渡すだけです。
- make_package "FLOATIES_REV" "" "Floaties" "qutim-plugin-floaties" " $ MAJORVERSION 。 $ QREV "
リポジトリにあるパッケージを更新し、ビルドマシンからサーバーに配置して、ビルド時にエラーが発生したパッケージを通知するために、少しだけ残っていました。
- echo "パッケージをローカルリポジトリにコピーしています..."
- $ DISTRIBUTIONSの j する
- for i で ` ls / var / cache / pbuilder / $ j / result / * amd64.changes`; する
- reprepro -b rep / $ j / --ignore = wrongdistribution -C main include $ j $ i
- やった
- for i for ls / var / cache / pbuilder / $ j / result / * _i386.deb`; する
- reprepro -b rep / $ j / --ignore = wrongdistribution -C main includedeb $ j $ i
- やった
- やった
- echo "メインリポジトリを更新しています..."
- scp -r rep / * remotehost: / path / to / repo /
- エコー 「完了」。
- if [ " $ BUILDERRORS " ] ;
- それから
- echo "エラーがありました:"
- echo " $ BUILDERRORS "
- fi
コンソールにgpg-agentを「固定」しているため、repreproに--ask-passphraseキーが不要になったことに注意してください。
これらのすばらしいスクリプトはすべて、パッケージ用のdebian /ディレクトリとスクリプトの1行を準備するだけで新しいパッケージをリポジトリに追加できるようにするだけでなく、まったく注意を払う必要はありません。 ビルドするために、スクリプトを実行してビジネスに取り掛かります。 数時間後に戻って、gpgキーを1回入力し、リモートリポジトリサーバーからパスワードを1回入力します。 シンプルで便利。
Ps実験のファン向けの情報:便利なrepreproに加えて、少なくともDebianでリポジトリに使用される公式のdakユーティリティもあります。 PostgreSQLと正しくないpython言語を使用して動作するため、私は使用しませんでした(これについては全体論的ではなく、尋ねません)。 しかし、希望する人は試すことができます。
Pps自宅でスクリプトを使用する場合は、使用する完全なスクリプトをお勧めします。 健康について自分で編集: pastebin.com/f3289286a