Blackbing Playground

Jenkins Notes

Jenkins

最近把 jenkins 架起來,筆記一下遇到的問題。

Install and Upgrade

安裝方式請參考http://pkg.jenkins-ci.org/debian/,可能我在多年前有安裝過,因此安裝時出現這樣的error:

1
2
3
4
5
6
Preparing to replace jenkins 1.480.3+dfsg-1~exp2 (using .../archives/jenkins_1.535_all.deb) ...
Unpacking replacement jenkins ...
dpkg: error processing /var/cache/apt/archives/jenkins_1.535_all.deb (--unpack):
trying to overwrite '/usr/share/jenkins/jenkins.war', which is also in package jenkins-common 1.480.3+dfsg-1~exp2
dpkg-deb: error: subprocess paste was killed by signal (Broken pipe)
jenkins stop/waiting

要移除掉重新安裝:

1
2
sudo apt-get purge jenkins
sudo apt-get update jenkins

Reference:
problems installing latest version of jenkins

Nginx + Jenkins

jenkins 預設跑在8080 port,因此直接連到 http://

就可以連到。不過我不太喜歡打 port,所以想要把它藏在 nginx 後面。
1
2
3
4
5
6
7
8
9
10
11
12
13
### 1. Nginx config
nginx 設定檔可以參考 [Running Jenkins behind Nginx](https://wiki.jenkins-ci.org/display/JENKINS/Running+Jenkins+behind+Nginx)
### 2. Disable external 8080 port
另外還是要將對外的8080 port鎖起來,請在 ```/etc/default/jenkins```最底下的```JENKINS_ARGS```之前加入這幾行
```shell
JENKINS_LOCAL_ONLY="yes"
if [ "$JENKINS_LOCAL_ONLY" = "yes" ]; then
PARAMS="$PARAMS --httpListenAddress=127.0.0.1"
fi

Reference:
Starting and Accessing Jenkins

3. Enable Jenkins log

若要看 jenkins 的log,還要加上 log 的參數設定

1
2
3
4
JENKINS_ENABLE_ACCESS_LOG="yes"
if [ "$JENKINS_ENABLE_ACCESS_LOG" = "yes" ]; then
PARAMS="$PARAMS --accessLoggerClassName=winstone.accesslog.SimpleAccessLogger --simpleAccessLogger.format=combined --simpleAccessLogger.file=/var/log/jenkins/access"
fi

Reference:
Starting and Accessing Jenkins

4. No valid crumb was included in the request

設定完之後基本上就可以用了,不過打開瀏覽器的 console 一直會出現

valid crumb was included in the request```,後來我將最底下的 ```Prevent Cross Site Request Forgery exploits``` 的打勾取消掉,就沒事了。(PS.我也不知道有什麼影響)
1
2
3
4
5
6
7
8
## 設定你的應用程式執行環境變數
因為我對系統不太熟,比較麻煩的是要確認你在執行的環境變數,像是你安裝 rvm 之後 ruby 的執行位置等等,我主要是拿來跑 grunt 的 test 與 build,可以參考這篇的 PATH 設定:[jenkins configuration yeoman based angularjs web application](http://www.portlandwebworks.com/blog/jenkins-configuration-yeoman-based-angularjs-web-application)
### 5. set TimeZone
add this on ```/etc/default/jenkins

1
JAVA_ARGS="-Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Taipei"

Reference:
https://wiki.jenkins-ci.org/display/JENKINS/Change+time+zone

Bitbucket hook Jenkins

最後最重要的就是要把你的專案 hook 到 Jenkins 啦,我測試的 project 放在 Bitbucket,所以就用 Bitbucket 來舉例。

  1. 安裝 jenkins plugin:
    到 manage plugin/available 安裝 Build Authorization Token Root Plugin。
  2. 到你的 job 設定裏頭打開 Build Triggers/ Trigger builds remotely,設定 Authentication Token,填入自己設定的一組 Token(例如 build1234567)
  3. 測試 http://jenkins-server/buildByToken/build?job=myjob&token=build1234567 是否有觸發 job 的執行。
  4. 到 bitbucket 你自己的 repository -> setting -> hooks -> select a hook -> Jenkins -> Add hook

參考資料 Jenkins hook management

接下來很重要!!

馬的我追 log 追半天一直 hook 不成功,總之是因為 jenkins 的 hook 格式跟 bitbucket 送出的資料對不起來(我不曉得是哪邊的 bug),bitbucket POST 出去的 data,Jenkins 不吃。

螢幕快照 2014-03-07 下午1.18.46.png

請在 Endpoint 裏頭填入第三點的 url 並且加上一個 &,讓他忽略之後的變數,例如:
http://```jenkins-server```/buildByToken/build?job=```myjob```&token=```build1234567```&

剩下都留空白。就好了。

大功告成

push 之後看到 jenkins 開始聽話的工作了,喝杯咖啡犒賞一下自己。