Q&A
初めてCI環境を作っています。
プログラミング歴は約2年ですが、バックエンドの知識はあまりなく、Dockerは使ったことはありますが、コマンドのオプションなどはしっかり理解していないレベルです。
概要
CircleCI + Docker + Herokuの組み合わせで「githubにpushされたら自動でHerokuにリリースする」という環境を作ろうとしているのですがうまくいきません。
CircleCIの設定ファイルを作り、githubにpushするとちゃんと実行され、
docker push
まで正常に終わるのですが、Heroku側では何も更新されません。
エラーも表示されないので、困っています。
以下でもう少し詳しく書きます。
したいこと
以下のように実行されるCI環境を作りたいと思っています。
前提として、flaskを実行するためのdockerfileがプロジェクト内に用意されています。
- githubのdevelopブランチにpush
- circleCIがそれを検知し、テストコードを実行
- テストに通れば、circleCI上で、checkout master -> merge -> push
- その後herokuにdeploy&release
手順3まではうまく行っています。
詰まっているところ
以下、私のプロジェクトの名前をhoge-project
とします。
このサイトなどを参考にし、CircleCI上からHerokuへDockerコンテナをpushする処理を書きました。
環境変数などもCircleCI上でちゃんと設定してあります。
config.yml
1 deploy: 2 machine: 3 image: 'circleci/classic:edge' 4 steps: 5 - checkout 6 - run: 7 name: pull and push 8 command: | 9 git pull origin develop 10 git checkout master 11 git merge develop 12 git push origin master 13 - run: 14 name: Heroku 15 command: | 16 docker login --username=$HEROKU_EMAIL --password=$HEROKU_API_KEY registry.heroku.com 17 docker build --rm=false -t registry.heroku.com/hoge-project/web . 18 docker push registry.heroku.com/hoge-project/web:latest
すると、CircleCI上では、ながながとDockerのビルド(?)のログが出て、
Step 21/21 : CMD flask run -h 0.0.0.0 -p $PORT ---> Running in fb7574e3d053 ---> 05c9c8397695 Successfully built 05c9c8397695 Successfully tagged registry.heroku.com/hoge-project/web:latest The push refers to a repository [registry.heroku.com/hoge-project/web]
のようにして、処理が終わります。
上に貼り付けたのは、約9000行あるログの最後の6行です。
このようにCircleCI上では正常に終了しているように見えるのですが、Herokuにいってみると、何も変わっていません。
エラーログもないので、対策を調べようがない状態です。
ちなみに、今はHeroku上でのGithubとの連携はしていません。
このサイトやこのサイトやこのサイトなどを参考にすると、
circleCI上でdocker push registry.heroku.com/hoge-project/web
のようなコマンドを実行すると、
pushもreleaseもしてくれるよという感じに読めますが、
2018/5/29に更新されたHerokuのドキュメントを見ると、docker push registry.heroku.com
コマンドは今までは、push
もrelease
も包含していたけど、それを分離したよとあります。
ですので**docker push
したあとに、何かしらrelease
するためのコマンドを実行しなければいけないと**思うのですが、
例えばcircleci上でheroku container:release web
というコマンドを実行させようとすると、
Login Succeeded ▸ container:release is not a heroku command. ▸ Perhaps you meant container:rm ▸ Run heroku help container for a list of available ▸ commands. Exited with code 127
と出て、ローカルでは動くcontainer:release
なんてコマンドはないと怒られます。
このページを見てみると以下のように書いてありました。
heroku container:release, which creates a Heroku-compatible slug and deploys it to Heroku, has been deprecated. For access to our container registry (available in private beta), please contact docker-feedback@heroku.com
container:release
コマンドはなくなったのでしょうか。
後述するようにローカルではこのコマンドは問題なく使えます。
なぜ、circleci上では使えないのでしょうか。
docker push
したあとになにかしらrelease
するための設定やコマンドの実行が必要だと思われるのですが、公式ドキュメントやブログなどを見てもそれに該当するものを見つけられなくて困っています。
追加で試してみたこと
このサイトなどを参考にして、heroku.ymlを追加してみました。
build: languages: - python packages: - libopencv-dev run: web: flask main.py
これで、先程のcircleciのconfig.ymlのdeployの部分に1行を加えて、以下のようにしました。
- run: name: Heroku command: | docker build --rm=false -t registry.heroku.com/hoge-project/web . docker login --username=$HEROKU_EMAIL --password=$(heroku auth:token) registry.heroku.com docker push registry.heroku.com/hoge-project/web git push https://heroku:$HEROKU_API_KEY@git.heroku.com/hoge-project.git master
これでcircleciを走らせてみると、エラーなく終了し、herokuを見てみるとactivityが更新されています。
view build log
を見ると以下のような一見成功したかのように見えるログが記録されています。
-----> Python app detected ! The latest version of Python 3 is python-3.6.6 (you are using python-3.6.5, which is unsupported). ! We recommend upgrading by specifying the latest version (python-3.6.6). Learn More: https://devcenter.heroku.com/articles/python-runtimes -----> Installing requirements with pip -----> Discovering process types Procfile declares types -> web -----> Compressing... Done: 43.5M -----> Launching... Released v28 https://hoge-project.herokuapp.com/ deployed to Heroku
しかし、open app
からアプリケーションのサイトを見てみると、Applicatoin error
と表示されています。
余談
ちなみにcircleCIを抜きにした「Docker + Heroku + Flask」でローカルで実行したときはうまく行っています。
$ heroku container:login
$ heroku container:push --app hoge-project web
$ heroku container:release web
これを実行するとうまくデプロイされ、Herokuのサイト上のActivityの欄でも更新されたことが見受けられます。
$ heroku open
でflaskで作ったサイトをウェブ上で閲覧できます。
ながながと長文失礼しました。
どなたかがご存知の方がいらっしゃればご教示願えませんでしょうか。
よろしくおねがいします。