From 27b5374983c23b74e42551ec0cd0dd9ca9980d67 Mon Sep 17 00:00:00 2001 From: Steffen Kleinle Date: Wed, 27 Nov 2024 17:28:05 +0100 Subject: [PATCH] 187: Clean up and streamline CI --- .circleci/config.yml | 177 +++++++++--------- .circleci/src/commands/install_dart_linux.yml | 6 - ...re_ruby_cache.yml => install_fastlane.yml} | 4 +- .circleci/src/commands/install_flutter.yml | 38 ++++ .circleci/src/commands/install_fvm.yml | 24 --- ...he.yml => install_gradle_dependencies.yml} | 0 ...npm_cache.yml => install_node_modules.yml} | 0 .circleci/src/jobs/build_android.yml | 15 +- .circleci/src/jobs/bump_version.yml | 2 +- .circleci/src/jobs/check.yml | 7 +- .circleci/src/jobs/deliver_android.yml | 4 +- .github/hooks/pre-commit | 24 ++- 12 files changed, 154 insertions(+), 147 deletions(-) delete mode 100644 .circleci/src/commands/install_dart_linux.yml rename .circleci/src/commands/{restore_ruby_cache.yml => install_fastlane.yml} (91%) create mode 100644 .circleci/src/commands/install_flutter.yml delete mode 100644 .circleci/src/commands/install_fvm.yml rename .circleci/src/commands/{restore_gradle_cache.yml => install_gradle_dependencies.yml} (100%) rename .circleci/src/commands/{restore_npm_cache.yml => install_node_modules.yml} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0679d7af..3070d4bd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -30,38 +30,103 @@ commands: - run: command: circleci config validate name: Validate circle config - install_dart_linux: + install_fastlane: + description: Restores and saves fastlane cache of the passed directory. + parameters: + directory: + type: string steps: + - restore_cache: + keys: + - v1-gems-{{ arch }}-{{ checksum "<< parameters.directory >>/Gemfile.lock" }} + - v1-gems-{{ arch }}- + name: Restore Fastlane Cache - run: - command: | - curl -o dart.deb https://storage.googleapis.com/dart-archive/channels/stable/release/3.5.3/linux_packages/dart_3.5.3-1_amd64.deb - sudo dpkg -i dart.deb - name: Install Dart - install_fvm: + command: bundle config set path 'vendor/bundle' + name: Configure Installation Directory + working_directory: << parameters.directory >> + - run: + command: bundle check || bundle install + name: '[FL] Install' + working_directory: << parameters.directory >> + - save_cache: + key: v1-gems-{{ arch }}-{{ checksum "<< parameters.directory >>/Gemfile.lock" }} + name: Save Fastlane Cache + paths: + - << parameters.directory >>/vendor/bundle + install_flutter: + parameters: + precache: + default: none + enum: + - none + - android + - ios + type: enum steps: - run: - command: | - dart pub global activate fvm - echo 'export PATH=$HOME/.pub-cache/bin:$PATH' >> $BASH_ENV - export PATH="$PATH":"$HOME/.pub-cache/bin" + command: curl -fsSL https://fvm.app/install.sh | bash name: Install FVM - restore_cache: keys: - - v1-fvm-{{ checksum ".fvmrc" }}-{{ arch }} + - v1-fvm-{{ arch }}-{{ checksum ".fvmrc" }}-{{ checksum "pubspec.yaml" }}-{{ checksum "pubspec.lock" }}-{{ arch }} + - v1-fvm-{{ arch }}- - run: command: fvm install name: Install Flutter + - run: + command: fvm flutter config --no-analytics + name: Configure Flutter + - run: + command: fvm flutter --version + name: Show Flutter version + - run: + command: fvm flutter pub get --enforce-lockfile + name: Install Flutter Packages + - unless: + condition: + equal: + - << parameters.precache >> + - none + steps: + - run: + command: fvm flutter precache --<< parameters.precache >> + name: Precache Flutter Binary Artifacts + working_directory: << parameters.precache >> - save_cache: - key: v1-fvm-{{ checksum ".fvmrc" }}-{{ arch }} + key: v1-fvm-{{ arch }}-{{ checksum ".fvmrc" }}-{{ checksum "pubspec.yaml" }}-{{ checksum "pubspec.lock" }} paths: - .fvm - ~/fvm/ + install_gradle_dependencies: + description: Restores and saves the gradle cache. + steps: + - restore_cache: + keys: + - v1-gradle-{{ checksum "android/build.gradle" }}-{{ checksum "android/app/build.gradle" }}-{{ checksum "android/settings.gradle" }} + - v1-gradle- - run: - command: fvm flutter --version - name: Show Flutter version + command: bundle exec fastlane dependencies + name: '[FL] Download Dependencies' + - save_cache: + key: v1-gradle-{{ checksum "android/build.gradle" }}-{{ checksum "android/app/build.gradle" }}-{{ checksum "android/settings.gradle" }} + paths: + - ~/.gradle + install_node_modules: + description: Restores and saves the node_modules directories of the tools directory. + steps: + - restore_cache: + keys: + - v1-node-modules-{{ checksum "tools/package.json" }}-{{checksum "tools/package-lock.json" }} + - v1-node-modules- - run: - command: fvm flutter config --no-analytics - name: Configure Flutter + command: '[ ! -d node_modules ] && npm ci --ignore-scripts --loglevel warn --yes || echo package.json and package-lock.json unchanged. Using cache.' + name: Install node dependencies for npm workspaces + working_directory: tools + - save_cache: + key: v1-node-modules-{{ checksum "tools/package.json" }}-{{checksum "tools/package-lock.json" }} + paths: + - ~/tools/node_modules persist_environment_variables: description: Sets the environment variables specified in the file 'environment_variables'. Make sure the file is persisted and has been attached. steps: @@ -103,59 +168,6 @@ commands: - run: command: cat ~/attached_workspace/environment_variables >> ${BASH_ENV} name: Restore environment variables - restore_gradle_cache: - description: Restores and saves the gradle cache. - steps: - - restore_cache: - keys: - - v1-gradle-{{ checksum "android/build.gradle" }}-{{ checksum "android/app/build.gradle" }}-{{ checksum "android/settings.gradle" }} - - v1-gradle- - - run: - command: bundle exec fastlane dependencies - name: '[FL] Download Dependencies' - - save_cache: - key: v1-gradle-{{ checksum "android/build.gradle" }}-{{ checksum "android/app/build.gradle" }}-{{ checksum "android/settings.gradle" }} - paths: - - ~/.gradle - restore_npm_cache: - description: Restores and saves the node_modules directories of the tools directory. - steps: - - restore_cache: - keys: - - v1-node-modules-{{ checksum "tools/package.json" }}-{{checksum "tools/package-lock.json" }} - - v1-node-modules- - - run: - command: '[ ! -d node_modules ] && npm ci --ignore-scripts --loglevel warn --yes || echo package.json and package-lock.json unchanged. Using cache.' - name: Install node dependencies for npm workspaces - working_directory: tools - - save_cache: - key: v1-node-modules-{{ checksum "tools/package.json" }}-{{checksum "tools/package-lock.json" }} - paths: - - ~/tools/node_modules - restore_ruby_cache: - description: Restores and saves fastlane cache of the passed directory. - parameters: - directory: - type: string - steps: - - restore_cache: - keys: - - v1-gems-{{ arch }}-{{ checksum "<< parameters.directory >>/Gemfile.lock" }} - - v1-gems-{{ arch }}- - name: Restore Ruby Cache - - run: - command: bundle config set path 'vendor/bundle' - name: Configure Installation Directory - working_directory: << parameters.directory >> - - run: - command: bundle check || bundle install - name: '[FL] Install' - working_directory: << parameters.directory >> - - save_cache: - key: v1-gems-{{ arch }}-{{ checksum "<< parameters.directory >>/Gemfile.lock" }} - name: Save Ruby Cache - paths: - - << parameters.directory >>/vendor/bundle jobs: build_android: docker: @@ -169,17 +181,12 @@ jobs: - checkout - prepare_workspace - restore_environment_variables - - install_dart_linux - - install_fvm - - restore_ruby_cache: - directory: android - - run: - command: | - fvm flutter pub get --enforce-lockfile - fvm flutter precache --android - name: Install Flutter Packages - working_directory: android + - install_flutter: + precache: android - prepare_project + - install_gradle_dependencies + - install_fastlane: + directory: android - run: command: bundle exec fastlane android build version_name:${NEW_VERSION_NAME} version_code:${NEW_VERSION_CODE} name: '[FL] Build' @@ -212,7 +219,7 @@ jobs: shell: /bin/bash -eo pipefail steps: - checkout - - restore_npm_cache + - install_node_modules - run: command: echo "export NEW_VERSION_NAME=$(yarn --silent next-version calc | jq .versionName)" >> ${BASH_ENV} name: Calculate next version name @@ -237,11 +244,7 @@ jobs: steps: - checkout - check_circleci_config - - install_dart_linux - - install_fvm - - run: - command: fvm flutter pub get --enforce-lockfile - name: Install Flutter Packages + - install_flutter - run: command: fvm dart format -l 120 -o none --set-exit-if-changed . name: Check Formatting @@ -264,8 +267,8 @@ jobs: - checkout - prepare_workspace - restore_environment_variables - - restore_npm_cache - - restore_ruby_cache: + - install_node_modules + - install_fastlane: directory: android - run: command: echo "export ANDROID_RELEASE_ID='$(yarn --silent github-release create android ${NEW_VERSION_NAME} ${NEW_VERSION_CODE} --production-delivery << parameters.production_delivery >> --github-private-key ${GITHUB_PRIVATE_KEY} --owner ${CIRCLE_PROJECT_USERNAME} --repo ${CIRCLE_PROJECT_REPONAME} --release-notes "Release v${NEW_VERSION_NAME}+${NEW_VERSION_CODE}")'" >> ${BASH_ENV} diff --git a/.circleci/src/commands/install_dart_linux.yml b/.circleci/src/commands/install_dart_linux.yml deleted file mode 100644 index 03e42390..00000000 --- a/.circleci/src/commands/install_dart_linux.yml +++ /dev/null @@ -1,6 +0,0 @@ -steps: - - run: - name: Install Dart - command: | - curl -o dart.deb https://storage.googleapis.com/dart-archive/channels/stable/release/3.5.3/linux_packages/dart_3.5.3-1_amd64.deb - sudo dpkg -i dart.deb diff --git a/.circleci/src/commands/restore_ruby_cache.yml b/.circleci/src/commands/install_fastlane.yml similarity index 91% rename from .circleci/src/commands/restore_ruby_cache.yml rename to .circleci/src/commands/install_fastlane.yml index a31039bb..16c9645e 100644 --- a/.circleci/src/commands/restore_ruby_cache.yml +++ b/.circleci/src/commands/install_fastlane.yml @@ -4,7 +4,7 @@ parameters: type: string steps: - restore_cache: - name: Restore Ruby Cache + name: Restore Fastlane Cache keys: - v1-gems-{{ arch }}-{{ checksum "<< parameters.directory >>/Gemfile.lock" }} - v1-gems-{{ arch }}- @@ -17,7 +17,7 @@ steps: command: bundle check || bundle install working_directory: << parameters.directory >> - save_cache: - name: Save Ruby Cache + name: Save Fastlane Cache key: v1-gems-{{ arch }}-{{ checksum "<< parameters.directory >>/Gemfile.lock" }} paths: - << parameters.directory >>/vendor/bundle diff --git a/.circleci/src/commands/install_flutter.yml b/.circleci/src/commands/install_flutter.yml new file mode 100644 index 00000000..d261943c --- /dev/null +++ b/.circleci/src/commands/install_flutter.yml @@ -0,0 +1,38 @@ +parameters: + precache: + type: enum + default: none + enum: [none, android, ios] +steps: + - run: + name: Install FVM + command: curl -fsSL https://fvm.app/install.sh | bash + - restore_cache: + keys: + - v1-fvm-{{ arch }}-{{ checksum ".fvmrc" }}-{{ checksum "pubspec.yaml" }}-{{ checksum "pubspec.lock" }}-{{ arch }} + - v1-fvm-{{ arch }}- + - run: + name: Install Flutter + command: fvm install + - run: + name: Configure Flutter + command: fvm flutter config --no-analytics + - run: + name: Show Flutter version + command: fvm flutter --version + - run: + name: Install Flutter Packages + command: fvm flutter pub get --enforce-lockfile + - unless: + condition: + equal: [<< parameters.precache >>, none] + steps: + - run: + name: Precache Flutter Binary Artifacts + command: fvm flutter precache --<< parameters.precache >> + working_directory: << parameters.precache >> + - save_cache: + key: v1-fvm-{{ arch }}-{{ checksum ".fvmrc" }}-{{ checksum "pubspec.yaml" }}-{{ checksum "pubspec.lock" }} + paths: + - .fvm + - ~/fvm/ diff --git a/.circleci/src/commands/install_fvm.yml b/.circleci/src/commands/install_fvm.yml deleted file mode 100644 index f8c75f8e..00000000 --- a/.circleci/src/commands/install_fvm.yml +++ /dev/null @@ -1,24 +0,0 @@ -steps: - - run: - name: Install FVM - command: | - dart pub global activate fvm - echo 'export PATH=$HOME/.pub-cache/bin:$PATH' >> $BASH_ENV - export PATH="$PATH":"$HOME/.pub-cache/bin" - - restore_cache: - keys: - - v1-fvm-{{ checksum ".fvmrc" }}-{{ arch }} - - run: - name: Install Flutter - command: fvm install - - save_cache: - key: v1-fvm-{{ checksum ".fvmrc" }}-{{ arch }} - paths: - - .fvm - - ~/fvm/ - - run: - name: Show Flutter version - command: fvm flutter --version - - run: - name: Configure Flutter - command: fvm flutter config --no-analytics diff --git a/.circleci/src/commands/restore_gradle_cache.yml b/.circleci/src/commands/install_gradle_dependencies.yml similarity index 100% rename from .circleci/src/commands/restore_gradle_cache.yml rename to .circleci/src/commands/install_gradle_dependencies.yml diff --git a/.circleci/src/commands/restore_npm_cache.yml b/.circleci/src/commands/install_node_modules.yml similarity index 100% rename from .circleci/src/commands/restore_npm_cache.yml rename to .circleci/src/commands/install_node_modules.yml diff --git a/.circleci/src/jobs/build_android.yml b/.circleci/src/jobs/build_android.yml index 221926c4..c6a6d6f6 100644 --- a/.circleci/src/jobs/build_android.yml +++ b/.circleci/src/jobs/build_android.yml @@ -9,17 +9,12 @@ steps: - checkout - prepare_workspace - restore_environment_variables - - install_dart_linux - - install_fvm - - restore_ruby_cache: - directory: android - - run: - name: Install Flutter Packages - command: | - fvm flutter pub get --enforce-lockfile - fvm flutter precache --android - working_directory: android + - install_flutter: + precache: android - prepare_project + - install_gradle_dependencies + - install_fastlane: + directory: android # - run: # name: '[FL] Prepare Android Keystore' # command: bundle exec fastlane keystore diff --git a/.circleci/src/jobs/bump_version.yml b/.circleci/src/jobs/bump_version.yml index bccdb26f..4ec04d89 100644 --- a/.circleci/src/jobs/bump_version.yml +++ b/.circleci/src/jobs/bump_version.yml @@ -10,7 +10,7 @@ resource_class: small shell: /bin/bash -eo pipefail steps: - checkout - - restore_npm_cache + - install_node_modules - run: name: Calculate next version name command: echo "export NEW_VERSION_NAME=$(yarn --silent next-version calc | jq .versionName)" >> ${BASH_ENV} diff --git a/.circleci/src/jobs/check.yml b/.circleci/src/jobs/check.yml index d3dd425d..02338bf1 100644 --- a/.circleci/src/jobs/check.yml +++ b/.circleci/src/jobs/check.yml @@ -5,14 +5,11 @@ shell: /bin/bash -eo pipefail steps: - checkout - check_circleci_config - - install_dart_linux - - install_fvm - - run: - name: Install Flutter Packages - command: fvm flutter pub get --enforce-lockfile + - install_flutter - run: name: Check Formatting command: fvm dart format -l 120 -o none --set-exit-if-changed . + # Prepare project after formatting check to avoid errors due to autogenerated files - prepare_project - run: name: Check Analyzer and Linting diff --git a/.circleci/src/jobs/deliver_android.yml b/.circleci/src/jobs/deliver_android.yml index 7fb0e0b9..909badfc 100644 --- a/.circleci/src/jobs/deliver_android.yml +++ b/.circleci/src/jobs/deliver_android.yml @@ -13,8 +13,8 @@ steps: - checkout - prepare_workspace - restore_environment_variables - - restore_npm_cache - - restore_ruby_cache: + - install_node_modules + - install_fastlane: directory: android # - run: # name: '[FL] Play Store Upload' diff --git a/.github/hooks/pre-commit b/.github/hooks/pre-commit index 28134de1..e1375b37 100755 --- a/.github/hooks/pre-commit +++ b/.github/hooks/pre-commit @@ -1,17 +1,24 @@ #!/bin/sh -# # Install this pre-commit hook by running the following command in the project root: # ln -s ../../.github/hooks/pre-commit .git/hooks/pre-commit -# -# Regenerate circle-ci config.yml -CONFIG=$(git diff --cached --name-only .circleci/src) +# Regenerate circleci config.yml if necessary +CIRCLECI_CONFIG_FILES=$(git diff --cached --name-only .circleci/src) -echo "$CONFIG" | ./tools/circleci-update-config -echo "$CONFIG" | xargs git add .circleci/config.yml +if [ ! -z "$CIRCLECI_CONFIG_FILES" ]; then + # Abort if circleci command line tools are not installed + if ! command -v circleci; then + echo "You need to install circleci in order to commit and update the circleci config" + exit 1 + fi -# Check dart files + echo "$CIRCLECI_CONFIG_FILES" | ./tools/circleci-update-config + echo "$CIRCLECI_CONFIG_FILES" | xargs git add + xargs git add .circleci/config.yml +fi + +# Format Dart Files DART_FILES=$(git diff --cached --name-only --diff-filter=ACMR "*.dart" | sed 's| |\\ |g') if [ ! -z "$DART_FILES" ]; then @@ -20,9 +27,6 @@ if [ ! -z "$DART_FILES" ]; then exit 1 fi - # Prettify all selected files echo "$DART_FILES" | xargs fvm dart format -l 120 - - # Add back the modified/prettified files to staging echo "$DART_FILES" | xargs git add fi