聚會時間公告: 因應COSCUP 2011, Kalug 8月份休會一次

七月 21, 2017

小惡魔AppleBOY
AppleBOY
is about »

tag cloud

» Drone 自動觸發 GitLab CI 或 Jenkins 任務

drone-logo_512 Drone 是一套由 Go 語言所開發的開源碼專案,讓開發者可以使用 Docker Container 快速設定自動化測試及部署,上篇有提到『Cronjob 搭配 Drone 服務』,讓 JenkinsGitLab CI 用戶可以轉換 Cron Job 任務到 Drone 上面。本篇則是會介紹如何透過 Drone 去觸發 Jenkins 或 GitLab CI 上的工作,當然這是過渡時期,希望大家最後能將工作完整移轉到 Drone 上面,不要再依靠 Jenkins 或 GitLab CI 了。本篇會教大家用三種方式來觸發 GitLab CI 或 Jenkins 任務。


  • 使用 Drone CI/CD
  • 使用 Docker 指令
  • 使用 Command Line (命令列)

觸發 GitLab CI

不管是 GitLab CI 或是 Jenkins 都可以透過該服務提供的 HTTP API 來遠端觸發,而我用 Go 語言將觸發這動作寫成 Drone Plugin,讓 Drone 用戶可以不用自己寫 curl 去觸發。

申請專案 Token

要透過 HTTP API 去觸發任務,首先就是要申請專案 Token,請大家參考 Triggering pipelines through the API 頁面。申請完成後,請把專案 ID 跟 Token 帶入底下使用。

使用 Drone 觸發

pipeline:
  gitlab:
    image: appleboy/drone-gitlab-ci
    host: https://gitlab.com
    token: xxxxxxxxxx
    ref: master
    id: gitlab-project-id
其中 host 請改成公司內部的 Git 伺服器網址,id 是專案獨立 ID,最後 Token 則是上面步驟所拿到的 Token。詳細設定可以參考 README,如果不是用 Drone 也沒關係,可以用 Docker 或透過 Go 語言可以包成各作業系統執行檔 (包含 Windows)

使用 Docker 觸發

請使用 appleboy/drone-gitlab-ci 映像檔,檔案大小為 2MB
docker run --rm \
  -e GITLAB_HOST=https://gitlab.com/
  -e GITLAB_TOKEN=xxxxx
  -e GITLAB_REF=master
  -e GITLAB_ID=gitlab-ci-project-id
  appleboy/drone-gitlab-ci

使用 CLI 觸發

請先從 Release 頁面下載相關執行檔,重點是你也可以在 Windows 做到此事情喔 (這就是 Go 語言跨平台的好處)。在命令列使用底下指令。
drone-gitlab-ci \
  --host https://gitlab.com/ \
  --token XXXXXXXX \
  --ref master \
  --id gitlab-ci-project-id

測試看看

這邊提供 GitLab 專案的資料給大家直接測試看看
drone-gitlab-ci \
  --host https://gitlab.com \
  --token 9184302d980918efad05bce8b97774 \
  --ref master \
  --id 3573921
上面指令沒意外的話,會看到底下結果:
2017/06/27 15:01:59 build id: 9360879
2017/06/27 15:01:59 build sha: 169e7c1d798c9593c06fbd9d474da9c07f699634
2017/06/27 15:01:59 build ref: master
2017/06/27 15:01:59 build status: pending
直接到 pipeline 頁面看結果 Screen Shot 2017-06-27 at 3.02.05 PM

歡迎大家關注此專案 drone-gitlab-ci

接著來講 Jenkins 部分,其實原理都跟 Gitlab CI 是一樣的。

觸發 Jenkins

這邊其實跟 GitLab CI 設定相同,只是參數不一樣而已,首先必須要去哪裡找個人 API Token,請到 Jenkins 個人頁面找到 API Token。 Screen Shot 2017-06-27 at 3.11.29 PM

使用 Drone 觸發

pipeline:
  jenkins:
    image: appleboy/drone-jenkins
    url: http://example.com
    user: appleboy
    token: xxxxxxxxxx
    job: drone-jenkins-plugin-job
