AttsuBlog

ATTSU INC. Official Blog
IMGP3766_Fotor
0 comments

オープンソース版DroneでCI環境 Part2

タグ:, , , , ,

湿気が多く夏が近づいてきた感じがしますね、こんにちは萬屋です。

初夏とは言え、夏のようなジメジメ感が……自分は夏が大の苦手なので今から恐怖です。

先日東京江戸たてもの園に行ってきました(・∀・)
こちらは江戸時代から昭和に建築された、歴史的建築物が移設されている場所です。
高橋是清邸や昭和の銭湯、金物屋(そういえば最近見ないですね)など、著名人に縁のあるものから当時の人々の生活に結びついたものまで幅広く観ることが出来ます。

歴史好きの自分としては大興奮でした(/・ω・)/
特にテンションが上がったのは写真の昭和の長屋を再現した部分、この時代に生きていた訳ではないのですがどこか懐かしさを感じノスタルジックに……
なんとなくこの雰囲気に近いところが子供の頃に残っていたからなのでしょうか……因みに自分は田舎の出身で、都会とは無縁の生活をしていました(^_^;)

自分だけではなくアッツ社員の大多数が地方出身者ですね(^^)北は北海道、南は大分まで、よく地元ネタで盛り上がりますw
代表の宮川は南島原のそうめん営業課(南島原はそうめんが名産なのです!)としての顔も持っています。島原手延そうめん、自分も食べましたが美味しかったですよ!!

さて、与太話はこれくらいにして本題です。
先日に引き続きオープンソース版DroneでCI環境 Part2です、今回は実践編!実際にBitBucketと連携してみたいと思います(^_^)


以前にClojureでArangoDBを使う記事を載せましたが、こちらのソースでテストコードを書いてDroneでテストしてもらいましょう。

まずはcore.cljのソースです。以前の記事とは少し違うところがあります。


(ns arango-test.core
  (:gen-class)
  (:require [travesedo.collection :as col]
            [travesedo.database :as db]
            [travesedo.query :as q]))

;; 作成するデータベース名
(def database-name "clojure_test")
;; ArangoDBのホスト名
(def arango-host "http://127.0.0.1:8529/")
;; DBユーザ名
(def db-user "user")
;; DBパスワード
(def db-password "password")

;; DBの存在確認
(defn check-exist?
  "Check Exist MottainaiDB"
  []
  (not-any? (fn [db-name] (= db-name database-name)) ((db/list-databases {:conn {:type :simple
                                                                                 :url arango-host}}) :result)))

;; データベースの作成
(defn create-database
  []
  (db/create {:conn {:type :simple
                     :url arango-host}
              :payload {:name database-name
                        :users [{:username db-user
                                 :password db-password}]
                        }}))

;; ArangoDB接続設定)
(def CTX {:conn {:type :simple
                 :url arango-host
                 :uname db-user
                 :password db-password
                 }
          :db database-name})

;; ArangoDB操作時のパラメータを作成
(defn create-context
  "Create Context"
  [ctx]
  (conj ctx CTX))

;; コレクションの作成
(defn create-collection
  [col-name]
  (col/create (create-context {:payload {:name col-name}})))

;; 値の追加
(defn add-user
  [name mail age]
  (-> {:payload {:query (str "INSERT { name: '" name "', mail: '" mail "', age: " age " } IN users")}} create-context q/aql-query))

;; 名前から値の取得
(defn get-user-from-name
  [name]
  (-> {:payload {:query (str "FOR u IN users FILTER u.name == '" name "' RETURN u")}} create-context q/aql-query))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (when (= (check-exist?) true)
    (create-database)
    (create-collection "users"))
  (add-user "宮川" "miyagawa@attsu.co.jp" 100)
  (add-user "萬屋" "yorozuya@attsu.co.jp" 28))

leinコマンドでプロジェクトを作成した場合はtestディレクトリが作成されてその中にcore_test.cljというのができています。テストはこちらに記述します。


(ns arango-test.core-test
  (:require [clojure.test :refer :all]
            [arango-test.core :refer :all]))

(defn setup []
  (println "Setup")
  ; データベースが存在しなければ作成する
  (when (= (check-exist?) true)
    (create-database)
    (create-collection "users")))

(defn teardown []
  (println "Teardown"))

(defn each-fixture [f]
  (setup)
  (f)
  (teardown))

(use-fixtures :each each-fixture)

(deftest a-test
  (testing "Add User Test"
    (let [add-result1 (add-user "テストユーザ1" "test1@test.com" 30)
          add-result2 (add-user "テストユーザ2" "test2@test.com" 31)]
      ; ドキュメント作成が成功しているかの確認
      (is (= false (add-result1 :error)))
      (is (= false (add-result2 :error)))))

  (testing "Get User From Name Test"
    (let [get-result1 (get-user-from-name "テストユーザ1")
          get-result2 (get-user-from-name "テストユーザ2")
          get-result3 (get-user-from-name "いないユーザ")]
      ; 取得が成功しているかの確認
      (is (= false (get-result1 :error)))
      (is (= false (get-result2 :error)))
      (is (= false (get-result3 :error)))
      ; 取得した結果の整合性確認
      (is (= 1 (count (get-result1 :result))))
      (is (= 1 (count (get-result2 :result))))
      (is (= 0 (count (get-result3 :result))))
      (is (= 30 ((first (get-result1 :result)) :age)))
      (is (= 31 ((first (get-result2 :result)) :age))))))

