前回のKituraの記事で課題としていた、ファイル監視で自動的にビルド&再起動というのが実現できたのでメモ。
Docker環境について
今回もDocker関連なのでhttps://github.com/d-abe/dockersへあげています。
Dockerfile
Dockerfileはこちら。
FROM ubuntu:wily MAINTAINER d-abeENV PATH /opt/swift/usr/bin:$PATH ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH WORKDIR /root RUN apt-get update \ && apt-get install -q -y nodejs npm git wget clang dh-autoreconf pkg-config libkqueue0 libkqueue-dev libbsd-dev libblocksruntime-dev libicu-dev build-essential libhttp-parser-dev libcurl4-openssl-dev libhiredis-dev \ && rm -rf /var/lib/apt/lists/* \ && ln -s `which nodejs` /usr/local/bin/node \ && wget https://swift.org/builds/development/ubuntu1510/swift-DEVELOPMENT-SNAPSHOT-2016-02-08-a/swift-DEVELOPMENT-SNAPSHOT-2016-02-08-a-ubuntu15.10.tar.gz \ && tar zxf swift-DEVELOPMENT-SNAPSHOT-2016-02-08-a-ubuntu15.10.tar.gz \ && mkdir -p /opt/swift \ && mv swift-DEVELOPMENT-SNAPSHOT-2016-02-08-a-ubuntu15.10/usr/ /opt/swift/ \ && git clone https://github.com/apple/swift-corelibs-libdispatch.git \ && cd swift-corelibs-libdispatch \ && git submodule init && git submodule update \ && sh ./autogen.sh \ && ./configure --with-swift-toolchain=/opt/swift/usr --prefix=/opt/swift/usr \ && make \ && make install \ && cd .. \ && wget http://ftp.exim.org/pub/pcre/pcre2-10.20.tar.gz \ && tar zxf pcre2-10.20.tar.gz \ && cd pcre2-10.20 \ && ./configure \ && make \ && make install \ && npm install -g gulp \ && mkdir /work WORKDIR /work COPY gulpfile.js /work/gulpfile.js COPY build.sh /work/build.sh COPY Makefile /work/Makefile RUN npm install gulp gulp-process \ && chmod +x /work/build.sh WORKDIR /src COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
前回紹介したものに加え、task runnerとして利用するgulp関連をインストールしています。
また、Kitura 0.3.0がLinuxでビルドが通らなくて、調べたところKitura公式のDockerfileが上がっていました。その中身を見るとlibdispatcherのリポジトリが異なっていてmodulemapのコピー処理もなくなっていたので、その辺りを変更しています。
シェルスクリプトなど
entrypoint.shも変更しました。
#!/bin/bash set -eu if [ -z "$PROJECT_NAME" ]; then echo >&2 'PROJECT_NAME is not specified!' exit 1 fi ln -s $(pwd)/Sources /work/Sources ln -s $(pwd)/Tests /work/Tests ln -s $(pwd)/Package.swift /work/Package.swift cd /work set +e swift build set -e make gulp watch
ローカルファイルが変更された時に反映されるように、コピーではなくシンボリックリンクを作っています。
そのため、Sources,Tests,Package.swift以外のファイルが/workに入らないので、この辺り必要なら変更しなければいけません。
最後に、gulp watchを動かしています。
gulpfile.jsはどうなっているかというと
var project = process.env.PROJECT_NAME; var gulp = require('gulp'); var gulpProcess = require('gulp-process'); var exec = require('child_process').exec; gulp.task('build', function(cb) { exec('./build.sh', function(err,stdout,stderr) { gulpProcess.restart('kitura'); cb(err); }); }); gulp.task('watch', function(){ gulpProcess.start('kitura','.build/debug/'+project); gulp.watch(['Sources/*.swift','Sources/**/*.swift'],['build']); });
swiftファイルを監視して、変更があったら build.sh を実行し、その後.build内の実行ファイルを再起動させています。
Sources以下のswiftファイルしか見ていないので、Package.swiftも監視した方がいいかも?
build.shは、swift buildとmakeを実行しているだけです。
#!/bin/bash swift build make
Docker Compose
最後に、これらを実行させるためのdocker-compose.yamlを書いておきます。
kitura: build: ../../swift-kitura volumes: - "${ROOT_DIR}/src/kitura:/src" ports: - "8090:8090" working_dir: /src environment: PROJECT_NAME: kitura
実行してみる
実際に、実行してみます。
$ docker-compose up (ずらずらと表示される) : kitura_1 | Compiling Swift Module 'kitura' (1 sources) kitura_1 | Linking Executable: .build/debug/kitura kitura_1 | make[1]: Leaving directory '/work' kitura_1 | [07:18:19] Using gulpfile /work/gulpfile.js kitura_1 | [07:18:19] Starting 'watch'... kitura_1 | [07:18:19] Finished 'watch' after 8.65 ms
このように、ビルドが完了後 gulp watch がちゃんと実行されました。
確認してみると・・・
$ docker-machine ip default 192.168.171.148 $ curl -l http://192.168.171.148:8090 Hello, World!
このように動作が確認できました。
この状態で、main.swiftを書き換えてみます。
import KituraRouter import KituraNet import KituraSys let router = Router() router.get("/") { request, response, next in response.status(HttpStatusCode.OK).send("Hello, Kitura!") next() } let server = HttpServer.listen(8090, delegate: router) Server.run()
Hello, Kitura!にしてみました。
すると、先ほどのログが表示されているターミナルで、
kitura_1 | [07:45:12] Starting 'build'... kitura_1 | [07:45:17] Finished 'build' after 4.56 s
と新たにログが出力されると思います。
ここで、再度動作確認します。
$ curl -l http://192.168.171.148:8090 Hello, Kitura!
無事、反映されました!!
次回はDB周りの処理をやってみたいです。