# -*- rd -*-

= Cutterのリリース方法

== はじめに

このセクションではCutterをリリースするときに必要な手順について
説明します。

== osdn.netアカウントの設定

Cutterは((<URL:https://osdn.net/>))にて
((<プロジェクトのウェブサイト|URL:https://osdn.net/projects/cutter/>))や
((<プラットフォームごとのリポジトリなど|URL:https://osdn.net/projects/cutter/storage/>))
をホスティングしています。

そのため、リリース作業ではosdn.net上のプロジェクト領域へ
アクセスできる必要があります。

Cutterプロジェクトのメンバでない場合にはプロジェクトの
管理者にosdn.netのアカウント名を以下のProject Membershipページ
から追加してもらう必要があります。

((<メンバーリスト - Cutter - OSDN|URL:https://osdn.net/projects/cutter/memberlist?show_detail=1>))


== 環境変数の設定

Cutterのリリースではすでに述べたようにosdn.netへの
パッケージやドキュメントファイルのアップロードを行います。

もし、リリース作業を行う端末のアカウントと
osdn.netのアカウントが異なる場合には、
以下のようにしてosdn.netのアカウントを使うように
環境変数(({OSDN_USER}))の設定を行います。

    % export OSDN_USER=(ここにosdn.netのアカウントを指定)

永続的に有効にする場合にはシェルの設定ファイルに上記記述を追加します。

また、GitHubへソースアーカイブのリリースを行うために、
アクセストークンを保存したファイルへのパスを環境変数(({{ACCESS_TOKEN_FILE}))で指定します。

    % export ACCESS_TOKEN_FILE=(ここにアクセストークンを保存したファイルのパスを指定)

== ビルド環境の準備

以下にCutterのリリース作業を行うために事前にインストール しておくべきパッケージを示します。

なお、ビルド環境としては Debian GNU/Linux (sid)を前提として説明しています。
その他の環境ではパッケージ名等適宜読み替えて下さい。:

  % sudo apt-get install -V createrepo rpm ruby-full gnupg2 gtk-doc-tools gnome-doc-utils

また、rubyでいくつかパッケージが必要なので以下のコマンドによりインストールします。:

  % sudo gem install rdtool fast_gettext mechanize

なお、特に明記していない限り本リリース手順でのコマンドラインの 操作はzshを前提としています。


== パッケージ署名用秘密鍵のインポート

リリース作業ではパッケージに対する署名を行います。
その際、パッケージ署名用の鍵が必要です。

Cutterプロジェクトでは署名用の鍵をリリース担当者の公開鍵で暗号化して
リポジトリのpackages/ディレクトリ以下へと登録しています。

リリース担当者はリポジトリに登録された秘密鍵を復号した後に
鍵のインポートを以下のコマンドにて行います。:

  % cd packages
  % gpg --decrypt release-key-secret.asc.gpg.(担当者) > (復号した鍵ファイル)
  % gpg --import  (復号した鍵ファイル)

鍵のインポートが正常終了すると (({gpg --list-keys})) でCutterの署名用の鍵を
確認することができます。:

  pub   1024D/F07C74AC 2012-08-07
  uid                  Cutter Key (Cutter Official Signing Key) <cutter-users-en@lists.sourceforge.net>

鍵をインポートしただけでは使用することができないため、インポートした鍵に対してtrust,signを行う必要があります。

以下のコマンドを実行して署名を行います。(途中の選択肢は省略):

  % gpg --edit-key cutter-users-en@lists.sourceforge.net
  gpg> trust
  gpg> sign
  gpg> save
  gpg> quit

鍵のインポート作業は初めてリリースを行うときや、
鍵が更新された場合に行います。

== リリース作業用ディレクトリの作成

Cutterのリリース作業ではリリース専用の環境下(コンパイルフラグ)で
ビルドする必要があります。

リリース時と開発時でディレクトリを分けずに作業することもできますが、
誤ったコンパイルフラグでリリースしてしまう危険があります。

そのため、以降の説明では(({$HOME/work/cutter}))以下のディレクトリに
リリース用の作業ディレクトリ(cutter.clean)を作成したものとします。

  % mkdir -p $HOME/work/cutter

これ以降(({CUTTER_CLEAN_DIR=$HOME/work/cutter/cutter.clean}))として説明します。

リリース用のクリーンな状態でソースコードを(({$CUTTER_CLEAN_DIR}))ディレクトリに
取得するために以下のコマンドを実行します。:

  % git clone git@github.com:clear-code/cutter.git cutter.clean

この作業はリリース作業ごとに行います。

== autogen.shによるconfigureスクリプト生成

ソースコードをcloneした時点ではconfigureスクリプトが含まれておらず
そのままmakeコマンドにてビルドすることができません。

Cutterの(({$CUTTER_CLEAN_DIR}))ディレクトリでautogen.shを以下のように実行します。:

  % sh autogen.sh

このコマンドの実行により、configureスクリプトが生成されます。

== configureによるMakefile生成

Makefileを生成するためにconfigureスクリプトを実行します。

リリース用にビルドするためには以下のオプションを指定してconfigureを実行します。:

  % ./configure --enable-gtk-doc --with-launchpad-uploader-pgp-key=(Launchpadに登録してある公開鍵の鍵ID)

== リリース日の更新

configureを実行し、Makefileを生成した後に
リリース日やバージョンの更新を行うためにmake update-latest-releaseを実行します。

(({make update-latest-release}))コマンドでは(({OLD_RELEASE_DATE}))に前回のリリースの日付を、
(({NEW_RELEASE_DATE}))に次回リリー スの日付を指定します。

1.2.1のリリースを行った際は以下のコマンドを実行しました。::

  % make update-latest-release OLD_RELEASE=1.2.0 OLD_RELEASE_DATE=2011-12-31 NEW_RELEASE_DATE=2012-08-15

これにより、Webサイトのトップページのソース (index.html,index.html.ja)や
パッケージのspecファイルなどの関連ファイルが更新されます。

== 変更点まとめ

前回リリース時からの変更点をNEWSおよびNEWS.jaへとまとめます。
ここでまとめた内容についてはリリースアナウンスにも使用します。

前回リリースからの変更履歴を参照するには以下のコマンドを実行します。：

  % git log -p --reverse $(git tag | tail -1)..

ログを^commitで検索しながら、以下の基準を目安として変更点を追記してい きます。

含めるもの

* ユーザへ影響するような変更
* 互換性がなくなるような変更

含めないもの

* 内部的な変更(変数名の変更やらリファクタリング)

== メッセージカタログの更新

ドキュメントの最新版と各国語版の内容を同期するために、
poファイルの更新を以下のコマンドにて実行します。:

  % make update-po

make update-poを実行すると、各種poファイルが更新されます。

その後に更新した各種.poファイルを翻訳します。

翻訳結果をHTMLで確認するために、以下のコマンドを実行します。:

  % make -C doc

コマンドの実行により、HTMLは以下の階層に生成されます。

* (({$CUTTER_CLEAN_DIR/doc/reference/html})) 英語リファレンス
* (({$CUTTER_CLEAN_DIR/doc/reference/ja/html})) 日本語リファレンス

確認が完了したら、翻訳済みpoファイルをコミットします。

== リリースタグの設定

リリース対象のファイルの更新が終了したら以下のコマンドでタグを打ちます。:


  % make tag

== リリース用アーカイブファイルの作成

リリース用のソースアーカイブファイルを作成するために
以下のコマンドを(({$CUTTER_CLEAN_DIR}))で実行します。:

  % make dist
  % make dist-zip

これにより(({$CUTTER_CLEAN_DIR/cutter-(バージョン).tar.gz}))と
(({$CUTTER_CLEAN_DIR/cutter-(バージョン).zip}))とが作成されます。

== パッケージのビルド

リリース用のアーカイブファイルができたので、 パッケージ化する作業を行います。

パッケージ化作業は以下の2種類を対象に行います。

* Debian系(.deb)
* Red Hat系(.rpm)

=== Debian系パッケージのビルド

現在サポートされているのは以下の通りです。

* squeeze i386/amd64
* wheezy i386/amd64
* precise i386/amd64
* trusty i386/amd64
* vivid i386/amd64

なお以下のコマンドの実行は(({$CUTTER_CLEAN_DIR/packages/apt}))以下で
行っているものとします。

UbuntuはLaunchpadを利用しているので後述します。

==== ダウンロード

既存のDebian系リポジトリと同期するために以下のコマンドを実行します。:

  % make download
     
==== パッケージのビルド

パッケージをビルドするために以下のコマンドを実行します。:

  % make build PALALLEL=yes

make build PALALLEL=yesコマンドを実行すると、ディストリビューションの
リリースとアーキテクチャの組み合わせでビルドを平行して行うことができます。

==== パッケージへの署名

生成したパッケージへの署名を行うには以下のコマンドを実行します。:

  % make sign-packages

==== リポジトリの更新

リリース対象のファイルをリポジトリに反映するには以下のコマンドを実行します。:

  % make update-repository

==== リポジトリへの署名

リポジトリにGnuPGで署名を行うために以下のコマンドを実行します。:

  % make sign-repository

=== Ubuntuのパッケージのビルド

Ubuntu向けのパッケージのビルドはLaunchpadのPPAを利用しています。

なお以下のコマンドの実行は(({$CUTTER_CLEAN_DIR/packages/ubuntu}))以下で
行っているものとします。

  % make upload

すると、ソースパッケージをPPAへとアップロードします。
あとはパッケージのビルドが終了するのを待ちます。

  https://launchpad.net/~cutter-testing-framework/+archive/ubuntu/ppa

=== Red Hat系パッケージのビルド

現在サポートされているのは以下の通りです。

* centos-5 i386/x86_64
* centos-6 i386/x86_64
* centos-7 i386/x86_64


==== ダウンロード

既存のRed Hat系リポジトリと同期するために以下のコマンドを実行します。:

  % make download

==== パッケージのビルド

パッケージを作成するには以下のコマンドを実行します。:

  % make build PALALLEL=yes

make build PALALLEL=yesコマンドを実行すると、ディストリビューションの
リリースとアーキテクチャの組み合わせでビルドを平行して行うことができます。

==== パッケージへの署名

リリース対象のRPMに署名を行うには以下のコマンドを実行します。:

  % make sign-packages

==== リポジトリの更新

リリース対象のファイルをリポジトリに反映するには以下のコマンドを実行します。:

  % make update-repository

== パッケージのインストール確認

ビルドしたパッケージに対しリリース前の動作確認を行います。

Debian系もしくはRed Hat系の場合には本番環境へとアップロードする前に
ローカルのaptないしyumのリポジトリを参照して正常に更新できることを確認します。

そのためには、リポジトリをwebサーバ経由で参照できるようにすることが
必要です。

また、osdn.netとディレクトリ階層を揃える必要があります。

osdn.netとディレクトリ階層を合わせるために
(({$CUTTER_CLEAN_DIR/packages}))ディレクトリで以下のコマンドを実行します。

  % ./check-utility.sh --setup-temp-repository

コマンドを実行するとtemp_repositories/projects/cutter/storageディレクトリを作成し、
apt/repositoriesやyum/repositoriesのディストリビューションの
ディレクトリへとシンボリックリンクを張ります。

  % ls -la temp_repositories/projects/cutter/storage
  total 24
  drwxrwxr-x 2 khayashi khayashi 4096 Aug  9 17:21 .
  drwxrwxr-x 3 khayashi khayashi 4096 Aug  9 17:14 ..
  lrwxrwxrwx 1 khayashi khayashi   72 Aug  9 17:21 centos -> /home/khayashi/work/cutter/cutter.clean/packages/yum/repositories/centos
  lrwxrwxrwx 1 khayashi khayashi   72 Aug  9 17:21 debian -> /home/khayashi/work/cutter/cutter.clean/packages/apt/repositories/debian
  lrwxrwxrwx 1 khayashi khayashi   72 Aug  9 17:21 fedora -> /home/khayashi/work/cutter/cutter.clean/packages/yum/repositories/fedora
  lrwxrwxrwx 1 khayashi khayashi   72 Aug  9 17:21 ubuntu -> /home/khayashi/work/cutter/cutter.clean/packages/apt/repositories/ubuntu

次にrubyを利用してリポジトリをwebサーバ経由で参照できるようにします。:

  % sudo ruby1.9.1 -run -e httpd -- temp_repositories

これでchroot環境においてhostsファイルを書き換えて
osdn.netがローカルホストを参照するようにすれば、
ローカルに構築したリポジトリの確認を行えます。

== リリースアナウンスの作成


リリースの際にはリリースアナウンスをメーリングリストへと流します。

NEWS,NEWS.jaにまとめておいた変更点を元にリリースアナウンスを作成します。

リリースアナウンスには以下を含めます。

* インストール方法へのリンク
* リリースのトピック紹介
* リリース変更点へのリンク
* リリース変更点(NEWS,NEWS.jaの内容)

リリースのトピック紹介では、これからCutterを使う人へアピールする点や
既存のバージョンを利用している人がアップグレードする際に必要な情報を提供します。

非互換な変更が含まれるのであれば、回避方法等の案内を載せることも重要です。

== アップロード作業

パッケージのインストール確認が完了したら、
アップロード作業を行います。

=== ドキュメントのアップロード

(({$CUTTER_CLEAN_DIR}))ディレクトリで以下のコマンドを実行します。:

  % make upload

=== パッケージのアップロード

(({$CUTTER_CLEAN_DIR/packages/apt}))ディレクトリで以下のコマンドを実行します。:

  % make upload

(({$CUTTER_CLEAN_DIR/packages/yum}))ディレクトリで以下のコマンドを実行します。:

  % make upload

=== ソースパッケージのアップロード

(({$CUTTER_CLEAN_DIR}))ディレクトリで以下のコマンドを実行します。:

  % make release-official
  % make release-debian

osdn.netにtar.gzをアップロードしたあとに、最新版へのリンクを更新するには、
次のようにする。例: 1.2.3の場合

https://osdn.net/projects/cutter/releases/ にアクセスし、「優先ダウンロードファイルの編集」ボタンをクリックすると、
プラットフォームごとに優先してダウンロードさせるファイルを設定することができる。

=== GitHubへのアップロード

(({$CUTTER_CLEAN_DIR}))ディレクトリで以下のコマンドを実行します。:

  % make release-to-github

すると https://github.com/clear-code/cutter/releases 以下に新しいリリースとしてアップロードできます。

== リリースアナウンス

Cutterにはユーザー向けに提供されているメーリングリストが2つあります。

あらかじめ用意しておいた、リリースアナウンス原稿を
[ANN] Cutter (バージョン)という件名で投稿します。

* cutter-users-en@lists.osdn.me 英語
* cutter-users-ja@lists.osdn.me 日本語

== リリース後にやること

リリースアナウンスまで終わるとリリース作業はひとまず終了し、
次期バージョンの開発が始まります。

そこで、次期リリースバージョンを更新します。

configure.acの以下の箇所を必要に応じて更新します。:

  m4_define([cutter_version_major], [1])
  m4_define([cutter_version_minor], [2])
  m4_define([cutter_version_micro], [2])
  m4_define([cutter_version],
            [cutter_version_major.cutter_version_minor.cutter_version_micro])

