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というフレームワーク.
で,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って書いてあるところをクリックしてどんどんいけば, bluemix
と cf-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で動かした方が早い.今日は力尽きたので,また明日にでも.