其中 url 請改成公司內部的 Jenkins 伺服器網址,job 是 Jenkins 任務名稱,最後 Token 則是上面個人帳號所拿到的 Token。詳細設定可以參考 README,如果不是用 Drone 也沒關係,可以用 Docker 或透過 Go 語言可以包成各作業系統執行檔 (包含 Windows)

使用 Docker 觸發

請使用 appleboy/drone-jenkins 映像檔,檔案大小為 2MB
docker run --rm \
  -e JENKINS_BASE_URL=http://jenkins.example.com/
  -e JENKINS_USER=appleboy
  -e JENKINS_TOKEN=xxxxxxx
  -e JENKINS_JOB=drone-jenkins-plugin
  appleboy/drone-jenkins

使用 CLI 觸發

請先從 Release 頁面下載相關執行檔,重點是你也可以在 Windows 做到此事情喔 (這就是 Go 語言跨平台的好處)。在命令列使用底下指令。
drone-jenkins \
  --host http://jenkins.example.com/ \
  --user appleboy \
  --token XXXXXXXX \
  --job drone-jenkins-plugin

歡迎大家關注此專案 drone-jenkins

總結

寫這兩個 Plugin 的目的就是希望能有多點開發者從 Jenkins 或 GitLab CI 轉到 Drone,這是過渡時期,等熟悉了 Drone 的設定,你會發現 Drone 已經可以做到 Jenkins 或 GitLab CI 所有事情,甚至更強大。如果對 Drone 有興趣,可以來上七月底的『用一天打造團隊自動化測試及部署
  • 時間: 2017/07/29 09:30 ~ 17:30
  • 地點: CLBC 大安館 (台北市大安區區復興南路一段283號4樓)
  • 價格: 3990 元

報名連結

十二月 24, 2014

小惡魔AppleBOY
AppleBOY
is about »

tag cloud

» GitLab 快速安裝

gitlab_logo

最近想安裝新版的 GitLab,竟然發現 GitLab 推出快速懶人包,終於可以不用打很多指令來安裝了,大幅降低了安裝困難度,目前支援 CentOS, Ubutnu, Debian 等安裝包,GitLab 各版本也可以從這邊列表找到,另外安裝前請確保你的硬體環境是符合 GitLab 所要求,來看看有沒有這麼簡單安裝。

安裝方式

底下是 Debian 7 安裝方式

wget https://downloads-packages.s3.amazonaws.com/debian-7.7/gitlab_7.6.1-omnibus.5.3.0.ci-1_amd64.deb
sudo apt-get install openssh-server
sudo apt-get install postfix # Select 'Internet Site', using sendmail instead also works, exim has problems
sudo dpkg -i gitlab_7.6.1-omnibus.5.3.0.ci-1_amd64.deb

完成後,你會看到畫面要求您執行 gitlab-ctl reconfigure 來啟動所有服務,檢查服務是否都正常啟動可以透過 gitlab-ctl status 看到底下就代表啟動成功

run: logrotate: (pid 29315) 2180s; run: log: (pid 25339) 2699s
run: nginx: (pid 29886) 2148s; run: log: (pid 25324) 2701s
run: postgresql: (pid 29334) 2179s; run: log: (pid 16414) 3353s
run: redis: (pid 29342) 2179s; run: log: (pid 16313) 3360s
run: sidekiq: (pid 2542) 1282s; run: log: (pid 25303) 2703s
run: unicorn: (pid 2598) 1279s; run: log: (pid 25278) 2704s

如果系統本身有安裝 Nginx,請將 GitLab 預設 80 port 改掉,請修改 /etc/gitlab/gitlab.rb 設定檔,找到底下

nginx['redirect_http_to_https_port'] = 80

修改成

nginx['redirect_http_to_https_port'] = 8088

儲存設定檔後,請重新跑 gitlab-ctl reconfigure 即可,另外對外網址也請設定正確 external_url。另外官方也有寫出 Digital Ocean 也直接推出 One-click install and deploy GitLab,一個月才 10 美金,真是太超過了。

四月 7, 2014

小惡魔AppleBOY
AppleBOY
is about »

tag cloud

» 用 Go 語言寫的 Github Git 服務

null

