GitLab CIの力でDebian パッケージのビルドを自動化する ~ GitLabでDebianパッケージの継続的デプロイを実現するには | about.gitlab.com

法律: IT 解説記事 Linux GitLab CI 業務効率化 ワークフロー フノス(訳者)

  この記事は Adfinis SyGroupが顧客向けに公表した記事の転載です。

  皆さま、我が社はここに、GitLab CIを『Debianパッケージの全自動ビルドに利用可能である』ことをここに宣言いたします。

 GitLab CIには、「Git tags」などのイベントに応じて、どのタスクを実行するかを管理する機能があります。
 

  ただ単にGitLabで開発を進めるだけでは、何の変哲もないDockerコンテナに、開発に使うパッケージを導入してコードを書いているのと大して変わりありません。

 しかし、GitLab CIと併用するだけで、様々な作業を自動化させる仕掛けを追加することがます。
 まるでDockerコンテナが、何かもっと高等なソフトウェアに生まれ変わったような感覚が得られるはずです。

  これから、「GoAccess」というログ解析ツールのパッケージングを通して、どのようにして自動パッケージング環境を構築したかをお見せします。
 当然、ここで直接使われているツールなどは最新版のものではありません。ですので、そこだけは常に、最新のものに手動で置き換えていただきますよう、お願いいたします。

 

  Debian packageの準備

  まずは、Debianパッケージのビルドを司るファイルを作成します。
 GoAccessの場合、以下の4つでした。

======================
debian/changelog # パッケージとソフトウェアに対する変更について
debian/compat # debhelper における互換性レベルについて
debian/control # 依存関係や、ソフトの説明など、パッケージ固有の情報について
debian/rules # debhelper における注意書き
======================
 パッケージングに関わる詳しい情報については、Debianの説明書を参照してください。


 

  Dockerコンテナの準備

  コンテナは今回、ホストシステムでパッケージをビルドするために使用されます。まずは、Dockerfileを作成するところから始めましょう。

======================
FROM debian:wheezy
ADD setup.sh /opt/
RUN /bin/bash /opt/setup.sh
======================
 Dockerfile(公式説明書)には、これから開発に使っていくイメージの説明を記述します。
 今回の場合は、「Debian Wheezy」です。

次に、「setup.sh」にあるスクリプトをコピーして、コンテナの「/opt/」ディレクトリに貼り付けます。
 「setup.sh」には、Debianで開発を進めていく上で、『これがないとビルドすらできない』くらい、最も基本的なソフトをインストールするよう設定します。
 

============================================
#!/bin/sh

# URLからインストールしたDebianファイルを、Dockerのどのディレクトリに置き換えるかを記述する
echo "deb http://pkg.adfinis-sygroup.ch/debian/ wheezy main non-free contrib" > /etc/apt/sources.list
echo "deb http://security.debian.org/ wheezy/updates main" >> /etc/apt/sources.list
echo "deb http://pkg.adfinis-sygroup.ch/debian/ wheezy-updates main contrib non-free" >> /etc/apt/sources.list

# 必要な操作
apt-get update
apt-get -y install git dh-make build-essential autoconf autotools-dev
============================================

  これらのファイルの準備が全て整ったら、Dockerコンテナをきちんとビルドできるはずです。


 

  GitLab CIの設定

  さて、上の工程で準備したDockerを、次はGitLab プロジェクトとして登録します。

======================
gitlab-ci-multi-runner register \
--non-interactive \
--url "$(GITLAB_URL)" \
--registration-token "$(CI_TOKEN)" \
--description "Generic debian wheezy package build runner" \
--executor "docker" \
--docker-image "generic-package-build-runner:v1"
======================
 注:」マークはバックスラッシュの誤変換です。

 「GITLAB_URL」と「CI_TOKEN」の詳しい内容は、GitLab プロジェクトの「Settings > Runners」のページでご確認いただけます。
 CIトークンについては、それぞれのプロジェクトで個別のものを使っています。
 

  次に、「.gitlab-ci.yml」ファイルの編集に入ります。レポジトリにそのファイルを作成して、以下のように設定します。
 ここではコンテナに実行させたいコマンドをほとんどすべて記述することになります。

============================================
# 複数のjobで使用するコマンドを、今回は「/etc/profile 」というファイルに記述した
before_script:
- source /etc/profile

# jobをステージ分けする時には、使用するステージを明示しなくてはならない
stages:
  - build

# 以下は"build"ステージで実行するスクリプト
run-build:
stage: build
  script:
   - apt-get install -y libncurses5-dev libglib2.0-dev libgeoip-dev libtokyocabinet-dev zlib1g-dev libncursesw5-dev libbz2-dev
   - autoreconf -fvi
   - cp COPYING debian/copyright
  
- dpkg-buildpackage -us -uc
   - mkdir build
  
- mv ../goaccess*.deb build/

# このステージは新たにtagが追加された時にしか作動しない
  only:
   - tags

# できたアプリをGitLabプロジェクトのどこに置くか
  artifacts:
   paths:
    - build/*
============================================
 このファイルで一番の肝となるものが、「run-build」jobです。
 このパートでビルド工程のときに、どのようなアクションをとるかを決定しています。

  ここで、「run-build」のスクリプトをいくつか解説しましょう。
 アプリを開発する上で、使い勝手が良いDockerコンテナを作るためのヒントです。参考にしてください。

 開発に必要なツールは、「script」の一番最初の行でインストールするよう設定されています。

  それから、「autoreconf」というコマンドは、ビルドプロセスの準備をするために必要です。(2行目)
 アプリを自動でビルドしたいものなら、「makedir」コマンドなど、何らかのファイル作成系コマンドが欠かせません。(5行目)

 パッケージの著作権条項を記した文章は、「debian/」ファイルにコピーしました。(3行目)

  そして、今回最大の目当てであるコマンドが、「dpkg-buildpackage」(4行目)です。これでコードをコンパイルし、Debianパッケージに変換します。

 こうして生成されたパッケージは、buildディレクトリに送信され、GitLabにアップロードされることになるのです。


 

  使い方

  今回の設定では、Gitにタグを作成すると、瞬時に新しいリリースが発表される仕組みになっています。

 GitLabの「tag」でビルドを開始するという機能は、どのバージョンを発表するかを、きちんと人の手で選択できるところがとても便利でした。

  出来上がったパッケージは、GitLabのwebインターフェイスからダウンロードできます。
  (写真)GitLabのダウンロード画面

 

  しめくくり

  これで理論上は、開発者が指定したパッケージだけを自動的に公開できる環境が整えられたはずです。

 わが社ではさらに、 GitLab Webhookという自動装置に少し手を加えて、パッケージを公表するサーバーやレポジトリまでもを指定しました。
 これにて、ビルドパッケージの全自動配布体制が整えられました。

 これらを応用すれば、ミラーを設置するなどの操作もできるようになります。

 皆さんも、アプリケーション開発をより自由で効率のよいものにしましょう。
 

  元記事: 『 Automated Debian Package Build with GitLab CI 』(26 August 2016 / Adfinis SyGroup) 

 

 2017-11-02 15:07:04 / Hnoss
原文サイトを表示
[ 原文 ] https://about.gitlab.com/2016/10/12/automated-debian-package-build-with-gitlab-ci/
Creative Commons License この作品は、クリエイティブ・コモンズ・ライセンスの下でライセンスされています。
クリエイティブ・コモンズ・ライセンス