メンテナーになる-リポジトリを更新する

この記事は、根本的な問題を解決することを目的としたものではありませんが、最小限の労力で、公開リポジトリのパッケージのアセンブリを自動化するのに役立ちます。

お気に入りのユーザー用に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ファイルを編集し、最後に次の行を追加します。

  1. # # 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



  2. # # 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



  3. # # 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



  4. # # 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



  5. # # 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



  6. # # 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



  7. # # 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



  8. # # 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



  9. # # 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



  10. # # 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 /など。

これから構築します。



それでは、アセンブリに関与するシェルスクリプトのヘッダーから始めましょう。

  1. #!/ bin / bash
  2. BUILDERRORS = "" #アセンブリエラーが書き込まれる変数
  3. MAJORVERSION = "0.2a" #各パッケージのメインバージョン
  4. DISTRIBUTIONS = "unstable testing stable jaunty" #リポジトリ名


次に、2つの小さな単純な関数を作成します。1つはすべてのディストリビューションとアーキテクチャの現在のディレクトリからパッケージを収集し、2つ目はすべてのpbuilderシェルのパッケージバージョンを更新します。

  1. build_it {
  2. OLDDIR = ` pwd`
  3. cd $ 1
  4. $ DISTRIBUTIONSの i する
  5. i386 amd64のj する
  6. DIST = $ i ARCH = $ j pdebuild ---basetgz / var / cache / pbuilder / $ i- $ j -base.tgz
  7. if [ [ $? = "0" ] ]
  8. それから
  9. BUILDERRORS = " $ BUILDERRORS
  10. $ 1- $ i- $ j "
  11. fi
  12. やった
  13. やった
  14. cd $ OLDDIR
  15. }
  16. update_it {
  17. echo "pbuilder環境を更新しています..."
  18. $ DISTRIBUTIONSの i する
  19. i386 amd64のj する
  20. DIST = $ i ARCH = $ j pbuilder --update --basetgz / var / cache / pbuilder / $ i- $ j -base.tgz
  21. if [ [ $? = "0" ] ]
  22. それから
  23. BUILDERRORS = " $ BUILDERRORS
  24. 更新中- $ i- $ j "
  25. fi
  26. やった
  27. やった
  28. }




簡単ですね。 最初の関数は入力としてディレクトリ名を受け取り、そこに行き、すべてのアーキテクチャ用のパッケージをアセンブルしようとします。 2番目のものは何も必要としません。すべてのpbuilderシェルを更新するだけです。 エラーが発生した場合、両方のチームは何もせず、エラーログにメッセージを追加するだけです。

