質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Circle CI

Circle CIは、クラウド上に簡単にCI環境を構築できるWebサービスです。GitHubと連携させ、CIしたいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

Q&A

0回答

5152閲覧

CircleCI+Docker+Herokuでのデプロイがうまくいかない

mrsekut

総合スコア6

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Circle CI

Circle CIは、クラウド上に簡単にCI環境を構築できるWebサービスです。GitHubと連携させ、CIしたいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

0グッド

4クリップ

投稿2018/07/09 07:24

編集2022/01/12 10:55

初めてCI環境を作っています。
プログラミング歴は約2年ですが、バックエンドの知識はあまりなく、Dockerは使ったことはありますが、コマンドのオプションなどはしっかり理解していないレベルです。

概要

CircleCI + Docker + Herokuの組み合わせで「githubにpushされたら自動でHerokuにリリースする」という環境を作ろうとしているのですがうまくいきません。
CircleCIの設定ファイルを作り、githubにpushするとちゃんと実行され、
docker pushまで正常に終わるのですが、Heroku側では何も更新されません。
エラーも表示されないので、困っています。

以下でもう少し詳しく書きます。

したいこと

以下のように実行されるCI環境を作りたいと思っています。

前提として、flaskを実行するためのdockerfileがプロジェクト内に用意されています。

  1. githubのdevelopブランチにpush
  2. circleCIがそれを検知し、テストコードを実行
  3. テストに通れば、circleCI上で、checkout master -> merge -> push
  4. その後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コマンドは今までは、pushreleaseも包含していたけど、それを分離したよとあります。

ですので**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で作ったサイトをウェブ上で閲覧できます。

ながながと長文失礼しました。
どなたかがご存知の方がいらっしゃればご教示願えませんでしょうか。
よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問