Description
Your Environment
- Your operating system: docker container with the following
/etc/os-release
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
-
Version of python you are running: python3.9
-
How did you install twine? Did you use your operating system's package manager or pip or something else? Running in a virtual environment created by tox
-
Version of twine you have installed (include complete output of): 4.0.0
-
Which package repository are you targeting? Artifact Registry on Google Cloud Platform, using the additional keyring:
keyrings.google-artifactregistry-auth
.
The Issue
When launching twine from within a tox step, defined as follows:
[testenv:publish]
description =
Publish the package you have been developing to a package index server.
By default, it uses testpypi. If you really want to publish your package
to be publicly accessible in PyPI, use the `-- --repository pypi` option.
skip_install = True
changedir = {toxinidir}
basepython = python3.9
passenv =
PYPI_REPO
GOOGLE_APPLICATION_CREDENTIALS
deps =
twine
commands =
python3.9 -m twine check dist/*
python3.9 -m twine upload --skip-existing --verbose --non-interactive {posargs:--repository-url {env:PYPI_REPO}} dist/*
when uploading there was a warning saying
Uploading distributions to
https://europe-west3-python.pkg.dev/project_id/pypi/
�[34mINFO �[0m dist/package-0.1.dev55+g42d0d37-py2.py3-none-any.whl (17.0 KB)
�[34mINFO �[0m dist/package-0.1.dev55+g42d0d37.tar.gz (28.8 KB)
�[34mINFO �[0m Querying keyring for username
�[33mWARNING �[0m 'getpwuid(): uid not found: 999'
ERROR: InvocationError for command /.tox/publish/bin/python3.9 -m twine upload --skip-existing --verbose --non-interactive --repository-url https://europe-west3-python.pkg.dev/project_id/pypi/ 'dist/*' (exited with code 1)
Iand then failing to upload the package.
After investigating, I've found out that this is due to keyring failing with the exception
File "/usr/lib/python3.9/pathlib.py", line 376, in gethomedir
return os.environ['HOME']
File "/usr/lib/python3.9/os.py", line 679, in __getitem__
raise KeyError(key) from None
KeyError: 'HOME'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File ".tox/publish/lib/python3.9/site-packages/keyring/core.py", line 72, in get_credential
return get_keyring().get_credential(service_name, username)
File ".tox/publish/lib/python3.9/site-packages/keyring/core.py", line 32, in get_keyring
init_backend()
File ".tox/publish/lib/python3.9/site-packages/keyring/core.py", line 83, in init_backend
set_keyring(_detect_backend(limit))
File ".tox/publish/lib/python3.9/site-packages/keyring/core.py", line 98, in _detect_backend
or load_config()
File ".tox/publish/lib/python3.9/site-packages/keyring/core.py", line 153, in load_config
keyring_cfg = os.path.join(platform.config_root(), filename)
File ".tox/publish/lib/python3.9/site-packages/keyring/util/platform_.py", line 59, in _config_root_Linux
_check_old_config_root()
File ".tox/publish/lib/python3.9/site-packages/keyring/util/platform_.py", line 43, in _check_old_config_root
config_file_new = os.path.join(_config_root_Linux(), 'keyringrc.cfg')
File ".tox/publish/lib/python3.9/site-packages/keyring/util/platform_.py", line 60, in _config_root_Linux
fallback = pathlib.Path.home() / '.config'
File "/usr/lib/python3.9/pathlib.py", line 1132, in home
return cls(cls()._flavour.gethomedir(None))
File "/usr/lib/python3.9/pathlib.py", line 379, in gethomedir
return pwd.getpwuid(os.getuid()).pw_dir
KeyError: 'getpwuid(): uid not found: 999'
Of course, after seeing this error, the issue was clear and I then added the HOME
environment variable to passenv in tox.ini
.
passenv =
PYPI_REPO
GOOGLE_APPLICATION_CREDENTIALS
HOME
Steps to Reproduce
Just unset HOME
before running twine.
It would be nice if the warning included the traceback from the keyring exception, which is basically silenced by the current implementation in auth.py
:
def get_username_from_keyring(self) -> Optional[str]:
try:
system = cast(str, self.system)
logger.info("Querying keyring for username")
creds = keyring.get_credential(system, None)
if creds:
return cast(str, creds.username)
except AttributeError:
# To support keyring prior to 15.2
pass
except Exception as exc:
logger.warning(str(exc))
return None
maybe using exc_info
logger.warning(str(exc), exc_info=exc)
?