CircleCI — установка зависимостей занимает слишком много времени

#yaml #circleci

#yaml #circleci

Вопрос:

Выполнение шага установки зависимостей моего файла CircleCI YAML занимает около 3 минут, и я получаю различные предупреждения о том, что Python 2.7 выйдет из строя в 2021 году. Могу ли я что-нибудь сделать, чтобы ускорить его и удалить эти сообщения об ошибках?

 version: 2
jobs:
  build:
    working_directory: ~/myapp
    docker:
      - image: node:10.13.0-stretch
        env:
          - DISPLAY=:99
          - CHROME_BIN=/usr/bin/google-chrome
    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "package.json" }}
            # fallback to using the latest cache if no exact match is found
            - v1-dependencies-
      - run:
          name: Install Dependencies
          command: |
            npm install -g @angular/cli
            npm install
            npm install -g firebase-tools
            apt-get -y -qq update
            apt-get -y -qq install gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc  6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget
            if [[ "$CIRCLE_BRANCH" == "master" ]]; then
              apt-get -y -qq update
              apt-get -y -qq install python-dev
              curl -O https://bootstrap.pypa.io/get-pip.py
              python get-pip.py --user
              echo 'export PATH=/root/.local/bin:$PATH' >> ~/.bash_profile
              source ~/.bash_profile
              pip install awscli --upgrade --user
              ~/.local/bin/aws configure set default.s3.signature_version s3v4
            fi
      - save_cache:
          paths:
            - node_modules
          key: v1-dependencies-{{ checksum "package.json" }}
      - run:
          name: Deploy to AWS
          command: |
            if [[ "$CIRCLE_BRANCH" == "master" ]]; then
              ng build --prod --configuration=production --progress=false
              ~/.local/bin/aws --region eu-west-2 s3 sync /root/myapp/dist/myapp/ s3://$AWS_BUCKET_TARGET --delete --exclude '.git/*'
              ~/.local/bin/aws cloudfront create-invalidation --distribution-id $AWS_DISTRIBUTION_ID --paths '/*'
            fi
    branches:
      only:
        - master
  

Ответ №1:

Судя по вашей конфигурации, похоже, что вы создаете приложение Angular на Python и развертываете его в AWS.

Вот несколько рекомендаций:

  • Рассматривали ли вы возможность использования готового варианта образа Python / Node вместо использования образа узла и установки Python? Это образы, в которых уже установлены как Python, так и Node. Это должно значительно сократить время.
  • Также заметил, что вы устанавливаете Angular CLI и firebase-tools глобально. Глобальные модули npm устанавливаются в папке, отличной от папки текущего проекта node_modules . Если вы хотите также кэшировать эти зависимости, рекомендуем просто установить без -g флага или дополнительно указать папку global modules save_cache restore_cache в шагах and, чтобы вам не приходилось каждый раз переустанавливать их с нуля.
  • Если вы не используете серверный продукт CircleCI, вы можете использовать конфигурацию версии v2.1 и использовать интерфейс командной строки CircleCI AWS для установки CLI по мере необходимости. Вот пример:
 version: 2.1 # 2.1 required for orbs
orbs:
  aws-cli: circleci/aws-cli@1.3.0

# ...

  steps:
    # ...other dependency installation steps as required

    - aws-cli/install # Call pre-made commands in orb
    - run:
        command: |
          aws configure set default.s3.signature_version s3v4

    # ...etc.
  
  • Это не совсем связано с вопросом, но я заметил, что вы используете какую-то устаревшую конфигурацию. Вы можете удалить свои проверки bash $CIRCLE_BRANCH на всех этапах, а также окончательный branches ключ. Вместо этого объявите рабочий процесс с фильтром следующим образом:
 workflows:
  build-deploy: # arbitrary workflow name of your choice
    jobs:
      - build:
          filters:
            branches:
              only: master