背景

  • 有个私有仓储,地址为https://your.repo.com/pypi/
  • 代码存储在gitlab, 地址为https://gitlab.company.com/software.git
  • CI为jenkins

常规解决手法

jenkins有一个特定的节点,节点里面已经配置好了%HOMEPATH%/.pypirc

[distutils]
index-servers =
deploy [deploy]
repository=https://your.repo.com/pypi/
username=youraccmount
password=yourpwd

然后直接使用

python setup.py sdist upload -r deploy

问题

权限控制

私有仓储存在一个权限, 只有高级别的账号才能push. 而所有人都可以pull包. 那么就存在一个问题. 绝对不能将leader的账户密码直接记录在jenkins节点的配置中.这样很容易就暴露权限.

如果换了台节点

常用方法需要在节点配置.pypirc文件. 如果我想换台节点,还需要登陆到新节点进行配置.这样非常不方便.

需求

  • 绝对不能暴露高级别的账号密码
  • 对节点无特殊需求, CI任务换哪个节点都可以
  • 希望能够自定义包的版本. 而不是每次都是某个固定的版本
  • 我提交代码到gitlab. 然后就自动发布到仓储

解决

我新打了一个tag0.1.1, 然后我的私有仓储就有一个client0.1.1的包

  1. 通过jenkins password injection解决权限控制的问题
  2. 通过expect解决需要交互式输入用户名密码的问题
  3. 通过gitlab push解决自动发布的问题
  4. 通过设置环境变量解决tag转化为包版本的问题