最近看到大陸那邊用 Go 語言寫了一套類似 Github 服務叫做 Gogs(Go Git Service),目前個人裝起來速度方面相當快,跟 GitLabRuby 寫的 Git Service 速度有差,以功能完整性來說,GitLab 還是大勝 Gogs,安裝方式則是 Gogs 勝於 GitLab,如果最後要推薦用 Gogs 還是 GitLab,我個人還是會選 GitLab 因為畢竟還是要搭配 Jenkins 等 CI 服務才能發揮作用,這次來筆記如何在 Ubuntu 上安裝 Gogs。

安裝 Go 環境

如果用 Ubuntu / Debian 系列,請不要透過 apt 方式安裝,因為安裝完成的 Go 版本會非常舊,請使用 tarball 方式安裝,首先到官方網站下載最新檔案

$ wget https://go.googlecode.com/files/go1.2.1.linux-amd64.tar.gz
$ export PATH=$PATH:/usr/local/go/bin

也可以把 $PATH 寫到 .bashrc 檔案內,這樣下次開 Shell 就不用重新打一次,接著下 go version 看到底下結果表示安裝成功

$ go version
go version go1.2.1 linux/amd64

最後將 $GOROOT$GOPATH 設定上去

$ export GOROOT=/usr/local/go
$ export PATH=$PATH:$GOROOT/bin
$ export GOPATH=/home/git/gocode

安裝 Gogs service

安裝非常容易,只要透過底下兩個指令就安裝完成了

# Download and install dependencies
$ go get -u github.com/gogits/gogs

# Build main program
$ cd $GOPATH/src/github.com/gogits/gogs
$ go build

原始目錄會在 /home/git/gocode/src/github.com/gogits/gogs 接著可以看到 conf/app.ini 原始設定檔,官方建議不要修改此檔案,使用者可以自行建立 custom/conf/app.ini 來取代原始設定內容。最後執行 ./gogs web

$ ./gogs web
Server is running...
2014/04/07 15:19:07 [conf.go:309]  Log Mode: Console(Trace)
2014/04/07 15:19:07 [conf.go:310]  Cache Service Enabled
2014/04/07 15:19:07 [conf.go:311]  Session Service Enabled
2014/04/07 15:19:07 [install.go:53]  Run Mode: Development
2014/04/07 15:19:07 [command.go:73]  Gogs: Go Git Service 0.2.0.0403 Alpha
2014/04/07 15:19:07 [command.go:73]  Listen: :3001

打開 http://localhost:3001 就可以看到下面畫面,代表安裝成功

Install - Gogs  Go Git Service

二月 7, 2014

小惡魔AppleBOY
AppleBOY
is about »

tag cloud

» Git Server 噴 git upload-pack: git-pack-objects died with error

Git-Logo-2Color

透過 Gitlab 架設 Git Server 來放一些 Document 資料,由於個人 Document 都是 pdf 檔案,所以整個 Git Repository 就非常肥大,今天在 Clone 下來的時候,不僅是主機 CPU 飆高,然後記憶體被吃到快沒了,最後還噴出底下錯誤訊息

remote: Counting objects: 4912, done.
remote: fatal: Out of memory, malloc failed
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed

網路上查到這篇 Git clone error + remote: fatal: Out of memory, malloc failed + error: git upload-pack: git-pack-objects died with error. 解法,裡面提到在每次 clone 專案時,Git 都會將資料壓縮並且存放到記憶體,所以如果 Repository 超過 100MB,你就會發現記憶體漸漸減少,然後整個炸掉,解法就是設定此 Repository 讓大家直接下載檔案,不要先丟到記憶體內,所以請打開 config 設定檔案,裡面寫入

[pack]
    window = 0

十一月 13, 2013

小惡魔AppleBOY
AppleBOY
is about »

tag cloud

» Jenkins + Nginx User Auth

jenkins_logo

Jenkins CI 是一套非常好的 Job 執行 Tool,可以幫忙跑專案測試,測試完成後繼續 Deploy 到相對應的伺服器,也可以自動寄信給開發者或者是指定的內部人員。在 UbuntuDebian 安裝方式非常簡單,按照下述操作就可以簡易架設完成

$ aptitude -y install openjdk-7-jre openjdk-7-jdk
$ wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
$ sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
$ aptitude -y update
$ aptitude -y install jenkins


