Browse Source

Maintenance: Optimize GitLab cache usage.

Martin Gruner 2 years ago
parent
commit
188cbd2685

+ 10 - 2
.gitlab/ci/__includes__/cache.yml

@@ -16,13 +16,21 @@
     - .yarn/cache
 
 .cache:
-  read_only:
+  read_only_full:
     - <<: *cache_ruby
       policy: pull
     - <<: *cache_nodejs
       policy: pull
-  read_write:
+  read_only_ruby:
+    - <<: *cache_ruby
+      policy: pull
+  read_only_nodejs:
+    - <<: *cache_nodejs
+      policy: pull
+  # Only write cache once, and just read it in all other pipeline jobs.
+  read_write_ruby:
     - <<: *cache_ruby
       policy: pull-push
+  read_write_nodejs:
     - <<: *cache_nodejs
       policy: pull-push

+ 2 - 2
.gitlab/ci/__includes__/job_defaults.yml

@@ -4,7 +4,8 @@ default:
   tags:
     - docker
 
-  cache: !reference [.cache, read_only]
+  # Most jobs execute ruby commands, so take that as default.
+  cache: !reference [.cache, read_only_ruby]
 
   # Artifacts are stored for failed jobs
   artifacts:
@@ -21,7 +22,6 @@ default:
   before_script:
     - !reference [.scripts, source_rvm]
     - !reference [.scripts, bundle_install]
-    - !reference [.scripts, yarn_install]
     - !reference [.scripts, configure_environment]
 
   after_script:

+ 24 - 19
.gitlab/ci/lint.yml

@@ -3,13 +3,10 @@
   stage: lint
   extends:
     - .job_rules_default
-  before_script:
-    - !reference [.scripts, source_rvm]
 
 .template_lint_rails: &template_lint_rails
-  stage: lint
   extends:
-    - .job_rules_default
+    - .template_lint
     - .services_postgresql
   before_script:
     - !reference [.scripts, source_rvm]
@@ -21,16 +18,16 @@
 'lint: shellcheck':
   <<: *template_lint
   image: koalaman/shellcheck-alpine:stable
-  before_script:
-    - echo "Disable default before_script."
+  cache: []
+  before_script: []
   script:
     - shellcheck -S warning $(find . -name "*.sh" -o -name "functions" | egrep -v "/vendor|node_modules/")
     - shellcheck -S error script/init.d/*
-  after_script:
-    - echo "Disable default before_script."
+  after_script: []
 
-'lint: i18n, rails & security':
+'lint: i18n & rails':
   <<: *template_lint_rails
+  cache: !reference [.cache, read_only_full]
   artifacts:
     expire_in: 1 week
     paths:
@@ -44,16 +41,28 @@
     - bundle exec rails generate translation_catalog --check
     - echo "Brakeman security check..."
     - bundle exec brakeman -o /dev/stdout -o tmp/brakeman-report.html
+    - echo "Rails zeitwerk:check autoloader check..."
+    - bundle exec rails zeitwerk:check
+    - .gitlab/check_graphql_api_consistency.sh
+
+'lint: ruby & security':
+  <<: *template_lint
+  before_script:
+    - !reference [.scripts, source_rvm]
+    - !reference [.scripts, bundle_install]
+  script:
+    - echo "Rubocop check..."
+    - bundle exec .rubocop/validate_todos.rb
+    - bundle exec rubocop --parallel
     - echo "bundler-audit security check..."
     - gem install bundler-audit
     - bundle-audit update
     - bundle-audit --ignore CVE-2015-9284
-    - echo "Rails zeitwerk:check autoloader check..."
-    - bundle exec rails zeitwerk:check
-    - .gitlab/check_graphql_api_consistency.sh
 
-'lint: ruby, js & css':
+'lint: js & css':
   <<: *template_lint
+  cache: !reference [.cache, read_only_nodejs]
+  before_script: []
   script:
     - echo "Coffeelint check..."
     - coffeelint --rules ./.coffeelint/rules/* app/
@@ -61,14 +70,10 @@
     - !reference [.scripts, yarn_install]
     - yarn lint:css
     - echo "ESLint check..."
-    - yarn install --cwd .storybook
+    - yarn storybook:install
     - yarn lint
-    - echo "Storybook build..."
+    - echo "Storybook test build..."
     - yarn storybook:build
-    - !reference [.scripts, bundle_install]
-    - echo "Rubocop check..."
-    - bundle exec .rubocop/validate_todos.rb
-    - bundle exec rubocop --parallel
 
 # Must be a separate job because it may fail and is only executed manually.
 'lint: orphaned ruby gems':

+ 15 - 12
.gitlab/ci/pre.yml

@@ -1,23 +1,26 @@
-# Workaround to enable usage of mixed SSH and Docker GitLab CI runners
-.template_pre: &template_pre
+# Write CI cache once for faster runs
+'write runner cache: ruby':
   stage: pre
-  extends:
-    - .job_rules_default
+  cache: !reference [.cache, read_write_ruby]
   before_script:
     - !reference [.scripts, source_rvm]
-
-# Write CI cache once for faster runs
-# Do not use anchor, it's gonna miss at least the relevant tag required
-'write runner cache':
-  <<: *template_pre
-  cache: !reference [.cache, read_write]
   script:
     - !reference [.scripts, bundle_install]
+
+'write runner cache: nodejs':
+  stage: pre
+  cache: !reference [.cache, read_write_nodejs]
+  before_script: []
+  script:
     - !reference [.scripts, yarn_install]
+    - yarn storybook:install
+    - yarn cypress:install
+    - yarn --cwd ./.eslint-plugin-zammad install
 
 # Executed on a dedicated runner.
 'push to github':
-  <<: *template_pre
+  stage: pre
+  cache: []
   before_script:
     - test -d $HOME/.ssh || mkdir $HOME/.ssh
     - ssh-keyscan github.com >> $HOME/.ssh/known_hosts
@@ -33,7 +36,7 @@
     - .services_postgresql
   stage: pre
   needs:
-    - "write runner cache"
+    - 'write runner cache: ruby'
   # ensure that only one Job runs in the whole project (branches etc.)
   resource_group: global_refresh_envs
   # allow download via the web UI to restore ENVs in case global cache got deleted (see: `.gitlab-ci.yml`)

+ 2 - 0
.gitlab/ci/test/browser_build.yml

@@ -10,10 +10,12 @@ browser:build:
       - public/assets/knowledge_base*
       - public/assets/print-*
       - public/vite
+  cache: !reference [.cache, read_only_full]
   variables:
     RAILS_ENV: 'production'
     VITE_TEST_MODE: 1
   script:
+    - !reference [.scripts, yarn_install]
     - !reference [.scripts, zammad_db_unseeded]
     - node -v
     - bundle exec rake assets:precompile

+ 2 - 0
.gitlab/ci/test/frontend.yml

@@ -2,6 +2,7 @@ frontend:vitest:
   stage: test
   extends:
     - .job_rules_default
+  cache: !reference [.cache, read_only_nodejs]
   before_script:
     - !reference [.scripts, yarn_install]
   script:
@@ -15,6 +16,7 @@ frontend:cypress:
   stage: test
   extends:
     - .job_rules_default
+  cache: !reference [.cache, read_only_nodejs]
   before_script:
     - !reference [.scripts, yarn_install]
     - yarn cypress:install