LoginSignup
2
2

More than 5 years have passed since last update.

Jenkinsに登録しているアカウント全員のメールアドレスを取得

Posted at

実行環境

  • Mac OSX Yosemite
  • Jenkins 1.598

本題

Jenkins に登録しているユーザ全員のメールアドレスを取得するためのスクリプトです。

Jenkins使用者へ一斉に連絡が必要な時に使えるかもしれません。
適切なメーリングリストが無いときにでも。

get_jenkins_user_address.sh
apiuser="Your User Name"
token="Your access tokeen"
jenkins_url="Your jenkins url"

curl_opt="-sS -u ${apiuser}:${token}"

curl ${curl_opt} ${jenkins_url}/asynchPeople/api/json | jq -r '.users | map(select(.user.fullName != ""))[].user.absoluteUrl' | while read user_url
do
  curl ${curl_opt} ${user_url}/api/json | jq -r ".property[] | select(.address != null).address" >> mails.txt
done

自アカウントのトークンは、http://${YOUR_JENKINS}/user/${YOUR_ACCOUNT}/configure で見れます。
まあ、Admin権限があれば、誰のトークンだって見れちゃうんですけどね...。

また、jsonパーサーコマンド jq が必要です。

select(.user.fullName != "") は、もっとしっかり絞らないと、
Jenkinsによっては余計な人(またはサービス)のメールアドレスが含まれるかもしれません。

蛇足

コマンドで取得できるなら、送信もJenkinsで行えば自動化できますね。

EnvInject を使って取り込む

概要

  • Shellの実行 で、上記スクリプトを実行し、
  • EnvInject を使ってビルド時の環境変数に取り込み、
  • メール通知機能に、その環境変数を突っ込んであげる

Jenkins-All-Users-Mailing-001.png

いかなローカル下とはいえ、アカウント名やトークンをさらけ出すのは抵抗があったので、Mask Passwords Plugin を使いました。

Jenkins-All-Users-Mailing-002.png

シェルでゴリゴリし、parameterファイルを作ります。
最近のJenkinsさんは色付けしてくれるようになりました。すばらしいですね。

作ったファイルを、EnvInject Plugin で読み込みます。

あとは、メールを送信するためにわざと exit 1 で失敗させます。

Jenkins-All-Users-Mailing-003.png

メール通知設定です。
このままでは、環境変数 mails が何らかのミスで定義されなかった時に E-mail: ${mails} へメールを送信しようとしておかしなことになります。
私の環境では、ドメイン名が勝手についてさらにおかしなことになったので、mails パラメータは、パラメータ付きビルドとして、前もって定義しておいた方が良いかもしれません。

Jenkins-All-Users-Mailing-004.png

こんな感じになります。
一応、私個人のアドレスはぼかさせていただきました。

Workflow Plugin の場合

せっかくなので、Workflow Plugin でも試してみました。
apiをたたくなんてまどろっこしことはせず、Groovy でJenkinsさんからメール一覧を取得しています。

emails = []
for (int i = 0; i < User.getAll().size(); i++) {
  prop = User.getAll()[i].getProperty(hudson.tasks.Mailer.UserProperty.class)
  if (prop.hasExplicitlyConfiguredAddress()){
    emails.push(prop.getExplicitlyConfiguredAddress())
  }
}

/* Ideal
emails = User.getAll().collect {
  prop = it.getProperty(hudson.tasks.Mailer.UserProperty.class)
  prop.getExplicitlyConfiguredAddress()
} - null
*/

emails = emails.join(', ')

mail bcc: '', body: 'This is test mail', cc: '', charset: '', from: '', subject: 'This is test mail', to: emails

Jenkins-All-Users-Mailing-wf-001.png

workflow plugin の時だけ、collect が想定外の動きをしたので、しぶしぶ for文 を使っています。
# ループが1要素分しか回らない
# 詳しい方がいたら教えて下さい...

蛇足2

素直にメーリングリスト作ったほうがはるかに便利です。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2