gitlab+jenkins自动发布Python包到私有仓储
背景
- 有个私有仓储,地址为
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的包
- 通过jenkins password injection解决权限控制的问题
- 通过expect解决需要交互式输入用户名密码的问题
- 通过gitlab push解决自动发布的问题
- 通过设置环境变量解决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包到私有仓储的更多相关文章
- gitlab+jenkins自动构建jar包并发布
一.背景介绍: 公司软件都是java开发的,一般都会将java代码打包成jar包发布:为了减轻运维部署的工作量,合理偷懒,就需要自动化流程一条龙服务:开发将代码提交到gitlab--->jenk ...
- jenkins自动发布java代码
注:本文来源于<KaliArch> jenkins笔记 一.相关概念 1.1 Jenkins概念: Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台. ...
- Jenkins自动发布代码实战篇
Jenkins自动发布代码实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Jenkins服务器配置秘钥对并上传到Gitlab中 1>.在Jenkins后端生成秘钥 ...
- 在pypi上发布python包详细教程
使用Python编程中Python的包安装非常方便,一般都是可以pip来安装搞定:pip install <package name>,我们自己写的python也可以发布在pypi上,很简 ...
- Jenkins自动执行python脚本输出测试报告
前言 在用python做自动化测试时,我们写好代码,然后需要执行才能得到测试报告,这时我们可以通过 Jenkins 来进一步完成自动化工作. 借助Jenkins,我们可以结合 Git/SVN 自动拉取 ...
- 局域网内利用gitlab,jenkins自动生成gitbook并发布(nginx)
安装了GitBook,内网使用,没法用上gitbook的网页. 用gitbook serve只能展示一本书,而且也不利于长期维护. 于是使用gitlab,jenkins,和nginx配合gitbook ...
- 使用Jenkins自动发布Windows服务项目
不同于发布Web项目,自动发布Windows服务项目需要解决以下几个问题: 如何远程停止和开启服务?需要在发布前停止服务,在发布完成后开启服务. 如何上传编译文件到目标服务器? 问题1:如何远程停止和 ...
- 发布python包
写python程序时常常要导入各种包,使用其中的模块或功能.我们如果有可以复用的功能或模块也可以发布成包,并安装在自己或他人电脑上,以供自己或别人使用.python发布包的步骤如下: 一.首先为模块创 ...
- saltstack 迭代项目到客户端并结合jenkins自动发布多台服务器
前面已经讲解了Webhook实现Push代码后的jenkins自动构建,接下来通过结合slatstack 实现多台机器的项目代码发布. 利用saltstack中file.recurse方法,运用该模块 ...
随机推荐
- Mapbox使用详解
一.简介: Mapbox致力于打造全球最漂亮的个性化地图. 在一次偶然的地图相关资料搜索过程中发现了一个很神奇又很漂亮的地图,这个地图支持高度自定义各种地图元素,比如,道路,水系,绿地,建筑物,背 ...
- 在github上fork项目如何同步并解决冲突
在github上fork项目如何同步并解决冲突 在github上有些项目我们可能会进行一些自己功能的添加但是提交PR后作者基于设计或者其他原因考虑没有通过,但是这个功能又是我们必须的.这时我们就想自己 ...
- js实现在当前页面搜索高亮显示字的方法
在html页面上,有时候会遇到一些检索高亮显示的问题,具体用js是实现的方式,代码展示. Jsp页面设置方式 <li class="pull-left" id="s ...
- 做自己的CEO
目录 前言 做自己的CEO 做自己的CEO是指什么 为什么要做自己的CEO 如何做自己的CEO 定义自己的愿景.使命和价值观 愿景 (Vision) 使命 (Mission) 价值观 (Values) ...
- Go基础(3)
demo1: package main import "fmt" func print() { for i := 1; i < 10; i++ { for j := 1; j ...
- volatile关键字的特性及证明
volatile是java虚拟机提供的轻量级的同步机制 JMM(Java内存模型)是围绕着并发编程中原子性.可见性.有序性这三个特征来建立的 原子性:一个操作或多个操作要么全部执行完成且执行过程不被中 ...
- Python300篇电子书免费送
此电子书集合由猪哥整理,免费发布于微信公众号:裸睡的猪. 此电子书集合将持续更新,获取最新电子书集合请关注微信公众号:裸睡的猪,回复:电子书此电子书集合仅用作个人学习,请勿用于商业获利!!! 获取方式 ...
- Linux知识要点大全(第一章)
第一章 Linux操作系统简介 主要内容: 1:Linux的发展历史 2:开源软件 3:Linux系统结构与特性 ...
- DateTimeHelper【日期类型与字符串互转以及日期对比相关操作】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 实现日期和字符串之间的转换以及日期的相关操作: 1.日期格式的字符串输出为Date类型: 2.将Date类型以指定格式输出: 3.将 ...
- DSAPI TreeView节点增删简化操作
将一行或多行字符串添加到TreeView控件. 函数: 控件.TreeView控件.添加路径节点到TreeView(要添加节点的TreeView控件,字符串或字符串数组) 示例:将一个多行文本添加到T ...