设置仓储名, 指定分支为refs/tags/*. 这样只会编译tag分支

增加jenkins自动触发

gitlab 配置事件推送

注入密码到环境变量

手动添加凭据

shell脚本

这里有一个难题要解决, 首先jenkins shell执行相当于在目标机器下发了一个文件. 如果要用expect 都是只能采用#!/usr/bin/expect头来执行. 可是使用#!/usr/bin/expect作为shell脚本执行器,很多命令又没办法用. 所以采用#!/usr/bin/expect -c "command"来执行

#!/bin/bash

# 注入环境变量
set -e # 将Tag版本传到环境变量,Setup.py会读取这个环境变量
version=`basename $GIT_BRANCH`
export VERSION=$version
here=`pwd` # 安装打包辅助库twine到默认python环境
pip install twine # 打包
python setup.py sdist # 使用expect进行交互式用户名,密码输入, 这里需要将yourpackagename改成python包名
/usr/bin/expect -c "spawn twine upload --repository-url https://your.repo.com/pypi/ "$here"/dist/yourpackage-"$version".tar.gz; expect "*username:" ; send ${ADMIN_USER}\r; expect "*password:"; send ${ADMIN_PWD}\r; expect eof"

而在setup.py中,使用环境变量作为当前版本

setuptools.setup(
...
version=os.getenv("VERSION", "0.1.0")
...
)

gitlab+jenkins自动发布Python包到私有仓储的更多相关文章

  1. gitlab+jenkins自动构建jar包并发布

    一.背景介绍: 公司软件都是java开发的,一般都会将java代码打包成jar包发布:为了减轻运维部署的工作量,合理偷懒,就需要自动化流程一条龙服务:开发将代码提交到gitlab--->jenk ...

  2. jenkins自动发布java代码

    注:本文来源于<KaliArch> jenkins笔记 一.相关概念 1.1 Jenkins概念: Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台. ...

  3. Jenkins自动发布代码实战篇

    Jenkins自动发布代码实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.Jenkins服务器配置秘钥对并上传到Gitlab中 1>.在Jenkins后端生成秘钥 ...

  4. 在pypi上发布python包详细教程

    使用Python编程中Python的包安装非常方便,一般都是可以pip来安装搞定:pip install <package name>,我们自己写的python也可以发布在pypi上,很简 ...

  5. Jenkins自动执行python脚本输出测试报告

    前言 在用python做自动化测试时,我们写好代码,然后需要执行才能得到测试报告,这时我们可以通过 Jenkins 来进一步完成自动化工作. 借助Jenkins,我们可以结合 Git/SVN 自动拉取 ...

  6. 局域网内利用gitlab,jenkins自动生成gitbook并发布(nginx)

    安装了GitBook,内网使用,没法用上gitbook的网页. 用gitbook serve只能展示一本书,而且也不利于长期维护. 于是使用gitlab,jenkins,和nginx配合gitbook ...

  7. 使用Jenkins自动发布Windows服务项目

    不同于发布Web项目,自动发布Windows服务项目需要解决以下几个问题: 如何远程停止和开启服务?需要在发布前停止服务,在发布完成后开启服务. 如何上传编译文件到目标服务器? 问题1:如何远程停止和 ...

  8. 发布python包

    写python程序时常常要导入各种包,使用其中的模块或功能.我们如果有可以复用的功能或模块也可以发布成包,并安装在自己或他人电脑上,以供自己或别人使用.python发布包的步骤如下: 一.首先为模块创 ...

  9. saltstack 迭代项目到客户端并结合jenkins自动发布多台服务器

    前面已经讲解了Webhook实现Push代码后的jenkins自动构建,接下来通过结合slatstack 实现多台机器的项目代码发布. 利用saltstack中file.recurse方法,运用该模块 ...

随机推荐

  1. <pre>标签:\r\n换行符的保留

    mysql数据读库的\r\n换行符处理 这个问题是我在采集数据时发现的,采集网页的数据,大概有6千多条,采集的内容保留了最原始的\r\n和\n换行字符,但在mysql管理工具中(phpmyadmin和 ...

  2. CODING 研发管理系统上线全球加速,助力企业跨区域协作

    CODING 研发管理系统现已全面支持全类型代码仓库的 全球加速访问. 随着国内互联网红利的日趋枯竭与全球互联网的加速普及.越来越多的企业开始走出国门,将目光投向全世界,搭建跨国体系.跨出国门的中国企 ...

  3. 【转载】Sqlserver数据库备份的几种方式

    在实际的数据库Sqlserver的运维的过程中,很多时候我们需要做到数据的备份操作,可以做到定时备份,也可以进行手动数据库备份.在实际的过程中,有时候因业务需要备份出完整数据库,而有时候又因为实际业务 ...

  4. python 简史

    ---恢复内容开始--- Python的作者,Guido von Rossum,确实是荷兰人.1982年,Guido从阿姆斯特丹大学(University of Amsterdam)获得了数学和计算机 ...

  5. 微信小程序之onLaunch与onload异步问题

    所述问题: 前端时间开发了一个微信小程序商城项目,因为这个项目我们的需求是进入小程序就通过wx.login({}) 这个api进行用户登录,获取系统后台的用户基本信息.再此之前,一直以为微信小程序中的 ...

  6. Pytorch实战1:线性回归(Linear Regresion)

    GitHub代码练习地址:https://github.com/Neo-ML/MachineLearningPractice/blob/master/Pytorch01_LinearRegressio ...

  7. Java实现点击导出excel页面遮罩屏蔽,下载完成后解除遮罩

    一.问题场景 最近在做数据统计功能,需求是导出大数据量的excel,时间间隔较长,大概需要十秒左右,点击导出后,页面没有做任何处理,用户也不知道是否正在导出:如果没有做交互上的限制,用户可以一直点击导 ...

  8. Java服务使用Redis实现分布式全局唯一标识

    此处以SpringBoot为例,示范如何使用Redis构造全局唯一标识. 1. RedisTemplate配置 spring.redis.database = 0 spring.redis.host ...

  9. 找不到servlet对应的class

    javax.servlet.ServletException: Wrapper cannot find servlet class com.suntomor.lewan.pay.NotifyRecei ...

  10. Vue.js-02:第二章 - 常见的指令的使用

    一.前言 在上一章中,我们了解了一些在使用 Vue 进行开发中经常会遇到的基础概念,与传统的前端开发不同,Vue 可以使我们不必再使用 JavaScript 去操作 DOM 元素(还是可以用,但是极度 ...