人権真骨頂

とくがたかいことでゆうめい

Swiftでサーバーアプリケーションを作成してBluemixにデプロイしようと思ってた

する.

IBM BluemixにSwiftの'/' で200を返すだけの,アプリケーションをデプロイしようとしたので,その手順をメモ.ちなみに,開発環境はArchLinux(64-bit)です.

ちなみに,Swiftは先程初めて書き,var , let , print しか知らん.ノリで行くぞ.

環境構築

とりあえず,プロジェクトをイニシャライズしてくれるサブコマンドがあるらしいので実行する.

$ swift build --init
error: unable to invoke subcommand: /usr/bin/swift-build (No such file or directory)

おっ,動かん.

どうやら, swift-bin ではなく, swift-development-bin でないとパッケージマネージャが使えないっぽい.

$ yaourt -R swift-bin && yaourt -S swift-development-bin --noconfirm ## swift-binを消しておかないと衝突する

これで,再度実行してみる.

$ swift build --init
Creating executable package: sample-swift-server
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/main.swift
Creating Tests/

で, Package.swift に依存関係を記述しておく.今回利用したのは,Vaporというフレームワーク.

github.com

で,Sources/main.swift/Hello, World を返すだけの処理を記述しておく.

これで,コードは書き終わって,次はビルド.

ビルド

めちゃくちゃハマった.4時間くらい溶けた.非常にSwiftへのヘイトが溜っている.

どうやら swift build を実行すればいいらしいので,実行する.

$ swift build # project root
fatal: Needed a single revision
error:  Failed to invoke git command. Please try updating git

ん,なんだこれは.Gitのバージョンも2.8.2だし,これ以上上げようがない.Vapor側に問題あるのかと思って,Vaporを依存関係から消して再度ビルド.またしても同じエラーが出る.ArchLinuxが悪いのかと思い,Dockerでビルドすることにした.

$ docker pull swiftdocker/swift
$ docker run -i -t --name swift -v `pwd`:/home swiftdocker/swift:latest /bin/bash
(docker) $ cd /home && swift build
error: Git 2.0 or higher is required. Please update git and retry.

ベースイメージが,Ubuntu14.04なため,Gitが1系だった.Ubuntu15.10に書き直して再度ビルド.

$ docker build -t swift-ubuntu15
$ docker run -i -t --name swift -v `pwd`:/home swift-ubuntu15 /bin/bash
(docker) $ cd /home && swift build
fatal: Needed a single revision
error:  Failed to invoke git command. Please try updating git

意味不明.なんやねんこれ...devの最新だからダメなのかと思って,2つ前のリリースのやつもビルドして試してみたが同じだった.諦めようと思ったが,ふと Needed a single revision ってもしかして,このリポジトリのことを言ってるのか? と思い, git add . && git commit -m "init commit" みたいな感じでコミットして再度ビルドしてみる.

(docker) $ cd /home && swift build
...
Linking .build/debug/sample-swift-server

通った.マジかよ.コミットないとビルドできないとか,そんなのアリか? たぶん,そんなことなくて,何か誤解しているんだろうけど,これしか解決方法を見つけてない.

ちゃんと動くか試す.

$  .build/debug/sample-swift-server &
[1] 32266
[1462083877] [INFO] Server starting on 0.0.0.0:8080
$ http http://localhost:8080
[1462083885] [INFO] GET /
HTTP/1.1 200 OK
Content-Length: 12
Content-Type: text/plain
Date: Sun, 01 May 2016 06:24:45 GMT
Server: Vapor 0.5.3
Hello, World

動いた.....

ここまでで,かなり疲れた.

デプロイ

Swiftの実行環境がIBM Bluemixあるらしいので,せっかくだし試してみる.

Bluemix初めて使う(CloudFoundryも). だけど,Swiftって書いてあるところをクリックしてどんどんいけば, bluemixcf-cli をインストールしてデプロイしてねと言われるので従う.サンプルソースコードも提示されてそのなかに manifest.yml が入ってるのでそれをコピーしてきてプロジェクトルートに配置する.

$ cf push sample-swift-server

これで,終わったかと思いきや,まさかのコンパイルエラー.ローカルではビルドできているので,絶対にバージョンが古いだろうと思い,確認してみると,まさかの DEVELOPMENT-SNAPSHOT-2016-02-08-a . やる気あんのか.

Swiftのバージョンを指定してあげるために, プロジェクトルートに .swift-version を配置して以下のようにバージョンを書く.

DEVELOPMENT-SNAPSHOT-2016-03-24-a

そして,ビルドパックを指定して,もう一度デプロイ.

$ cf push sample-swift-server -b https://github.com/cloudfoundry-community/swift-buildpack

が,うまく行かない.この後も色々やってみたがコンパイルエラーに遭遇する.一体何が原因なんだ.... BlumixはSwiftすぐ動かせそうだから飛び付いたものの,絶対Dockerで動かした方が早い.今日は力尽きたので,また明日にでも.