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

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

ただいまの
回答率

90.35%

  • Heroku

    938questions

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

  • GitHub

    842questions

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

  • Docker

    803questions

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

  • Flask

    246questions

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

  • Circle CI

    41questions

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

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 678

mrsekut

score 2

初めて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上でちゃんと設定してあります。

  deploy:
    machine:
      image: 'circleci/classic:edge'
    steps:
      - checkout
      - run:
          name: pull and push
          command: |
            git pull origin develop
            git checkout master
            git merge develop
            git push origin master
      - run:
          name: Heroku
          command: |
            docker login --username=$HEROKU_EMAIL --password=$HEROKU_API_KEY registry.heroku.com
            docker build --rm=false -t registry.heroku.com/hoge-project/web .
            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で作ったサイトをウェブ上で閲覧できます。

 

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

同じタグがついた質問を見る

  • Heroku

    938questions

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

  • GitHub

    842questions

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

  • Docker

    803questions

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

  • Flask

    246questions

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

  • Circle CI

    41questions

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