rubygems_check_replacement_vulnerabilityのDocker Image作った

id:sue445 さんが改ざんチェックgemを作ってくれたとのことで早速ためそう!

sue445.hatenablog.com

と思ったらMBPリストアしたばっかりでrbenv入ってなくて環境が整ってなかったのでrbenv突っ込んでrubyのビルドして・・・

やってられっかーーーーー!となって作りました。よしなにお使いください。

使い方

以下をbashrc or zshrcに突っ込んで source したらあとは普通に こちら の記事を参考にお使いください。

rubygems_check_replacement_vulnerability () {
  docker run --rm cynipe/rubygems_check_replacement_vulnerability $@
}

もちろん docker run --rm cynipe/rubygems_check_replacement_vulnerability vulnerable_gems --username=<USERNAME> とかしてもOK。

わーい、だいじょぶ!

rubygems_check_replacement_vulnerability verify_gem --name=jenkins-capistrano --repo-url=https://github.com/cynipe/jenkins-capistrano
Unpacked gem: '/tmp/gem-20160415-1-19bjy7s/jenkins-capistrano-0.1.0'
[Info] jenkins-capistrano 0.1.0 is safe!
Unpacked gem: '/tmp/gem-20160415-1-1ujzn0g/jenkins-capistrano-0.1.1'
[Info] jenkins-capistrano 0.1.1 is safe!
Unpacked gem: '/tmp/gem-20160415-1-136bp3f/jenkins-capistrano-0.1.2'
[Info] jenkins-capistrano 0.1.2 is safe!

存在してるディレクトリにgit cloneする方法

initする方法

$ cd /path/to/existing_dir
$ git init
$ git remote add origin <remote-url>
$ git fetch origin
$ git checkout -b master --track origin/master

別ディレクトリにcloneして.gitをコピーする方法

$ git clone --no-checkout <remote-url> /path/to/writable_dir
$ mv /path/to/writable_dir/.git /path/to/existing_dir
$ cd /path/to/existing_dir
$ git reset --hard HEAD

参考

WerckerでPrivateリポジトリなGemやPuppetモジュールを利用する方法

皆様あけましておめでとうございます。歳を重ねるにつれて1年を短く感じるようになり年末、正月気分が年々薄れていき今年はさっぱり正月気分を味わえていませんが皆様はいかがでしょうか?

さてさて、最近巷で流行りのWerckerはご存知でしょうか?Github, Bitbucketに対応していてプライベートリポジトリだろうとCIし放題という便利なサービスです。

こんな便利なものを使わない手はないということで早速使ってみようとしたところCIしようとしたリポジトリが他のプライベートなGemやPuppetモジュールなんかに依存していてちょっと手間取ったのでその方法をご紹介。

やり方

まずApplicationのSettingsタブにあるKey managementでリポジトリへアクセスするための鍵ペアを作ります。

f:id:cynipe:20140106213958p:plain

対象とするリポジトリ郡に対してアクセスするために作成した公開鍵をBitbucket側にも設定しておきましょう。ダミーユーザなどを作ってそのユーザに鍵を登録しRead Onlyな権限を付与しておくのが管理上は楽かもしれません。

次にこれをビルドスクリプトから利用できるようにするために変数として定義します。変数の定義は同じSettingsタブのPipelineでAdd new variableをクリックすれば追加が出来ます。

f:id:cynipe:20140106214602p:plain

最後にビルド中に作成した鍵を使ってCloneされるようにwercker.ymlに以下の様に設定すれば完了です。add-sshkeyとadd-to-known_hostsステップだけきちんと設定出来ていれば、以降はbundle installするなり、librarian-puppet installするなりすればきちんとチェックアウトして利用することが出来ます。

box: wercker/ruby
build:
  steps:
    - add-ssh-key:
        keyname: BITBUCKET_KEY

    - add-to-known_hosts:
        hostname: bitbucket.org
        fingerprint: 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40

    - script:
        name: specs
        code: rake spec

それでは快適なWerckerライフを!

参考リンク

Using private repositories in your builds


Jenkins実践入門 ?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

Jenkins実践入門 ?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

Eclipseプラグインをコマンドラインでインストールする方法

