CircleCI × Rails 응용 프로그램에서 docker-compose 가져오기

Rails 애플리케이션에서 CircleCIdocker-compose를 가져왔습니다.
다음 기록도 함께 남긴다.
circleci/config.yml
version: 2
jobs:
  build:
    docker:
      - image: circleci/ruby:2.6.8-node-browsers
        environment:
          - BUNDLER_VERSION: 2.2.33
          - RAILS_ENV: test
          - POSTGRES_USER: <%= ENV['POSTGRES_USER'] %>
      - image: circleci/postgres
        environment:
          - POSTGRES_USER: <%= ENV['POSTGRES_USER'] %>
          - POSTGRES_PASSWORD: <%= ENV['POSTGRES_PASSWORD'] %>
          - POSTGRES_DB: port_test
    environment:
      - PGHOST: 127.0.0.1
    working_directory: ~/port
    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}
            - v1-dependencies-
      - run:
          name: install dependencies
          command: |
            gem install bundler -v 2.2.33
            bundle install --jobs=4 --retry=3 --path vendor/bundle
      - save_cache:
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}
          paths:
            - ./vendor/bundle
      - run:
          name: Wait DB start-up
          command: dockerize -wait tcp://127.0.0.1:5432 -timeout 120s
      - run:
          name: Setup database
          command: |
            sudo ln -s /usr/lib/x86_64-linux-gnu/libffi.so.7.1.0 /usr/lib/x86_64-linux-gnu/libffi.so.6
            bundle exec rails db:create
            bundle exec rails db:migrate
            bundle exec rails webpacker:install
      - run:
          name: Run rspec
          command: bundle exec rspec
      - run:
          name: Run rubocop
          command: bundle exec rubocop

Dockerfile
FROM ruby:2.6.8
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

WORKDIR /port
COPY Gemfile /port/Gemfile
COPY Gemfile.lock /port/Gemfile.lock
RUN gem install -v 2.2.33 bundler 
RUN bundle install
RUN gem install -v 6.1.4.1 rails
COPY . /port

# コンテナー起動時に毎回実行されるスクリプトを追加
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# イメージ実行時に起動させる主プロセスを設定
CMD ["rails", "server", "-b", "0.0.0.0"]
docker-compose.yml
version: "3"
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: <%= ENV['POSTGRES_USER'] %>
      POSTGRES_PASSWORD: <%= ENV['POSTGRES_PASSWORD'] %>
    ports:
      - '5432:5432'

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/port
    ports:
      - "3000:3000"
    environment:
      DATABASE_PORT: 5432
      DATABASE_USER: <%= ENV['POSTGRES_USER'] %>
      DATABASE_PASSWORD: <%= ENV['POSTGRES_PASSWORD'] %>
    depends_on:
      - db

database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  host: db
  timeout: 5000
  username: <%= ENV['POSTGRES_USER'] %>
  password: <%= ENV['POSTGRES_PASSWORD'] %>

development:
  <<: *default
  database: port_development

test:
  <<: *default
  database: port_test
  host: <%= ENV['PGHOST'] || 'db' %>

production:
  <<: *default
  database: port_production

착오를 당하다
1. Please upgrade Node.js 및 오류 표시
Webpacker에 필요한 노드입니다.js버전은 10.17.0 이상이고 이에 대응하는 것은 당시의 Node이다.js의 버전은 10.16.3입니다.

→루비의 버전을 2.6.3에서 2.6.8로 올리면 해결된다.
gm의 의존관계도 있기 때문에 잘 안 하는 게 좋을 것 같고 이번에는 상승폭이 작아서 이 방법으로 해결했습니다.
2. 로컬 및 CircleaCI 데이터베이스의 호스트 이름이 다름
RSpec과 Rubbocop 등의 테스트를 수행할 때 로컬에서 연결해야 하는 호스트 이름db, CircleaCI에서 각각 연결해야 하는 호스트 이름localhost이 필요합니다.그래서
database.yml(부분 발췌문)
test:
  <<: *default
  database: port_test
  host: <%= ENV['PGHOST'] || 'db' %>
circleci/config.yml(부분 발췌문)
environment:
      - PGHOST: 127.0.0.1
따라서 PGHOST가 있으면 참조하시고 없으시면 연결db하십시오.
참고 자료
CircleaCI를 로컬에서 사용하려면
혹시 Push 디버깅은 없죠?자주 사용하는 Circleci 디버그 방법
[CircleaCI] Rails 응용 프로그램 가져오기(파일 설정 정보)
[Rails] Giithub과CircleaCI가 연합하여commiit에서 rspec와rubocop을 시작합니다
Rails+CircleaCI에서 Rspec을 실행하면 DB 오류가 발생합니다.
docker 및 circleaci를 사용하여 Rspec 테스트와 Please upgrade Node를 수행합니다.js 및 오류 표시

좋은 웹페이지 즐겨찾기