Upgrade rails to 7.2.2 so that we can proceed with the rails 8 upgrade afterwards # Changelog - `.circleci/config.yml` — align CI DB setup with GitHub Actions (`db:create` + `db:schema:load`) to avoid trigger-dependent prep steps. - `.rubocop.yml` — add `rubocop-rspec_rails` and disable new cops that don't match existing spec style. - `AGENTS.md` — document that specs should run without `.env` (rename temporarily when present). - `Gemfile` — upgrade to Rails 7.2, switch Azure storage gem, pin `commonmarker`, bump `sidekiq-cron`, add `rubocop-rspec_rails`, and relax some gem pins. - `Gemfile.lock` — dependency lockfile updates from the Rails 7.2 and gem changes. - `app/controllers/api/v1/accounts/integrations/linear_controller.rb` — stringify params before passing to the Linear service to keep key types stable. - `app/controllers/super_admin/instance_statuses_controller.rb` — use `MigrationContext` API for migration status in Rails 7.2. - `app/models/installation_config.rb` — add commentary on YAML serialization and future JSONB migration (no behavior change). - `app/models/integrations/hook.rb` — ensure hook type is set on create only and guard against missing app. - `app/models/user.rb` — update enum syntax for Rails 7.2 deprecation, serialize OTP backup codes with JSON, and use Ruby `alias`. - `app/services/crm/leadsquared/setup_service.rb` — stringify hook settings keys before merge to keep JSON shape consistent. - `app/services/macros/execution_service.rb` — remove macro-specific assignee activity workaround; rely on standard assignment handlers. - `config/application.rb` — load Rails 7.2 defaults. - `config/storage.yml` — update Azure Active Storage service name to `AzureBlob`. - `db/migrate/20230515051424_update_article_image_keys.rb` — use credentials `secret_key_base` with fallback to legacy secrets. - `docker/Dockerfile` — add `yaml-dev` and `pkgconf` packages for native extensions (Ruby 3.4 / psych). - `lib/seeders/reports/message_creator.rb` — add parentheses for clarity in range calculation. - `package.json` — pin Vite version and bump `vite-plugin-ruby`. - `pnpm-lock.yaml` — lockfile changes from JS dependency updates. - `spec/builders/v2/report_builder_spec.rb` — disable transactional fixtures; truncate tables per example via Rails `truncate_tables` so after_commit callbacks run with clean isolation; keep builder spec metadata minimal. - `spec/builders/v2/reports/label_summary_builder_spec.rb` — disable transactional fixtures + truncate tables via Rails `truncate_tables`; revert to real `resolved!`/`open!`/`resolved!` flow for multiple resolution events; align date range to `Time.zone` to avoid offset gaps; keep builder spec metadata minimal. - `spec/controllers/api/v1/accounts/macros_controller_spec.rb` — assert `assignee_id` instead of activity message to avoid transaction-timing flakes. - `spec/services/telegram/incoming_message_service_spec.rb` — reference the contact tied to the created conversation instead of `Contact.all.first` to avoid order-dependent failures when other specs leave data behind. - `spec/mailers/administrator_notifications/shared/smtp_config_shared.rb` — use `with_modified_env` instead of stubbing mailer internals. - `spec/services/account/sign_up_email_validation_service_spec.rb` — compare error `class.name` for parallel/reload-safe assertions.
155 lines
4.4 KiB
Docker
155 lines
4.4 KiB
Docker
# pre-build stage
|
|
FROM node:24-alpine as node
|
|
FROM ruby:3.4.4-alpine3.21 AS pre-builder
|
|
|
|
ARG NODE_VERSION="24.13.0"
|
|
ARG PNPM_VERSION="10.2.0"
|
|
ENV NODE_VERSION=${NODE_VERSION}
|
|
ENV PNPM_VERSION=${PNPM_VERSION}
|
|
|
|
# ARG default to production settings
|
|
# For development docker-compose file overrides ARGS
|
|
ARG BUNDLE_WITHOUT="development:test"
|
|
ENV BUNDLE_WITHOUT ${BUNDLE_WITHOUT}
|
|
ENV BUNDLER_VERSION=2.5.16
|
|
|
|
ARG RAILS_SERVE_STATIC_FILES=true
|
|
ENV RAILS_SERVE_STATIC_FILES ${RAILS_SERVE_STATIC_FILES}
|
|
|
|
ARG RAILS_ENV=production
|
|
ENV RAILS_ENV ${RAILS_ENV}
|
|
|
|
ARG NODE_OPTIONS="--max-old-space-size=4096 --openssl-legacy-provider"
|
|
ENV NODE_OPTIONS ${NODE_OPTIONS}
|
|
|
|
ENV BUNDLE_PATH="/gems"
|
|
|
|
RUN apk update && apk add --no-cache \
|
|
openssl \
|
|
tar \
|
|
build-base \
|
|
tzdata \
|
|
yaml-dev \
|
|
pkgconf \
|
|
postgresql-dev \
|
|
postgresql-client \
|
|
git \
|
|
curl \
|
|
xz \
|
|
&& mkdir -p /var/app \
|
|
&& gem install bundler -v "$BUNDLER_VERSION"
|
|
|
|
COPY --from=node /usr/local/bin/node /usr/local/bin/
|
|
COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules
|
|
RUN ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
|
|
&& ln -s /usr/local/lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx
|
|
|
|
RUN npm install -g pnpm@${PNPM_VERSION}
|
|
|
|
RUN echo 'export PNPM_HOME="/root/.local/share/pnpm"' >> /root/.shrc \
|
|
&& echo 'export PATH="$PNPM_HOME:$PATH"' >> /root/.shrc \
|
|
&& export PNPM_HOME="/root/.local/share/pnpm" \
|
|
&& export PATH="$PNPM_HOME:$PATH" \
|
|
&& pnpm --version
|
|
|
|
# Persist the environment variables in Docker
|
|
ENV PNPM_HOME="/root/.local/share/pnpm"
|
|
ENV PATH="$PNPM_HOME:$PATH"
|
|
|
|
WORKDIR /app
|
|
|
|
COPY Gemfile Gemfile.lock ./
|
|
|
|
# natively compile grpc and protobuf to support alpine musl (dialogflow-docker workflow)
|
|
# https://github.com/googleapis/google-cloud-ruby/issues/13306
|
|
# adding xz as nokogiri was failing to build libxml
|
|
# https://github.com/chatwoot/chatwoot/issues/4045
|
|
RUN apk update && apk add --no-cache build-base musl ruby-full ruby-dev gcc make musl-dev openssl openssl-dev g++ linux-headers xz vips
|
|
RUN bundle config set --local force_ruby_platform true
|
|
|
|
# Do not install development or test gems in production
|
|
RUN if [ "$RAILS_ENV" = "production" ]; then \
|
|
bundle config set without 'development test'; bundle install -j 4 -r 3; \
|
|
else bundle install -j 4 -r 3; \
|
|
fi
|
|
|
|
COPY package.json pnpm-lock.yaml ./
|
|
RUN pnpm i
|
|
|
|
COPY . /app
|
|
|
|
# creating a log directory so that image wont fail when RAILS_LOG_TO_STDOUT is false
|
|
# https://github.com/chatwoot/chatwoot/issues/701
|
|
RUN mkdir -p /app/log
|
|
|
|
# generate production assets if production environment
|
|
RUN if [ "$RAILS_ENV" = "production" ]; then \
|
|
SECRET_KEY_BASE=precompile_placeholder RAILS_LOG_TO_STDOUT=enabled bundle exec rake assets:precompile \
|
|
&& rm -rf spec node_modules tmp/cache; \
|
|
fi
|
|
|
|
# Generate .git_sha file with current commit hash
|
|
RUN git rev-parse HEAD > /app/.git_sha
|
|
|
|
# Remove unnecessary files
|
|
RUN rm -rf /gems/ruby/3.4.0/cache/*.gem \
|
|
&& find /gems/ruby/3.4.0/gems/ \( -name "*.c" -o -name "*.o" \) -delete \
|
|
&& rm -rf .git \
|
|
&& rm .gitignore
|
|
|
|
# final build stage
|
|
FROM ruby:3.4.4-alpine3.21
|
|
|
|
ARG NODE_VERSION="24.13.0"
|
|
ARG PNPM_VERSION="10.2.0"
|
|
ENV NODE_VERSION=${NODE_VERSION}
|
|
ENV PNPM_VERSION=${PNPM_VERSION}
|
|
|
|
ARG BUNDLE_WITHOUT="development:test"
|
|
ENV BUNDLE_WITHOUT ${BUNDLE_WITHOUT}
|
|
ENV BUNDLER_VERSION=2.5.16
|
|
|
|
ARG EXECJS_RUNTIME="Disabled"
|
|
ENV EXECJS_RUNTIME ${EXECJS_RUNTIME}
|
|
|
|
ARG RAILS_SERVE_STATIC_FILES=true
|
|
ENV RAILS_SERVE_STATIC_FILES ${RAILS_SERVE_STATIC_FILES}
|
|
|
|
ARG BUNDLE_FORCE_RUBY_PLATFORM=1
|
|
ENV BUNDLE_FORCE_RUBY_PLATFORM ${BUNDLE_FORCE_RUBY_PLATFORM}
|
|
|
|
ARG RAILS_ENV=production
|
|
ENV RAILS_ENV ${RAILS_ENV}
|
|
ENV BUNDLE_PATH="/gems"
|
|
|
|
RUN apk update && apk add --no-cache \
|
|
build-base \
|
|
openssl \
|
|
tzdata \
|
|
postgresql-client \
|
|
imagemagick \
|
|
git \
|
|
vips \
|
|
&& gem install bundler -v "$BUNDLER_VERSION"
|
|
|
|
COPY --from=node /usr/local/bin/node /usr/local/bin/
|
|
COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules
|
|
|
|
RUN if [ "$RAILS_ENV" != "production" ]; then \
|
|
apk add --no-cache curl \
|
|
&& ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
|
|
&& ln -s /usr/local/lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx \
|
|
&& npm install -g pnpm@${PNPM_VERSION} \
|
|
&& pnpm --version; \
|
|
fi
|
|
|
|
COPY --from=pre-builder /gems/ /gems/
|
|
COPY --from=pre-builder /app /app
|
|
|
|
# Copy .git_sha file from pre-builder stage
|
|
COPY --from=pre-builder /app/.git_sha /app/.git_sha
|
|
|
|
WORKDIR /app
|
|
|
|
EXPOSE 3000
|