BoxenというかPuppetでEclipse環境を構築するのにプラグインのインストールをDropins使ってやろうと思ったのだけど、どうもDropins用にファイルで提供してるプラグインがあまりない感じだったのでやり方を探してみたところ分かったのでメモ。

やり方

インストール:

$ <eclipse-home>/eclipse -nosplash \
  -application org.eclipse.equinox.p2.director \
  -profile SDKProfile \
  -destination <eclipse-home> \
  -repository http://download.eclipse.org/releases/juno \
  -installIU <plugins-id>

アンインストール:

$ <eclipse-home>/eclipse -nosplash \
  -application org.eclipse.equinox.p2.director \
  -profile SDKProfile \
  -destination <eclipse-home> \
  -repository http://download.eclipse.org/releases/juno \
  -uninstallIU <plugin-id> 

repositoryにはインストールするプラグインの依存関係にあるアップデートサイトは全て指定しておかないとだめっぽい。ちなみにカンマ区切りで指定すれば良い。

複数のpluginをまとめてインストール/アンインストールする場合はinstallIU/uninstallIUオプション付きで指定。

例:VrapperをJDTフィーチャ、surroundオプション付きで入れる

$ <eclipse-home>/eclipse -nosplash \
  -application org.eclipse.equinox.p2.director \
  -profile SDKProfile \
  -destination <eclipse-home> \
  -repository http://download.eclipse.org/releases/juno,http://vrapper.sourceforge.net/update-site/stable \
  -installIU net.sourceforge.vrapper.feature.group \
  -installIU net.sourceforge.vrapper.eclipse.jdt.feature.feature.group \
  -installIU net.sourceforge.vrapper.plugin.surround.feature.group

詳しくは以下参照

http://help.eclipse.org/juno/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/p2_director.html

jenkins-capistranoでプラグインインストールのサポートしたよー

ついでにjenkins-capistrano-0.0.6としてリリースしてみました。

リリースノート

  • ビューの管理機能
  • プラグインの管理機能(実験機能)

ビューの作成機能はサクッと出来たもののプラグインについては色々と悩みどころがあってここ2,3日考えていたんですが、まだ安定版にもしてないしとりあえず出しちまえと思って出してみました*1。使い方についてはREADME(view, plugin)を参照してくださいな。

今後について

思ってることをつらつらと。

今回サポートしたプラグインの管理機能はJenkins1.483でサポートされたAPIを利用して作っているんですが、この素晴らしいAPIは全てのconfig.xmlに書かれたpluginのバージョンを元にインストールするという方法がサポートされてます。つまり、この機能を利用すればconfig/jenkins配下に置かれたjob,node,viewを元に自動でプラグインがインストール出来るように作れるってことなんですよね。夢がひろがりんぐ。

ただ、現状だとnodeの追加はjenkins.rbをベースにした形でconfig.xmlではなくFormのサブミッションで作成しているのでサポートしきれません。しかも恐らく*2nodeの追加はconfig.xmlのPOSTでは作れない*3のでちょっと手数を踏んで実装するか、jenkins.model.Jenkins#createNodeを実装して対応するか・・・。でもそれだと過去バージョン使ってる人は使えないなーとか。色々悩み中です。

という訳で実装方法はともかくも今後のロードマップは以下な感じで考えてます。こうしたらいいんじゃない?とかこういうのが欲しいとかあればTwitterなりでアイデアくださいまし。

  • config_nodesタスクのconfig.xml形式をサポート
    • 既存のjsonフォーマットからのmigration込み
  • 指定のJenkinsからjob,node,viewのconfig.xmlをダウンロードする機能
  • 1.483以前のJenkinsのXMLを最新の形式にする機能のサポート(プラグインの自動インストールに必要)
  • プラグインの指定インストールも現状のままのサポート

そんな訳で今後もよろしくお願いします〜。

*1:実装が死ぬほどやっつけなのはご容赦ください

*2:nodeを空で追加してからPOSTなら出来る

*3:更新は可能

jenkins-capistranoでviewの作成をサポートしてみた

今まではジョブの作成、更新、無効化とslaveの作成までをサポートしていたのだけど、Viewも一緒に作成出来ればなぁと思ってJenkinsのコミットログをRESTでgrepしてみたら出来るっぽかったので対応してみた*1

使い方

