用于具有私有存储库的git项目的包管理器
qaviton-package-manager的Python项目详细描述
Qaviton包经理
Qaviton包管理器(qpm)
是与git集成的包管理工具。
要启用包的公共和私有管理,
除了标准包管理器之外,还可以从git存储库中。在
使用qpm更换冗余包装系统:
使用git标记打包所有内容:
>qpm --build
|
branch: dev
|
branch: tests
|
[tag 2019.9.1]
|
[tag 2019.9.2]
|
branch: release/latest
>qpm --install "git+https://url/owner/project.git@release/latest#egg=package:>=2019.9.2"
| | | | | | | |
qaviton install vcs+protocol://project_url @branch #egg=package (optional)
package method type directory pep-440 pep-508
manager path :version_specifier
安装
^{pr2}$要求
- 吉特2.16+
- Python 3.6+
特点
- CI CD工作流✓
- 管理私有+公共包✓
- 管理嵌套私有包✓
- cli+脚本✓
- pip能力✓
- git功能✓
- pypi功能✓
- 自动生成✓
- 安全凭据✓
- 跨平台✓
- 嵌套/多个包✗
- pip-e安装✗(即将推出)
- docker build✗(但可与run函数一起使用)
- docker push✗(但可与run函数一起使用)
使用
创建经理:
(venv) windows> qpm ^
--create ^
--url "https://github.com/owner/project.git" ^
--username "user1" ^
--password "pass@#$" ^
--email "awsome@qaviton.com" ^
--pypi_user "supasayajin" ^
--pypi_pass "final space"
(venv) bash$ qpm \ --create \ --url "https://github.com/owner/project.git"\ --username "user1"\ --password "pass@#$"\ --email "awsome@qaviton.com"\ --pypi_user "supasayajin"\ --pypi_pass "final space"\ /
这将为您留下以下项目结构:
project/
├ package/
│ └ __init__.py # with __author__, __version__, __author_email__, __description__, __url__, __license__
├ tests/
│ └ __init__.py
├ .gitignore
├ LICENSE
├ README.md
├ requirements.txt
├ requirements-test.txt
├ setup.py
└ package.py # ignored by .gitignore
现在让我们构建一个包:
# package.pyfromqaviton_package_managerimportManagerfromqaviton_package_managerimportdecypt# if this is not secure enough, you can add cache_timeout=3600 # and store credentials in memory# manager = Manager(cache_timeout=3600) # and we need to insert the credentials in run time: > python package.py --username "x" --password "z"manager=Manager(**decypt(key=b'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==',token=b'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==',))if__name__=="__main__":# running with lambdas will protect you from processes getting stuckmanager.run(lambda:manager.update(),# pip install -r requirements.txt --upgradelambda:manager.update_test(),# pip install -r requirements-test.txt --upgradelambda:manager.test(),# python -m pytest --junitxml=test_report.xml testslambda:manager.build(),# git commit, tag & push (internal logic is more complicated)lambda:manager.upload(),# upload to pypi)
确保您的包在列表1中通过了测试
# tests/my_package_test.pydeftest_with_100p_coverage():print("testing my package!\nPASS")
# we can now create a package
python package.py
命令行:
我们可以通过cli调用任何方法和发送任何参数给管理器:
# release a version if all tests pass qpm --username "" --password "" --update --update_test --test --build --upload # build a stable version if all tests pass qpm --username "" --password "" --update --update_test --test --build "stable/latest"# install cachetools using pip and save the requirement in requirements.txt qpm --install cachetools # cache credentials in memory qpm --username "" --password "" --cache_timeout "-1"# using the system & python to execute tests qpm --test "system""echo success" --test "python""-c""print(\"py success\");"
CLI快捷方式:
我们可以通过cli调用任何方法和发送任何参数给管理器:
# install cachetools using pip and save the requirement in requirements.txt qpm i cachetools # uninstall cachetools using pip and remove the requirement in requirements.txt qpm un cachetools # build a stable version qpm b "stable/latest"# run tests qpm t # upload to pypi qpm up # install cachetools using pip and save the requirement in requirements.txt qpm install cachetools # build package qpm build "stable/latest"# upload to pypi qpm upload
脚本:
# ci_cd.pyfromqaviton_processesimportrun,escape,pythonfrompackageimportmanagerfromdatetimeimportdatetimed=datetime.utcnow()docker_url=manager.vars['docker_url']docker_user=manager.vars['docker_user']docker_pass=manager.vars['docker_pass']docker_email=manager.vars['docker_email']SSH_PRIVATE_KEY=manager.kwargs['SSH_PRIVATE_KEY']docker_tag=manager.kwargs['docker_tag']branch_build="ci_cd/latest"dev_branch="dev"manager.run(lambda:manager.should_build(from_branch=dev_branch,to_branch=branch_build),lambda:manager.install(),lambda:manager.install_test(),lambda:manager.test.pytest("tests/ci_cd"),lambda:manager.build(to_branch=branch_build,version=f'{d.year}.{d.month}.{d.day}'),# docker distributelambda:run(f"docker login --username=\"{escape(docker_user)}\" --password=\"{escape(docker_pass)}\" --email=\"{escape(docker_email)}\"\"{escape(docker_url)}\""),lambda:run(f"docker build --force-rm -t test-multi-stage-builds --build-arg SSH_PRIVATE_KEY=\"{escape(SSH_PRIVATE_KEY)}\" ."),lambda:run(f"docker tag {docker_tag} yourhubusername/verse_gapminder:firsttry"),lambda:run("docker push yourhubusername/verse_gapminder"),# deploy scriptlambda:python("deploy.py"))
# schedualer.pyfromtimeimporttime,sleepfromdatetimeimportdatetime,timedeltafromqaviton_processesimportpython_code_asyncd=datetime.utcnow()date=datetime(year=d.year,month=d.month,day=d.day,hour=22)delta=timedelta(days=1)# build a package once a day at 22pmwhileTrue:python_code_async('import ci_cd')date+=deltasleep(date.timestamp()-time())
警告
- 在
此管理器用于自动ci cd
在
不应使用and代替常规git commit/push/merge。
避免使用不稳定的分支 以避免失败的打包请求或潜在的数据丢失。
我们建议从CI-CD专用分支使用它。在 - 在
管理器默认为加密凭据,
在
如果磁盘上加密的凭据不够安全,
请确保启用缓存,以便在内存中存储凭据
- 项目
标签: