概要
CircleCIでHerokuへのデプロイを実行した際、イメージが見つからないというエラーが発生した。
解決方法についてメモ。
エラー内容抜粋
#!/bin/bash -eo pipefail
heroku container:push web -a $HEROKU_APP_NAME
▸ No images to push
Exited with code exit status 1
CircleCI received exit code 1
環境
ruby 3.0.2
rails 6.1.4
rspec-rails 5.1.2
CircleCI 2.1
先に結論
デプロイ対象ディレクトリにDockerfileが含まれるようにする。
.circleci/config.yml
version: 2.1
orbs:
ruby: circleci/ruby@1.4.0
browser-tools: circleci/browser-tools@1.4.0
heroku: circleci/heroku@1.2.3
jobs:
build:
docker:
- image: cimg/ruby:3.0.2-browsers
environment:
APP_BUNDLER_VERSION: 2.1.4
working_directory: ~/my-app
steps:
- checkout:
path: ~/my-app
- ruby/install-deps
test:
docker:
- image: cimg/ruby:3.0.2-browsers
- image: circleci/mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: my_app_test
environment:
BUNDLE_JOBS: "3"
BUNDLE_RETRY: "3"
APP_DATABASE_HOST: "127.0.0.1"
RAILS_ENV: test
working_directory: ~/my-app
steps:
- browser-tools/install-chrome
- browser-tools/install-chromedriver
- checkout:
path: ~/my-app
- ruby/install-deps
- run:
name: Database setup
command: bundle exec rails db:migrate
- run:
name: yarn install
command: yarn install
- run:
name: run webpack
command: bundle exec bin/webpack
- run:
name: run rubocop
command: bundle exec rubocop
- run:
name: run rspec
command: bundle exec rspec spec/
deploy:
docker:
- image: cimg/ruby:3.0.2-browsers
steps:
# Dockerfileが含まれるディレクトリを指定
- checkout
- setup_remote_docker:
version: 19.03.13
- heroku/install
- run:
name: heroku login
command: heroku container:login
- run:
name: push docker image
command: heroku container:push web -a $HEROKU_APP_NAME
- run:
name: release docker image
command: heroku container:release web -a $HEROKU_APP_NAME
- run:
name: Database setup
command: heroku run bundle exec rails db:migrate RAILS_ENV=production -a $HEROKU_APP_NAME
workflows:
version: 2
build_test_and_deploy:
jobs:
- build
- test:
requires:
- build
- deploy:
requires:
- test
filters:
branches:
only: master
エラーの発生〜解決までに試したこと
最初の実行
.circleci/config.yml
# 関連箇所のみ抜粋
deploy:
docker:
- image: cimg/ruby:3.0.2-browsers
steps:
- checkout:
path: ~/my-app
- setup_remote_docker:
version: 19.03.13
CircleCIを使用しないで手動でデプロイ
ターミナル上でコマンドを実行
heroku container:login
heroku container:push web -a $HEROKU_APP_NAME
こちらでは問題なくデプロイできた。
config.ymlでのデプロイ設定と、手動でのデプロイの違いは何か?
→参照しているディレクトリ(にDockerfileがあるか無いか)。
最終
イメージをビルドして Container Registry にプッシュするには、ディレクトリに Dockerfile が含まれていることを確認し、次のように実行します。
heroku container:push
対象にDockerfileを含めるよう、checkoutの記述を変更(pathの指定を削除)
.circleci/config.yml
# 修正後
deploy:
docker:
- image: cimg/ruby:3.0.2-browsers
steps:
- checkout
- setup_remote_docker:
version: 19.03.13
これにより、最終的な.circleci/config.ymlはこちらの通りとなり、正常にデプロイできた。
最後に
より良い方法や間違い等ありましたらご指摘いただけますと幸いです!