安裝完成預設是 8080 port 如果要改成其他 port,或許你有裝 Gitlab 你會發現 8080 已經被佔用了,請修改 /etc/default/jenkins,將 HTTP_PORT=8080 改成你想要的 port 即可。這時候請用 netstat -tanp | grep 8088 指令觀看服務是否有跑起來

tcp6  0  0 0.0.0.0:8088  :::*     LISTEN      31761/java

服務有正確跑起來,並且 Listen 在 0.0.0.0,如果你直接用瀏覽器打開 http://your_ip:8088,就可以看到 Jenkins 首頁,完全無任何認證,任何人都可以使用此網站,當然可以啟動 Jenkins 內建的使用者認證,設定後會發現一般使者還是可以看到 detail Job,比如說誰 commit 了 code … 等等,所以這邊介紹如何搭配 Nginx 的 User Auth 機制。

首先必須先把 IP 設定成只有 Listen 127.0.0.1,避免外面的人直接打 IP:PORT 連到網站,一樣設定 /etc/default/jenkins

JENKINS_ARGS="--httpListenAddress=127.0.0.1 --webroot=/var/cache/jenkins/war --httpPort=$HTTP_PORT --ajp13Port=$AJP_PORT"

完成後請重新啟動 Jenkins,接著搭配 Nginx 用 Proxy 方式來導向 Jenkins 服務

upstream app_server {
    server 127.0.0.1:8088 fail_timeout=0;
}

server {
    listen 80;
    server_name xxxx.com;

    location / {
        proxy_redirect     off;

        proxy_set_header   Authorization $http_authorization;
        proxy_pass_header  Authorization;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwared-User  $http_authorization;
        proxy_max_temp_file_size 0;
        if (!-f $request_filename) {
            proxy_pass http://app_server;
            break;
        }
    }
}

設定後請重新啟動 Nginx,這樣就可以直接使用 80 port 來瀏覽 Jenkins,最後搭配 Nginx Auth Module,只要在 Location 加入兩行:

auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;

產生帳號密碼可以透過底下指令:

$ htpasswd -c /etc/nginx/.htpasswd username

一樣重新啟動 Nginx 後,再度瀏覽網頁,就會跳出 popup 視窗,請你輸入密碼,這樣就可以防止任何人看到資料了。

十一月 1, 2013

小惡魔AppleBOY
AppleBOY
is about »

tag cloud

» Gitlab CE + Gitlab CI 打造版本控制及自動測試流程

gitlab_logo

Git 版本控制不管在嵌入式或 Web 領域都是很受歡迎的工具,尤其是不會遇到像 svn 搞爛 source tree,然後又要 Google 一堆解法。一般公司入門大概就是買 Github 服務,一個月才五美金,可以提供五個 Private Project,當然你也可以不付錢,而去使用 Bitbucket,好處就是無限的 Private Project,唯一的限制就是開發者數量,只能在五個以內,設定超過五個,就不給 push 或 pull 了,完成版本控制後,接著就是專案的自動測試,在 github 上面,推的就是 travis-ci,這也是全部 open source 專案的喜好,你會發現大部分的專案都會放上 .travis.yml,來告訴 travis 需要的測試步驟,測試步驟完成後,就要將 source code deploy 到 Amazone 或其他雲端服務,到這個服務基本上都要收費了,所以上一篇有介紹 Drone.io 服務,可以自動測試加上 Deploy 到遠端機器,不過缺點就是不支援 Private Project,要的話就是要收費。

所以想要版本控制 -> 自動化測試 -> 發佈程式,這整個流程,其中任何一個流程都有可能收費,加上公司開發的程式,一定不可能是 Public,所以被收費肯定很正常,為了要找到免費的方案,所以自己架設等於是最快的,這邊就推薦 GitLab,這介面跟 Github 還蠻接近的,功能也很完整,大家可以試試看,自動化測試部份,就直接用 GitLab CI,比較不方變得地方就是,自動化測試完成後,不會寄信通知。官方有提到歡迎任何人送 PR Feature。GitLab + CI 架設完成,大概就可以捨棄 Gitlab + travis 或 Drone.io。這是窮人作法,如果有預算的話,還是買線上服務,真的有很棒的 Deploy 及檢測程式碼的服務。

support:

biggo.com.tw

biggo.sg

A Django site.