これで lein test もしくは lein test arango-test.core-test とコマンドを入れればテストが実行されます。
しかしローカルにArangoDBがある必要があるし、テストの度にデータを綺麗にして……などとやっていたら効率が悪いですよね(´・ω・`)

そこでDroneですよ奥さん!DroneならDockerを使っているので毎回テスト毎にまっさらな環境を準備してくれるわけです、便利ですね(*´~`*)

ではテスト用のDockerイメージを作成します。こちらにDrone用のイメージ名が記載されておりClojure用もありますが、今回はArangoDBを使うので別途作成します。
Dockerでイメージを作成するときはDockerfileというものを準備して、docker buildコマンドで作成します。
以下、Clojure + ArangoDBのDockerfileです。


#
# Clojure + ArangoDB
#
# ベースイメージはUbuntu
FROM dockerfile/ubuntu

MAINTAINER Yorozu-ya 

RUN apt-get update
RUN apt-get install -y apt-transport-https

# JDKのインストール
RUN \
  echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
  add-apt-repository -y ppa:webupd8team/java && \
  apt-get update && \
  apt-get install -y oracle-java8-installer && \
  rm -rf /var/lib/apt/lists/* && \
  rm -rf /var/cache/oracle-jdk8-installer

# 作業ディレクトリ
WORKDIR /data

# JAVA_HOMEの設定
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle

# Clojure(leiningen)のインストール
RUN curl -s https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein > \
            /usr/local/bin/lein && \
            chmod 0755 /usr/local/bin/lein
ENV LEIN_ROOT 1
RUN lein

# ArangoDBのインストール
RUN wget https://www.arangodb.com/repositories/arangodb2/xUbuntu_14.04/Release.key
RUN apt-key add - < Release.key
 RUN echo 'deb https://www.arangodb.com/repositories/arangodb2/xUbuntu_14.04/ /' >> /etc/apt/sources.list.d/arangodb.list
RUN apt-get -y update
RUN apt-get -y install arangodb=2.5.1
RUN /etc/init.d/arangodb start

CMD ["bash"]

Dockerfileの詳しい部分は他の方の記事にお任せします(;・∀・)

このDockerfileをDroneが動いている場所に持って行き、Dockerfileをおいてあるディレクトリ内で


$ docker build -t attsu/clojure_arango:1.0 .

と入力します。
docker buildコマンドは「docker build [ -t {イメージ名} [ :{タグ名} ] ] {Dockerfileのあるディレクトリ}」となっているので「attsu/clojure_arango:1.0」の部分は好きなもので大丈夫です。
ではちゃんと作成できているか確認します。


$ docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
attsu/clojure_arango        1.0                 236d17f6c9b5        6 weeks ago         1.003 GB

で・き・た!これで準備完了です( ・ω・)

次にBituBucketにリポジトリを作成して、Droneの画面を開いてください。
この時点だとDashboardには何も表示されいませんので「Browse All」をクリック。

1

次に検索で作成したリポジトリ名で探します。今回は「DroneFirstTest」という名前で作成しました。

2

表示が出たら右側のラジオボタンをクリックします。しばらく待つと以下の様な画面になるので「ACTIVATE NOW」をクリック。

3

こちらが終わるとDroneさんが「コミットしてこいよ」と言わんばかりに待機状態になります。

4

はい、これでDrone側も準備完了です!

最後にBitBuckerへソースをコミットする前に.drone.ymlを記載します。
プロジェクトにこの.drone.ymlファイルがあるとDroneがそのファイル内のコマンドに従って動いてくれます。


image: attsu/clojure_arango:1.0
script:
  - /etc/init.d/arangodb start
  - lein test

まずimageに先ほど作成したイメージ名を、scriptでは実際にそのコンテナ内で実行するコマンドを記載しています。ArangoDBを起動させて、テストを実行するという簡単なものですが(^^ゞ
scriptの他に通知やディプロイの設定などもこちらに書きます。詳しい.drone.ymlの書き方についてはこちら

ではこの.drone.ymlをプロジェクトのルート直下に保存してコミットです!40秒でコミットしな!

コミットが終わったらDroneの画面を見てみましょう。

5

おやおや、下に何か出ていますね〜出ているリンクをクリックしてみましょう。

7

おお!動いている!!テストしている!!!なんて便利なんだ!!!!

テストが終わると以下の様な画面になります。

8

SUGEEEEEEEEEEEEEEE!!

はい、長々とお付き合いいただいてありがとうございましたm(_ _)m
うーん、自分では端折っているつもりでも長くなってしまいますね……精進します。


Leave A Comment