次に、バッグを収集する汎用機能を作成する必要があります。 すべてのパッケージは、名前、バージョン、および入手先が互いに異なります。 これが使用されます。 まず、controlsフォルダーにあるdebian / changelogファイルに、バージョンではなく「--VERSION--」と書きました。 そして次に、私はここにそのような素晴らしい小さな機能を書きました:

  1. make_package {
  2. _REV = 1ドル
  3. _URL = 2ドル
  4. _NAME = 3ドル
  5. _DIR = 4ドル
  6. _BREV = 5ドル
  7. DIRNAME = ""
  8. PACKAGENAME = ""
  9. if [ [ $ _URL = "" ] ]
  10. それから
  11. rm -rf " $ _DIR "
  12. export $ _REV = ` LANG = C svn export $ _URL $ _DIR | awk '$ 1 == "エクスポート済み" && $ 2 == "リビジョン" {print $ 3}' | sed 's /.$//' '
  13. if [ [ $ {!_ REV} = "" ] ]
  14. それから
  15. echo "エラー! $ _NAMEリビジョンを取得できません!" && 出口 1
  16. fi
  17. echo " $ _NAMEリビジョンを受け取りました: $ {!_ REV} "
  18. 他に
  19. export $ _REV = "1"
  20. fi
  21. export REVISION = " $ {!_ REV} "
  22. DIRNAME = " $ {_ DIR} - $ {_ BREV}$ {!_ REV} "
  23. PACKAGENAME = " $ {_ DIR} _ $ {_ BREV}$ {!_ REV} "
  24. echo " $ _NAMEディレクトリ: $ DIRNAME "
  25. rm -rf " $ {PACKAGENAME} .orig.tar.gz" " $ DIRNAME "
  26. cp -r " $ _DIR " " $ DIRNAME "
  27. tar czf " $ {PACKAGENAME} .orig.tar.gz" " $ DIRNAME "
  28. echo " $ _NAMEソースアーカイブ: $ {PACKAGENAME} .orig.tar.gz"
  29. cp -r "controls / $ {_ DIR} / debian" " $ DIRNAME /"
  30. sed -i "s#-VERSION-# $ {_ BREV}$ {!_ REV} -1#" " $ DIRNAME / debian / changelog"
  31. echo "Building $ _NAME ..."
  32. build_it " $ DIRNAME "
  33. }




この関数の機能を詳しく見てみましょう。 5つのパラメーターを順番に入力に渡します。



この関数はユニバーサルです-URLが渡されると、ソースがダウンロードされ、.orig.tar.gzアーカイブが自動的に作成されます。 転送されない場合、既存のディレクトリから作成されます。

これで、パッケージを1行で組み立てることができます。





  1. make_package "QREV" "qutim.org/svn/qutim" "qutIM" "qutim" " $ MAJORVERSION "


なぜ最初に渡されたQREVパラメーターが必要なのですか? パッケージをビルドするとき、qutIMに「0.2a」の「古い」バージョンを渡し、「0.2a.294-1」などのパッケージ自体のバージョンを取得します。 プロトコルパッケージを作成する場合、カーネルバージョンをそのバージョンに含める必要があります。





  1. make_package "MRIM_REV" "qutim.org/svn/mrim" "MRIM" "qutim-protocol-mrim" " $ MAJORVERSION$ QREV "


出力では、バージョン「0.2a.294.357-1」を取得します。 便利じゃないですか? このようにして、取得したソースコードのバージョンを常に把握しています。

パッケージがローカルにあり、svnからダウンロードせずにパッケージを再構築する場合は、問題ありません。URLとして空のパラメーターを渡すだけです。

  1. make_package "FLOATIES_REV" "" "Floaties" "qutim-plugin-floaties" " $ MAJORVERSION$ QREV "


リポジトリにあるパッケージを更新し、ビルドマシンからサーバーに配置して、ビルド時にエラーが発生したパッケージを通知するために、少しだけ残っていました。

  1. echo "パッケージをローカルリポジトリにコピーしています..."
  2. $ DISTRIBUTIONSの j する
  3. for i ` ls / var / cache / pbuilder / $ j / result / * amd64.changes`; する
  4. reprepro -b rep / $ j / --ignore = wrongdistribution -C main include $ j $ i
  5. やった
  6. for i for ls / var / cache / pbuilder / $ j / result / * _i386.deb`; する
  7. reprepro -b rep / $ j / --ignore = wrongdistribution -C main includedeb $ j $ i
  8. やった
  9. やった
  10. echo "メインリポジトリを更新しています..."
  11. scp -r rep / * remotehost: / path / to / repo /
  12. エコー 「完了」。
  13. if [ " $ BUILDERRORS " ] ;
  14. それから
  15. echo "エラーがありました:"
  16. echo " $ BUILDERRORS "
  17. fi


コンソールにgpg-agentを「固定」しているため、repreproに--ask-passphraseキーが不要になったことに注意してください。



これらのすばらしいスクリプトはすべて、パッケージ用のdebian /ディレクトリとスクリプトの1行を準備するだけで新しいパッケージをリポジトリに追加できるようにするだけでなく、まったく注意を払う必要はありません。 ビルドするために、スクリプトを実行してビジネスに取り掛かります。 数時間後に戻って、gpgキーを1回入力し、リモートリポジトリサーバーからパスワードを1回入力します。 シンプルで便利。



Ps実験のファン向けの情報:便利なrepreproに加えて、少なくともDebianでリポジトリに使用される公式のdakユーティリティもあります。 PostgreSQLと正しくないpython言語を使用して動作するため、私は使用しませんでした(これについては全体論的ではなく、尋ねません)。 しかし、希望する人は試すことができます。



Pps自宅でスクリプトを使用する場合は、使用する完全なスクリプトをお勧めします。 健康について自分で編集: pastebin.com/f3289286a



All Articles