Jenkinsのジョブをcurlで処理する

2013-06-18T00:00:00+00:00 Jenkins

例えばの話として、gitにプッシュ(コミット)されたらフックさせるとか使えると思うのですが(subversionでもある)。それを使ってプッシュされたらJenkinsでビルドさせるとか出来るのかなっていう事で調べてみた

Jenkinsジョブをcurlで登録

http://localhost:8080/jenkins とかでアクセス出来る場合には http://localhost:8080/jenkins/createItem?name=ジョブ名 でぶん投げれば良いらしい。

その際にジョブの設定ファイル(config.xml)が必要になる。で既に作ってるとかの場合にはJENKINS_HOME?/job/ジョブ名/config.xmlにあるのでそれをコピーするなりで

例えば以前で書いたジョブとかだと長いけど

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <actions/>
  <description></description>
  <keepDependencies>false</keepDependencies>
  <properties/>
  <scm class="hudson.plugins.git.GitSCM" plugin="git@1.4.0">
    <configVersion>2</configVersion>
    <userRemoteConfigs>
      <hudson.plugins.git.UserRemoteConfig>
        <name></name>
        <refspec></refspec>
        <url>git://localhost:9418/sample.git</url>
      </hudson.plugins.git.UserRemoteConfig>
    </userRemoteConfigs>
    <branches>
      <hudson.plugins.git.BranchSpec>
        <name>**</name>
      </hudson.plugins.git.BranchSpec>
    </branches>
    <disableSubmodules>false</disableSubmodules>
    <recursiveSubmodules>false</recursiveSubmodules>
    <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
    <authorOrCommitter>false</authorOrCommitter>
    <clean>false</clean>
    <wipeOutWorkspace>false</wipeOutWorkspace>
    <pruneBranches>false</pruneBranches>
    <remotePoll>false</remotePoll>
    <ignoreNotifyCommit>false</ignoreNotifyCommit>
    <useShallowClone>false</useShallowClone>
    <buildChooser class="hudson.plugins.git.util.DefaultBuildChooser"/>
    <gitTool>Default</gitTool>
    <submoduleCfg class="list"/>
    <relativeTargetDir></relativeTargetDir>
    <reference></reference>
    <excludedRegions></excludedRegions>
    <excludedUsers></excludedUsers>
    <gitConfigName></gitConfigName>
    <gitConfigEmail></gitConfigEmail>
    <skipTag>false</skipTag>
    <includedRegions></includedRegions>
    <scmName></scmName>
  </scm>
  <canRoam>true</canRoam>
  <disabled>false</disabled>
  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
  <triggers class="vector"/>
  <concurrentBuild>false</concurrentBuild>
  <builders>
    <hudson.tasks.Shell>
      <command>android update lib-project -p ActionBarSherlock/actionbarsherlock -t 3
android update lib-project -p SlidingMenu/library -t 3

android update project -p sample -l ../ActionBarSherlock/actionbarsherlock
android update project -p sample -l ../SlidingMenu/library

cp sample/libs/android-support-v4.jar ActionBarSherlock/actionbarsherlock/libs/
cp sample/libs/android-support-v4.jar SlidingMenu/library/libs</command>
    </hudson.tasks.Shell>
    <hudson.tasks.Ant plugin="ant@1.2">
      <targets>clean release</targets>
      <buildFile>sample/build.xml</buildFile>
    </hudson.tasks.Ant>
  </builders>
  <publishers/>
  <buildWrappers/>
</project>

というような感じになってる。これをボディとしてURLにぶん投げれば良い

curl \
  -s \
  -X POST \
  "http://localhost:8080/jenkins/createItem?name=sample" \
  --data-binary @config.xml \
  -H "Content-Type: text/xml" \
  -w "%{http_code}" \
  -o /dev/null

sampleっていうジョブ名で作成する。でその際にレスポンスは取らないけど、結果のステータスコードだけ取る。で成功時には200のステータスコードが返ってくるけど、失敗時・既に存在するなどは400エラーが返ってくる模様

Jenkinsジョブのビルドを開始する

curl http://localhost:8080/jenkins/job/ジョブ名/build

をぶん投げれば良い模様。っていう感じな工程をやれば出来なくも無い模様。ただJenkins側の設定とかしてないのでそのままやると問題は少なからず出てきそうな気もする

んまぁとりあえずはそんな感じな事も出来るよ的な感じで

参考: http://benkiew.wordpress.com/2012/01/12/automating-hudsonjenkins-via-rest-and-curl-a-very-small-cookbook

FactoryGirlを使ってみる rspec-railsのドキュメント読み (2)