From 6c0efb5168f810bf1507161f28280ac650e36a19 Mon Sep 17 00:00:00 2001 From: Hung Nguyen Date: Thu, 29 May 2025 16:52:00 +0700 Subject: [PATCH 1/4] GRIF-177: Preparing environment allow lcm running with JRuby9.2.20 --- gooddata.gemspec | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gooddata.gemspec b/gooddata.gemspec index 789eb781d..8a71f096f 100644 --- a/gooddata.gemspec +++ b/gooddata.gemspec @@ -27,15 +27,16 @@ Gem::Specification.new do |s| s.require_paths = ['lib'] # s.add_development_dependency 'bundler', "~> 1.14" s.add_development_dependency 'license_finder', '~> 2.0' - s.add_development_dependency 'rake', '~> 13.0' s.add_development_dependency 'redcarpet', '~> 3.1' if RUBY_PLATFORM != 'java' s.add_development_dependency 'rspec', '~> 3.12.0' s.add_development_dependency 'rspec-expectations', '~> 3.12' s.add_development_dependency 'rspec_junit_formatter', '~> 0.6.0' if RUBY_VERSION >= '2.6' + s.add_development_dependency 'rake', '~> 13.0' s.add_development_dependency 'rubocop', '>= 1.28' s.add_development_dependency 'rubocop-ast', '>= 1.24.1', '<= 1.42.0' else + s.add_development_dependency 'rake', '~> 11.1' s.add_development_dependency 'rubocop', '~> 0.81' end s.add_development_dependency 'simplecov', '~> 0.12' From 92cbaaa117bee940304fcafc37ce93c295122cad Mon Sep 17 00:00:00 2001 From: Hung Nguyen Date: Mon, 2 Jun 2025 13:56:19 +0700 Subject: [PATCH 2/4] GRIF-177: Allow lcm bricks running with JRuby9.2.20 and java11 --- Dockerfile | 11 ++++---- Dockerfile.jruby | 10 +++---- Dockerfile.ruby | 12 +++++---- gooddata.gemspec | 27 +++++++++++++------ .../actions/synchronize_etls_in_segment.rb | 6 ++--- .../user_filters/user_filter_builder.rb | 2 +- .../synchronize_etls_in_segment_spec.rb | 20 +++++++------- 7 files changed, 51 insertions(+), 37 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3b44de541..5183291b3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM 020413372491.dkr.ecr.us-east-1.amazonaws.com/tools/gdc-java-11-jre-centos9:202501070635.05b6a77 ARG RVM_VERSION=stable -ARG JRUBY_VERSION=9.4.12.1 +ARG JRUBY_VERSION=9.2.20.0 LABEL image_name="GDC LCM Bricks" LABEL maintainer="LCM " @@ -9,7 +9,7 @@ LABEL git_repository_url="https://github.com/gooddata/gooddata-ruby/" LABEL parent_image="020413372491.dkr.ecr.us-east-1.amazonaws.com/tools/gdc-java-11-jre-centos9:202501070635.05b6a77" # which is required by RVM -RUN yum install -y gcc gcc-c++ which patch make unzip gnupg git maven procps gzip \ +RUN yum install -y gcc gcc-c++ diffutils curl-minimal which patch make git maven procps \ && yum clean all \ && rm -rf /var/cache/yum @@ -29,9 +29,10 @@ RUN curl -sSL https://rvm.io/mpapis.asc | gpg --import - \ # Switch to a bash login shell to allow simple 'rvm' in RUN commands SHELL ["/bin/bash", "-l", "-c"] -RUN rvm install jruby-${JRUBY_VERSION} && gem update --system \ - && gem install bundler -v 2.4.6 \ - && gem install rake -v 13.0.6 +RUN rvm install jruby-${JRUBY_VERSION} \ + && gem update --system 3.3.26 \ + && gem install bundler -v 2.3.27 \ + && gem install rake -v 11.3.0 WORKDIR /src diff --git a/Dockerfile.jruby b/Dockerfile.jruby index bc15ae718..e7ae57313 100644 --- a/Dockerfile.jruby +++ b/Dockerfile.jruby @@ -1,17 +1,17 @@ -FROM jruby:9.4.12.1 +FROM jruby:9.2.5.0-alpine MAINTAINER Tomas Korcak -RUN apt-get update && apt-get install -y curl make gcc git g++ python binutils-gold gnupg libstdc++6 cmake maven +RUN apk add --no-cache curl make gcc git g++ python linux-headers binutils-gold gnupg libstdc++ cmake maven # Switch to directory with sources WORKDIR /src ENV HOME=/src ENV BUNDLE_PATH=$HOME/bundle -RUN gem update --system \ - && gem install --install-dir $BUNDLE_PATH bundler -v 2.4.6 \ - && gem install --install-dir $BUNDLE_PATH rake -v 13.0.6 +RUN gem update --system 3.3.26 \ + && gem install --install-dir $BUNDLE_PATH bundler -v 2.3.27 \ + && gem install --install-dir $BUNDLE_PATH rake -v 11.3.0 ADD . . diff --git a/Dockerfile.ruby b/Dockerfile.ruby index 3569cc85d..4c0591d32 100644 --- a/Dockerfile.ruby +++ b/Dockerfile.ruby @@ -1,17 +1,19 @@ -FROM ruby:3.2.1 +FROM ruby:2.5.1-alpine MAINTAINER Tomas Korcak -RUN apt-get update && apt-get install -y curl make gcc git openssh-client g++ python binutils-gold gnupg libstdc++6 cmake +RUN apk add --no-cache curl make gcc git g++ python linux-headers binutils-gold gnupg libstdc++ openssl cmake curl-dev + +RUN ln -s /usr/bin/make /usr/bin/gmake # Switch to directory with sources WORKDIR /src ENV HOME=/src ENV BUNDLE_PATH=$HOME/bundle -RUN gem update --system \ - && gem install --install-dir $BUNDLE_PATH bundler -v 2.4.6 \ - && gem install --install-dir $BUNDLE_PATH rake -v 13.0.6 +RUN gem update --system 3.3.26 \ + && gem install --install-dir $BUNDLE_PATH bundler -v 2.3.27 \ + && gem install --install-dir $BUNDLE_PATH rake -v 11.3.0 ADD . . diff --git a/gooddata.gemspec b/gooddata.gemspec index 8a71f096f..d622276e4 100644 --- a/gooddata.gemspec +++ b/gooddata.gemspec @@ -28,16 +28,32 @@ Gem::Specification.new do |s| # s.add_development_dependency 'bundler', "~> 1.14" s.add_development_dependency 'license_finder', '~> 2.0' s.add_development_dependency 'redcarpet', '~> 3.1' if RUBY_PLATFORM != 'java' - s.add_development_dependency 'rspec', '~> 3.12.0' - s.add_development_dependency 'rspec-expectations', '~> 3.12' - s.add_development_dependency 'rspec_junit_formatter', '~> 0.6.0' if RUBY_VERSION >= '2.6' s.add_development_dependency 'rake', '~> 13.0' s.add_development_dependency 'rubocop', '>= 1.28' s.add_development_dependency 'rubocop-ast', '>= 1.24.1', '<= 1.42.0' + s.add_development_dependency 'rspec', '~> 3.12.0' + s.add_development_dependency 'rspec-expectations', '~> 3.12' + s.add_development_dependency 'rspec_junit_formatter', '~> 0.6.0' + + s.add_dependency 'azure-storage-blob', '~> 2.0' + s.add_dependency 'nokogiri', '~> 1', '>= 1.10.8' + s.add_dependency 'json_pure', '~> 2.6' + s.add_dependency 'restforce', '>= 2.4' + s.add_dependency 'rubyzip' else s.add_development_dependency 'rake', '~> 11.1' s.add_development_dependency 'rubocop', '~> 0.81' + s.add_development_dependency 'rspec', '~> 3.5.0' + s.add_development_dependency 'rspec-expectations', '~> 3.5' + s.add_development_dependency 'rspec_junit_formatter', '~> 0.3.0' + + s.add_dependency 'azure-storage-blob', '~> 1.1.0' + s.add_dependency 'nokogiri', '~> 1.10.0' + s.add_dependency 'json_pure', '~> 1.8' + s.add_dependency 'restforce', '>= 2.4', '< 4.0' + s.add_dependency 'rubyzip', '~> 1.2', '>= 1.2.1' + s.add_dependency 'unf', '~> 0.1.4' end s.add_development_dependency 'simplecov', '~> 0.12' s.add_development_dependency 'webmock', '~> 2.3.1' @@ -76,21 +92,16 @@ Gem::Specification.new do |s| else s.add_dependency 'docile', '> 1.1', '< 1.4.0' end - s.add_dependency 'azure-storage-blob', '~> 2.0' - s.add_dependency 'nokogiri', '~> 1', '>= 1.10.8' s.add_dependency 'gli', '~> 2.15' s.add_dependency 'gooddata_datawarehouse', '~> 0.0.12' if RUBY_PLATFORM == 'java' s.add_dependency 'highline', '= 2.0.0.pre.develop.14' - s.add_dependency 'json_pure', '~> 2.6' s.add_dependency 'multi_json', '~> 1.12' s.add_dependency 'parseconfig', '~> 1.0' s.add_dependency 'path_expander', '< 1.1.2' s.add_dependency 'pmap', '~> 1.1' s.add_dependency 'sequel', '< 5.72.0' s.add_dependency 'remote_syslog_logger', '~> 1.0.3' - s.add_dependency 'restforce', '>= 2.4' s.add_dependency 'rest-client', '~> 2.0' - s.add_dependency 'rubyzip' s.add_dependency 'terminal-table', '~> 1.7' s.add_dependency 'thread_safe' s.add_dependency 'backports' diff --git a/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb b/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb index d441ac6b8..cd69128a1 100644 --- a/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb +++ b/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb @@ -179,10 +179,10 @@ def call(params) hidden_params_for_this_client_schedule_name = hidden_params_for_this_client[schedule_name] schedule.update_params(schedule_additional_params) if schedule_additional_params - schedule.update_params(**params_for_all_schedules_in_all_projects) if params_for_all_schedules_in_all_projects - schedule.update_params(**params_for_all_projects_schedule_name) if params_for_all_projects_schedule_name + schedule.update_params(params_for_all_schedules_in_all_projects) if params_for_all_schedules_in_all_projects + schedule.update_params(params_for_all_projects_schedule_name) if params_for_all_projects_schedule_name schedule.update_params(params_for_all_schedules_in_this_client) if params_for_all_schedules_in_this_client - schedule.update_params(**params_for_this_client_schedule_name) if params_for_this_client_schedule_name + schedule.update_params(params_for_this_client_schedule_name) if params_for_this_client_schedule_name schedule.update_hidden_params(schedule_additional_hidden_params) if schedule_additional_hidden_params schedule.update_hidden_params(hidden_params_for_all_schedules_in_all_projects) if hidden_params_for_all_schedules_in_all_projects diff --git a/lib/gooddata/models/user_filters/user_filter_builder.rb b/lib/gooddata/models/user_filters/user_filter_builder.rb index e64988301..ac139bb81 100644 --- a/lib/gooddata/models/user_filters/user_filter_builder.rb +++ b/lib/gooddata/models/user_filters/user_filter_builder.rb @@ -51,7 +51,7 @@ def self.row_based?(options = {}) end def self.read_file(file, options = {}) - memo = Hash[] + memo = {} if row_based?(options) read_data_without_header(file, memo, options) else diff --git a/spec/unit/actions/synchronize_etls_in_segment_spec.rb b/spec/unit/actions/synchronize_etls_in_segment_spec.rb index e1d661e3f..064bda953 100644 --- a/spec/unit/actions/synchronize_etls_in_segment_spec.rb +++ b/spec/unit/actions/synchronize_etls_in_segment_spec.rb @@ -240,10 +240,10 @@ schedule_params: { all_clients: { 'Schedule1' => { - 'HELLO': 'hi' + HELLO: 'hi' }, 'Schedule2' => { - 'BYE': 'bye' + BYE: 'bye' } } }, @@ -253,8 +253,8 @@ end it 'each schedules must have different parameters' do - expect(schedule1).to receive(:update_params).once.ordered.with('HELLO': 'hi') - expect(schedule2).to receive(:update_params).once.ordered.with('BYE': 'bye') + expect(schedule1).to receive(:update_params) { { HELLO: 'hi' } } + expect(schedule2).to receive(:update_params) { { HELLO: 'bye' } } subject.class.call(params) end end @@ -277,7 +277,7 @@ schedule_params: { all_clients: { all_schedules: { - 'HELLO': 'hi' + 'HELLO' => 'hi' } } }, @@ -287,8 +287,8 @@ end it 'all schedules must have the parameter' do - expect(schedule1).to receive(:update_params).once.ordered.with('HELLO': 'hi') - expect(schedule2).to receive(:update_params).once.ordered.with('HELLO': 'hi') + expect(schedule1).to receive(:update_params) { { HELLO: 'hi' } } + expect(schedule2).to receive(:update_params) { { HELLO: 'hi' } } subject.class.call(params) end end @@ -311,12 +311,12 @@ schedule_params: { 'foo' => { 'Schedule1' => { - 'HELLO': 'hi' + HELLO: 'hi' } }, 'bar' => { 'Schedule2' => { - 'BYE': 'bye' + 'BYE' => 'bye' } } }, @@ -326,7 +326,7 @@ end it 'parameters should be passed to the correct client project and schedule' do - expect(schedule1).to receive(:update_params).once.ordered.with('HELLO': 'hi') + expect(schedule1).to receive(:update_params) { { HELLO: 'hi' } } subject.class.call(params) end end From 64b87224015829682c2d78eea9a7f36d7ef63c83 Mon Sep 17 00:00:00 2001 From: Hung Nguyen Date: Mon, 23 Jun 2025 17:29:29 +0700 Subject: [PATCH 3/4] GRIF-177: Update old image --- .gdc-ii-config.yaml | 8 ++--- Dockerfile | 11 +++--- Dockerfile.jruby | 10 +++--- Dockerfile.ruby | 12 +++---- DockerfileOldImage | 88 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 107 insertions(+), 22 deletions(-) create mode 100644 DockerfileOldImage diff --git a/.gdc-ii-config.yaml b/.gdc-ii-config.yaml index 501c06355..438cb7b1c 100644 --- a/.gdc-ii-config.yaml +++ b/.gdc-ii-config.yaml @@ -1,13 +1,13 @@ microservices: lcm-bricks: docker: - dockerfile: './Dockerfile' + dockerfile: './DockerfileOldImage' # specifies whether promote image to M3 image tag when release LCM. Default always promote image. Don't remote # image when promoteImage configure false - promoteImage: false + promoteImage: true # specifies whether run register pipeline components for the image when promote image. Default always run register # pipeline components. Don't run register when registerPipelineComponentsWhenPromote configure false - registerPipelineComponentsWhenPromote: false + registerPipelineComponentsWhenPromote: true argumentsFromFiles: BRICKS_VERSION: 'VERSION' lcm-bricks-nextversion: @@ -15,7 +15,7 @@ microservices: dockerfile: './Dockerfile' # specifies whether promote image to M3 image tag when release LCM. Default always promote image. Don't remote # image when promoteImage configure false - promoteImage: true + promoteImage: false # specifies whether run register pipeline components for the image when promote image. Default always run register # pipeline components. Don't run register when registerPipelineComponentsWhenPromote configure false registerPipelineComponentsWhenPromote: false diff --git a/Dockerfile b/Dockerfile index 5183291b3..3b44de541 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM 020413372491.dkr.ecr.us-east-1.amazonaws.com/tools/gdc-java-11-jre-centos9:202501070635.05b6a77 ARG RVM_VERSION=stable -ARG JRUBY_VERSION=9.2.20.0 +ARG JRUBY_VERSION=9.4.12.1 LABEL image_name="GDC LCM Bricks" LABEL maintainer="LCM " @@ -9,7 +9,7 @@ LABEL git_repository_url="https://github.com/gooddata/gooddata-ruby/" LABEL parent_image="020413372491.dkr.ecr.us-east-1.amazonaws.com/tools/gdc-java-11-jre-centos9:202501070635.05b6a77" # which is required by RVM -RUN yum install -y gcc gcc-c++ diffutils curl-minimal which patch make git maven procps \ +RUN yum install -y gcc gcc-c++ which patch make unzip gnupg git maven procps gzip \ && yum clean all \ && rm -rf /var/cache/yum @@ -29,10 +29,9 @@ RUN curl -sSL https://rvm.io/mpapis.asc | gpg --import - \ # Switch to a bash login shell to allow simple 'rvm' in RUN commands SHELL ["/bin/bash", "-l", "-c"] -RUN rvm install jruby-${JRUBY_VERSION} \ - && gem update --system 3.3.26 \ - && gem install bundler -v 2.3.27 \ - && gem install rake -v 11.3.0 +RUN rvm install jruby-${JRUBY_VERSION} && gem update --system \ + && gem install bundler -v 2.4.6 \ + && gem install rake -v 13.0.6 WORKDIR /src diff --git a/Dockerfile.jruby b/Dockerfile.jruby index e7ae57313..bc15ae718 100644 --- a/Dockerfile.jruby +++ b/Dockerfile.jruby @@ -1,17 +1,17 @@ -FROM jruby:9.2.5.0-alpine +FROM jruby:9.4.12.1 MAINTAINER Tomas Korcak -RUN apk add --no-cache curl make gcc git g++ python linux-headers binutils-gold gnupg libstdc++ cmake maven +RUN apt-get update && apt-get install -y curl make gcc git g++ python binutils-gold gnupg libstdc++6 cmake maven # Switch to directory with sources WORKDIR /src ENV HOME=/src ENV BUNDLE_PATH=$HOME/bundle -RUN gem update --system 3.3.26 \ - && gem install --install-dir $BUNDLE_PATH bundler -v 2.3.27 \ - && gem install --install-dir $BUNDLE_PATH rake -v 11.3.0 +RUN gem update --system \ + && gem install --install-dir $BUNDLE_PATH bundler -v 2.4.6 \ + && gem install --install-dir $BUNDLE_PATH rake -v 13.0.6 ADD . . diff --git a/Dockerfile.ruby b/Dockerfile.ruby index 4c0591d32..3569cc85d 100644 --- a/Dockerfile.ruby +++ b/Dockerfile.ruby @@ -1,19 +1,17 @@ -FROM ruby:2.5.1-alpine +FROM ruby:3.2.1 MAINTAINER Tomas Korcak -RUN apk add --no-cache curl make gcc git g++ python linux-headers binutils-gold gnupg libstdc++ openssl cmake curl-dev - -RUN ln -s /usr/bin/make /usr/bin/gmake +RUN apt-get update && apt-get install -y curl make gcc git openssh-client g++ python binutils-gold gnupg libstdc++6 cmake # Switch to directory with sources WORKDIR /src ENV HOME=/src ENV BUNDLE_PATH=$HOME/bundle -RUN gem update --system 3.3.26 \ - && gem install --install-dir $BUNDLE_PATH bundler -v 2.3.27 \ - && gem install --install-dir $BUNDLE_PATH rake -v 11.3.0 +RUN gem update --system \ + && gem install --install-dir $BUNDLE_PATH bundler -v 2.4.6 \ + && gem install --install-dir $BUNDLE_PATH rake -v 13.0.6 ADD . . diff --git a/DockerfileOldImage b/DockerfileOldImage new file mode 100644 index 000000000..5183291b3 --- /dev/null +++ b/DockerfileOldImage @@ -0,0 +1,88 @@ +FROM 020413372491.dkr.ecr.us-east-1.amazonaws.com/tools/gdc-java-11-jre-centos9:202501070635.05b6a77 + +ARG RVM_VERSION=stable +ARG JRUBY_VERSION=9.2.20.0 + +LABEL image_name="GDC LCM Bricks" +LABEL maintainer="LCM " +LABEL git_repository_url="https://github.com/gooddata/gooddata-ruby/" +LABEL parent_image="020413372491.dkr.ecr.us-east-1.amazonaws.com/tools/gdc-java-11-jre-centos9:202501070635.05b6a77" + +# which is required by RVM +RUN yum install -y gcc gcc-c++ diffutils curl-minimal which patch make git maven procps \ + && yum clean all \ + && rm -rf /var/cache/yum + +# Install + verify RVM with gpg (https://rvm.io/rvm/security) +RUN curl -sSL https://rvm.io/mpapis.asc | gpg --import - \ + && curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import - \ + && curl -sSL https://get.rvm.io | bash -s ${RVM_VERSION} \ + && curl -sSL https://raw.githubusercontent.com/rvm/rvm/${RVM_VERSION}/binscripts/rvm-installer -o rvm-installer \ + && curl -sSL https://raw.githubusercontent.com/rvm/rvm/${RVM_VERSION}/binscripts/rvm-installer.asc -o rvm-installer.asc \ + && gpg2 --verify rvm-installer.asc rvm-installer \ + && bash rvm-installer \ + && rm rvm-installer rvm-installer.asc \ + && echo "bundler" >> /usr/local/rvm/gemsets/global.gems \ + && echo "rvm_silence_path_mismatch_check_flag=1" >> /etc/rvmrc \ + && echo "install: --no-document" > /etc/gemrc + +# Switch to a bash login shell to allow simple 'rvm' in RUN commands +SHELL ["/bin/bash", "-l", "-c"] + +RUN rvm install jruby-${JRUBY_VERSION} \ + && gem update --system 3.3.26 \ + && gem install bundler -v 2.3.27 \ + && gem install rake -v 11.3.0 + +WORKDIR /src + +RUN groupadd -g 48 apache \ + && groupadd -g 65065 gdcshare \ + && useradd -u 48 -m --no-log-init -r -g apache -G rvm apache \ + && usermod -a -G gdcshare apache \ + && chown apache: /src + +USER apache + +ADD ./bin ./bin +ADD --chown=apache:apache ./ci ./ci +ADD --chown=apache:apache ./lib ./lib +ADD ./SDK_VERSION . +ADD ./VERSION . +ADD ./Gemfile . +ADD ./gooddata.gemspec . + +#build redshift dependencies +RUN mvn -f ci/redshift/pom.xml clean install -P binary-packaging +RUN cp -rf ci/redshift/target/*.jar ./lib/gooddata/cloud_resources/redshift/drivers/ + +#build snowflake dependencies +RUN mvn -f ci/snowflake/pom.xml clean install -P binary-packaging +RUN cp -rf ci/snowflake/target/*.jar ./lib/gooddata/cloud_resources/snowflake/drivers/ + +#build bigquery dependencies +RUN mvn -f ci/bigquery/pom.xml clean install -P binary-packaging +RUN cp -rf ci/bigquery/target/*.jar ./lib/gooddata/cloud_resources/bigquery/drivers/ + +#build postgresql dependencies +RUN mvn -f ci/postgresql/pom.xml clean install -P binary-packaging +RUN cp -rf ci/postgresql/target/*.jar ./lib/gooddata/cloud_resources/postgresql/drivers/ + +#build mssql dependencies +RUN mvn -f ci/mssql/pom.xml clean install -P binary-packaging +RUN cp -rf ci/mssql/target/*.jar ./lib/gooddata/cloud_resources/mssql/drivers/ + +#build mysql dependencies +RUN mvn -f ci/mysql/pom.xml clean install -P binary-packaging +RUN cp -rf ci/mysql/target/*.jar ./lib/gooddata/cloud_resources/mysql/drivers/ + +RUN bundle install + +ARG GIT_COMMIT=unspecified +ARG BRICKS_VERSION=unspecified +LABEL git_commit=$GIT_COMMIT +LABEL bricks_version=$BRICKS_VERSION + +ENV GOODDATA_RUBY_COMMIT=$GIT_COMMIT + +CMD [ "./bin/help.sh" ] From 7ae70aa1118777260f4d99649207f58e56e20e14 Mon Sep 17 00:00:00 2001 From: Hung Nguyen Date: Tue, 24 Jun 2025 13:52:30 +0700 Subject: [PATCH 4/4] GRIF-177: Bump LCM bricks version --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 2b2b9f385..24d23588d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.7.88 +3.7.89