CircleCI使用AWSCLI时报SyntaxError: Non-ASCII字符'\xc3'错误如何解决?
问题描述
我在一个使用AWSCLI的Ruby on Rails项目中工作,最近将代码推送到Staging环境时,程序尝试从rsa.key导入newkeys、PrivateKey、PublicKey时报错,错误信息如下:
SyntaxError: Non-ASCII character '\xc3' in file /opt/circleci/.pyenv/versions/2.7.12/lib/python2.7/site-packages/rsa/key.py on line 1, but no encoding declared; 详见PEP-0263规范说明

我的circleci/config.yml配置如下:
orbs: aws-ecr: circleci/aws-ecr@7.0.0 version: 2.1 jobs: build: working_directory: ~/mfds docker: - image: circleci/ruby:2.3.4-node environment: RAILS_ENV: citest LANG: C.UTF-8 - image: snowhork/mysql_jp:5.7 environment: MYSQL_ROOT_PASSWORD: *** MYSQL_DATABASE: myapp MYSQL_USER: user MYSQL_PASSWORD: *** MYSQL_ROOT_HOST: "%" steps: - checkout - restore_cache: key: gemfiles-{{ checksum "mfds/Gemfile.lock" }} # Bundle install dependencies - run: cd mfds/ && bundle install --path vendor/bundle # Store bundle cache - save_cache: key: gemfiles-{{ checksum "mfds/Gemfile.lock" }} paths: - /home/circleci/mfds/mfds/vendor/bundle - run: name: Wait for db command: dockerize -wait tcp://localhost:3306 -timeout 1m # Database setup - run: name: db setting command: | cd mfds bundle exec rake db:create bundle exec rake db:ridgepole:apply[citest] - run: name: rspec command: | cd mfds bundle exec rspec staging_deploy: machine: true steps: - checkout - run: name: asset compile command: | cd mfds npm install ./node_modules/.bin/webpack --optimize-minimize - run: name: gem install command: | gem install aws-sdk-ecs pip install futures pip install --upgrade awscli - run: name: push image command: | export AWS_ACCESS_KEY_ID=$XX_AWS_ACCESS_KEY_ID export AWS_SECRET_ACCESS_KEY=$XX_AWS_SECRET_ACCESS_KEY bin/deployv2/docker-push staging - run: name: update service command: | export AWS_ACCESS_KEY_ID=$XX_AWS_ACCESS_KEY_ID export AWS_SECRET_ACCESS_KEY=$XX_AWS_SECRET_ACCESS_KEY bin/deployv2/update-task staging ....
解决方案
根因说明
报错是因为staging_deploy步骤执行pip install --upgrade awscli时,自动安装了最新版的rsa依赖包,该版本已停止支持Python2.7,代码文件包含非ASCII字符但未声明编码,与Python2.7的默认编码规则冲突。
可落地修复方案
- 方案1:固定安装兼容Python2.7的rsa版本
rsa v4.7.2是最后一个兼容Python2.7的版本,在安装awscli前先指定安装该版本即可,修改gem install对应的run步骤:
- run: name: gem install command: | gem install aws-sdk-ecs pip install futures pip install rsa==4.7.2 pip install --upgrade awscli
- 方案2:全局声明Python2.7默认编码
直接在staging_deployjob下增加编码相关环境变量,无需修改原有安装命令:
staging_deploy: machine: true environment: PYTHONIOENCODING: utf-8 steps: # 原有步骤保持不变即可
- 方案3:切换Python3运行awscli(优先推荐)
Python2.7已经停止维护,切换到Python3可从根本上规避编码问题,修改安装命令如下:
- run: name: gem install command: | gem install aws-sdk-ecs sudo apt update && sudo apt install -y python3-pip pip3 install futures pip3 install --upgrade awscli
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