構成はこんな感じ

  config
  ├── deploy.rb
  └── jenkins
       └── views
           ├── view1.xml
           ├── view2.xml
           └── view3.xml

deploy.rb

set :application, "your-awesome-app"
set :scm, :git
set :repository,  "https://github.com/your/repository.git"

set :jenkins_host, 'http://localhost:8080'
# set :jenkins_username, '' # default empty
# set :jenkins_password, '' # default empty
# set :jenkins_view_config_dir, 'config/jenkins/views'

before 'deploy', 'jenkins:config_views'

viewの設定はconfig.xmlで管理するので以下な感じ。xmlのファイル名はviewの名前と合わせておいてくださいまし。

<listView>
  <name>view1</name>
  <filterExecutors>false</filterExecutors>
  <filterQueue>false</filterQueue>
  <properties class="hudson.model.View$PropertyList"/>
  <jobNames class="tree-set">
    <comparator class="hudson.util.CaseInsensitiveComparator" reference="../../../hudson.plugins.view.dashboard.Dashboard/jobNames/comparator"/>
  </jobNames>
  <jobFilters/>
  <columns>
    <hudson.views.StatusColumn/>
    <hudson.views.WeatherColumn/>
    <hudson.views.JobColumn/>
    <hudson.views.LastSuccessColumn/>
    <hudson.views.LastFailureColumn/>
    <hudson.views.LastDurationColumn/>
    <hudson.views.BuildButtonColumn/>
  </columns>
  <includeRegex>job.*</includeRegex>
</listView>

こんなXML作れねーよ!と思う人は慌てるなかれ、最初は画面から作ってしまって$JENKINS_HOME/config.xmlのviewsセクションのXMLをコピペすればいけまする。
ただし以下の部分はpostした時にJenkinsに怒られちゃうので削除してくださいまし。基本どのViewでも対応できるはず。

<owner class="hudson" reference="../../.."/>

これで複雑に構成されたjenkinsでも一発で復元できますねっ!!

ちなみにpluginのインストールもサポートする予定ではいてやっつけ実装のものがfeature/manage-plugin-supportブランチにおいてあります。こちらに関してはpluginインストール完了待ちの実装だったり、完了後の再起動だったりとかどうしようかなぁと思い中なのでも少し時間かかりそーです。

ちなみにJenkinsとPluginのインストールはpuppet-jenkinschef-jenkinsでやってしまう方がいいかなと思っていますが、もう少しライトウェイトに使いたい方のお役には立てるかなと思ってるので頑張る予定です。

皆様のご意見、ご感想お待ちしております!

Chef: The Definitive Guideウェブオペレーション ―サイト運用管理の実践テクニック (THEORY/IN/PRACTICE)Amazon Web Services クラウドデザインパターン実装ガイド

*1:まだリリースまではしてない

キーマップのSIDを使った整理とprefix運用

色々キーマップの割り当てで悩んでたんだけど、この方法はいいかもしれない。
<SID>(名前)としておいたのを後で参照できるので、コマンドの定義とキーマップの割り当てそのものを別に定義できていい。しかも名前がつけられるので適切に名前をつけてあげれば変にコメント付ける必要もないし。

nnoremap <silent> <SID>(del-trail-space) :<C-u>%s/\s\+$//ge<CR>
nnoremap <silent> <SID>(tab2space)  * :%s/\t/  /ge<CR>

nmap <C-x> <SID>(del-trail-space)
nmap <C-z> <SID>(tab2space)

prefixについては検索対象が減るので反応がはやくなるし、他に当ててたもの衝突しにくくなるのでいい!

nnoremap [hoge] <Nop>
nmap f [hoge]

nnoremap [foo] <Nop>
nmap <S-f> [foo]

nnoremap [hoge]l :<C-u>便利なコマンド1
nnoremap [hoge]L :<C-u>便利なコマンド2
nnoremap [foo]l :<C-u>凄いコマンド1
nnoremap [foo]L :<C-u>凄いコマンド2

上の例でで便利なコマンド1、で凄いコマンド1が呼べる。

実際に色々整理したのはこんな感じ。

Vimテクニックバイブル ?作業効率をカイゼンする150の技

Vimテクニックバイブル ?作業効率をカイゼンする150の技