wakameci

2015年01月26日

このエントリーをはてなブックマークに追加

UI経由ではバージョン指定できない(2015/01/26現在)

Jenkinsは、恐らく手頃なCIツールだ。個人的には2年半近く使っている。他のツールと同様に、ある程度使い続けていると、どこか使い辛さを感じ始める。Jenkinsにおける使い辛さの1つは、狙ったバージョンのJenkinsプラグインをインストール出来ない事。通常のJenkinsプラグインインストール手順は、こうだ。

  1. プラグインマネージャhttp://jenkins/pluginManager/からプラグインを検索
  2. 欲しいプラグインを選択
  3. プラグインをダウンロード・インストール
  4. Jenkinsを再起動

この手順には、プラグインのバージョンが登場しない。暗黙のルールとして、最新バージョン(latest)が指定され、プラグインがインストールされて行く。しかも、管理者の意図とは関係のない所で、だ。これは問題を含んでいる。とある日に構築したシステム構築を再現する様な場合は、要件を満たせない。そこをどうにかしたくて、手順を確立させた。こんな手順、本当は無くなって欲しい。

プラグインインストールの裏側を理解する

Plugins - Jenkins - Jenkins Wiki より、

By hand Download Site

Save the downloaded *.hpi/*.jpi file into the $JENKINS_HOME/plugins directory. You will then need to restart Jenkins (many containers let you do this without restarting the container)

http://updates.jenkins-ci.org/download/plugins/からJenkinsプラグインをダウンロード出来る事が分かる。プラグインリポジトリを注意深く調査していると、過去のバージョンもダウンロード出来る事が分かる。wikiの内容と調査結果をまとめると、こうなる。

最新版:

  • http://updates.jenkins-ci.org/latest/${name}.hpi

特定バージョン:

  • http://updates.jenkins-ci.org/download/plugins/${name}/${version}/${name}.hpi

保存先:

  • ${JENKINS_HOME}/plugins/${name}.hpi

反映方法:

  • Jenkins再起動

サービス起動後、プラグインマネージャを確認すると、狙ったバージョンのプラグインがインストールされている事を確認できるはずだ。少なくとも、自分が検証した限りでは、期待通りの結果となっている。

おまけ:プラグイン名とバージョンのペアを管理する

パッケージを1つ1つインストールするのは、実に面倒臭い。プラグインによっては最新版が良い場合もある。それを一括管理する為、自分は下記のようなスクリプトによりシステム構築している。

jenkins-plugin.sh:

#!/bin/bash
#
# requires:
#  bash
#
set -e
set -o pipefail

JENKINS_HOME=${JENKINS_HOME:-/var/lib/jenkins}
base_url=http://updates.jenkins-ci.org

function plugin_list() {
  cat <<_EOS_ | egrep -v '^$|^#'
PrioritySorter 1.3
config-autorefresh-plugin
configurationslicing
config-file-provider
cron_column
downstream-buildview
git        1.4.0
git-client 1.1.1
hipchat 0.1.5
greenballs
managed-scripts 1.1
nested-view
next-executions
parameterized-trigger 2.18
rebuild 1.20
timestamper 1.5.6
token-macro
urltrigger
view-job-filters
_EOS_
}

while read line; do
  set ${line}
  name=${1} version=${2}
  if [[ -z "${version}" ]]; then
    version=latest
  else
    version=download/plugins/${name}/${version}
  fi
  curl -fSkL ${base_url}/${version}/${name}.hpi -o ${JENKINS_HOME}/plugins/${name}.hpi
done < <(plugin_list)

chown -R jenkins:jenkins ${JENKINS_HOME}/plugins

ヒアドキュメント部分が、プラグイン名とバージョンを指定のペアを管理。

  • プラグイン名のみの場合は、最新版(latest)をインストール
  • プラグイン名とバージョン指定している場合は、そのバージョンをインストール

上記ヒアドキュメント部分を説明すると、こうなる。

  • バージョン固定:
    • PrioritySorter 1.3
    • git 1.4.0
    • git-client 1.1.1
    • hipchat 0.1.5
    • managed-scripts 1.1
    • parameterized-trigger 2.18
    • rebuild 1.20
    • timestamper 1.5.6
  • 最新版:
    • config-autorefresh-plugin
    • configurationslicing
    • config-file-provider
    • cron_column
    • downstream-buildview
    • greenballs
    • nested-view
    • next-executions
    • token-macro
    • urltrigger
    • view-job-filters

なお、これは自分が今までに使って来た厳選プラグインでもある。

あとがき

使い辛い所を分かった上で使い続けるJenkinsさんとの生活。もう少し続きそう。




編集
@hansode at 10:30|PermalinkComments(0)TrackBack(0)

2015年01月24日

このエントリーをはてなブックマークに追加

新規構築は問題が無い

気にすべきは、マイグレーションが実行されるので、ビルドログが多い環境ほど注意が必要となる事。いつものアップグレード時間よりも長く待たされる事を、承知した上でメンテナンスを行えたなら 、言う事は無い。なお、手元のJenkinsクラスタでは、1.596から1.597へのアップグレードは問題なくマイグレーションが完了した。

ハイライトを追いかける。

Changelog | Jenkins CI より

What's new in 1.597 (2015/01/19)

  • JENKINS_HOME layout change: builds are now keyed by build numbers and not timestamps. See Wiki for details and downgrade. (issue 24380)

JENKINS_HOMEのレイアウトを変更したとの事。

レイアウト変更により、buildIDとbuild時刻の関係が逆転

[#JENKINS-24380] Use build numbers as IDs - Jenkins JIRA より

Before:

% ls -la
total 16
drwxrwxr-x 4 kohsuke kohsuke 4096 Sep 15 17:51 .
drwxrwxr-x 4 kohsuke kohsuke 4096 Sep 15 17:51 ..
lrwxrwxrwx 1 kohsuke kohsuke   19 Apr 18 10:42 1 -> 2014-04-18_10-42-35
lrwxrwxrwx 1 kohsuke kohsuke   19 Sep 15 17:51 2 -> 2014-09-15_17-51-46
drwxrwxr-x 2 kohsuke kohsuke 4096 Apr 18 10:42 2014-04-18_10-42-35
drwxrwxr-x 2 kohsuke kohsuke 4096 Sep 15 17:51 2014-09-15_17-51-46
lrwxrwxrwx 1 kohsuke kohsuke    2 Apr 18 10:39 lastFailedBuild -> -1
lrwxrwxrwx 1 kohsuke kohsuke    1 Sep 15 17:51 lastStableBuild -> 2
lrwxrwxrwx 1 kohsuke kohsuke    1 Sep 15 17:51 lastSuccessfulBuild -> 2
lrwxrwxrwx 1 kohsuke kohsuke    2 Apr 18 10:39 lastUnstableBuild -> -1
lrwxrwxrwx 1 kohsuke kohsuke    2 Apr 18 10:39 lastUnsuccessfulBuild -> -1

After:

% ls -la
total 16
drwxrwxr-x 4 kohsuke kohsuke 4096 Sep 15 17:52 .
drwxrwxr-x 4 kohsuke kohsuke 4096 Sep 15 17:51 ..
drwxrwxr-x 2 kohsuke kohsuke 4096 Apr 18 10:42 1
drwxrwxr-x 2 kohsuke kohsuke 4096 Sep 15 17:51 2
lrwxrwxrwx 1 kohsuke kohsuke    1 Sep 15 17:52 2014-04-18_10-42-35 -> 1
lrwxrwxrwx 1 kohsuke kohsuke    1 Sep 15 17:52 2014-09-15_17-51-46 -> 2
lrwxrwxrwx 1 kohsuke kohsuke    2 Apr 18 10:39 lastFailedBuild -> -1
lrwxrwxrwx 1 kohsuke kohsuke    1 Sep 15 17:51 lastStableBuild -> 2
lrwxrwxrwx 1 kohsuke kohsuke    1 Sep 15 17:51 lastSuccessfulBuild -> 2
lrwxrwxrwx 1 kohsuke kohsuke    2 Apr 18 10:39 lastUnstableBuild -> -1
lrwxrwxrwx 1 kohsuke kohsuke    2 Apr 18 10:39 lastUnsuccessfulBuild -> -1
  • 以前は、日付が実態で、build番号がsymlink
  • 今後は、日付がsymlinkで、build番号が実態

この仕様変更によるマイグレーション処理が、システムアップグレード時(プロセス起動時)に発生する。今までのbuildログが多く残されていれば多く残されている程、マイグレーションに時間がかかる。

念の為、アップグレード前にJENKINS_HOMEをバックアップしておいた方が良いかも知れない。それと、事前にbuildログをある程度掃除しておいた方が良いかも知れない。

migration進捗は/var/log/jenkins/jenkins.logで確認可能

migration進捗が気になる場合は/var/log/jenkins/jenkins.logtail -fしておくと良い。過去のbuild番号の数だけdoMigrateが記録されて行く。

Jan 24, 2015 4:08:11 PM jenkins.model.RunIdMigrator doMigrate
WARNING: found no build.xml in 2014-03-06_16-55-39
Jan 24, 2015 4:08:11 PM jenkins.model.RunIdMigrator doMigrate
WARNING: found no build.xml in 2014-01-10_16-56-22
Jan 24, 2015 4:08:11 PM jenkins.model.RunIdMigrator doMigrate
WARNING: found no build.xml in 2013-10-23_16-56-23
Jan 24, 2015 4:08:11 PM jenkins.model.RunIdMigrator doMigrate
WARNING: found no build.xml in 2014-06-16_16-56-47
Jan 24, 2015 4:08:11 PM jenkins.model.RunIdMigrator doMigrate
WARNING: found no build.xml in 2013-12-22_16-56-22

おまけ:buildログ定期削除スクリプト

参考までに、自分が使用しているbuildログ定期削除スクリプト。これを日次実行させている。Jenkinsの定期実行ジョブとして。

#!/bin/bash
#
# requires:
#  bash
#
set -e
set -o pipefail

LANG=C
LC_ALL=C

threshold=+$((30 * 2))

function disk_usage() {
  df -h
  df -k
}

disk_usage

for target_dir in /var/lib/jenkins/jobs/*/builds; do
  [[ -d "${target_dir}" ]] || continue
  echo ... ${target_dir}

  while read line; do
    [[ -f "${line}" ]] || continue
    rm ${line}
  done < <(find ${target_dir} -type f -mtime ${threshold})
done

disk_usage
  • threshold=+$((30 * 2))

thresholdで直近60日分を残すように指定している。この文字列は、findコマンドの引数として使用されるので、+に意味があるので、+を決して忘れぬように。

あとがき

Jenkinsコアパッケージアップグレードは、細目に実施した方が良い。




編集
@hansode at 18:00|PermalinkComments(0)TrackBack(0)