.net项目在linux平台的CI流程(基于Jenkins+mono+jexus)
内容较多,主要分为以下4方面内容:
- Jenkins的安装部署(centos 7+)
- .net在linux平台CI流程所需的插件管理&配置
- Jenkins配置连接Gitlab(也可使用对应插件连接SVN,TFS作为源码仓库)
- 基于Jenkins的CI流程构建
Jenkins安装部署
- 下载[Jenkins最新版];
- 在服务器上jenkins.war所在目录建立脚本:start-jenkins.sh:
#!/bin/bash JENKINS_ROOT=/opt/jenkins export JENKINS_HOME=$JENKINS_ROOT/jenkins_home nohup java -jar $JENKINS_ROOT/jenkins.war --httpPort= > jenkins.log >& &
- 修改脚本执行权限:
chmod a+x start-jenkins.sh
- 执行脚本:
/bin/bash start-jenkins.sh
- 访问服务器地址(测试服务器地址,脚本指定端口):
http://10.200.XX.XX:8000
.net在linux平台CI流程所需的插件管理&配置
Jenkins在当前开发环境下所需要的插件列表如下:
- Docker相关插件
- CloudBees Docker Build and Publish plugin (This plugin provides the ability to build projects with a Dockerfile, and publish the resultant tagged image (repo) to the docker registry.)
- Docker plugin (This plugin allows slaves to be dynamically provisioned using Docker.)
- docker-build-step (This plugin allows to add various Docker commands into you job as a build step.)
- CaaS插件
- Kubernates plugin (This plugin allows slaves to be dynamically provisioned on multiple Docker hosts using Kubernetes.)
- Building插件
- Git plugin
- Nuget plugin
- MSBuild
- Gitlab Connector
- Gitlab Hook Plugin
- GitLab Plugin
Jenkins配置连接Gitlab
- 在jenkins服务器上新生成SSH key
- 通过以下指令检查服务器是否已经存在SSH Key:
cat ~/.ssh/id_rsa.pub
- 如果没有Key,则通过以下指令新生成一个Key:
ssh-keygen -t rsa -C "jiakai@gridsum.com"
- 通过刚才的指令: cat ~/.ssh/id_rsa.pub 获得生成的Key(公钥部分)
- 在生成Key对应的账户个人"Profile Settings"下的"SSH Keys"标签下,新增这个Key, 新增的Title直接设置为账户名即可
- 完成后在"Your SSH Keys"下可以看到新增的SSH Key公钥信息
基于Jenkins的CI流程构建

Jenkins内部的各流程说明如下:
- 测试项目目录结构如下图:

- Source Copy
- 该过程对应Jenkins工作项中的"源码管理"工作区,在该工作区中选中"Git",配置Repository URL及上一步已经添加好的Credential即可,并制定需要编译的分支,比如"master"分支;
- 该流程配置完毕后,可保存工作项,然后"立即构建",正确的话将在Jenkins工作区目录的~/workspace/${JobName}/路径下,查看到从制定的Git Repository上拉取的源码;
- Nuget还原包
- Nuget还原包依赖nuget.exe(需要mono),下载nuget.exe(这里我下载的是2.8.6版本),拷贝至Jenkins服务器的Jenkins运行目录下的.nuget文件夹;
- 在Nuget还原工作项的"Execute shell"中,使用nuget.exe还原包即可:
mono ../../.nuget/nuget.exe restore ${solution file path(.sln)} - 注:nuget2.5版本缺少必要的操作(restore),不可用。
- 在执行过程可能报以下错误:
WARNING: Error: TrustFailure (The authentication or decryption has failed.) WARNING: Error: TrustFailure (The authentication or decryption has failed.) WARNING: Error: TrustFailure (The authentication or decryption has failed.) WARNING: Error: TrustFailure (The authentication or decryption has failed.) WARNING: Error: TrustFailure (The authentication or decryption has failed.)
需要引入秘钥证书至machine store(注意不要引入到user store):
mozroots --import --machine --sync certmgr -ssl -m https://go.microsoft.com certmgr -ssl -m https://nugetgallery.blob.core.windows.net certmgr -ssl -m https://nuget.org
- mono编译包
- 安装mono后(以安装路径/usr/mono为例),重启 jenkins,查看jenkins系统设置中的环境变量,其中的PATH变量,并确保mono的bin目录已经在PATH环境变量之中:
然后直接调用xbuild编译项目:
xbuild TestApi.sln
- [可选步骤]将编译后的文件形成发布文件,例如:
# Get the deploy files Ready if [ ! -x ./deploy ] ;then mkdir deploy else rm ./deploy/* -rf fi cp ./src/DemoApi/bin ./deploy/bin -Rf cp ./src/DemoApi/packages.config ./deploy/packages.config -f cp ./src/DemoApi/Web.config ./deploy/Web.config -f cp ./src/DemoApi/Global.asax ./deploy/Global.asax -f
- 构建Docker镜像所需的Dockerfile
- 由于我们这里需要在jexus中部署我们的demo api,因此采用公司docker源中的jexus服务器V3版镜像:
if [ -f ./Dockerfile ] ;then rm ./Dockerfile -f fi cat > ./Dockerfile <<EOF FROM .xxx.xxx.xxx:/library/mono-jexus:v3 COPY ./deploy /data CMD /usr/jexus/jws start && /usr/sbin/sshd -D EOF
- 由于我们这里需要在jexus中部署我们的demo api,因此采用公司docker源中的jexus服务器V3版镜像:
- 打包Docker镜像并推送至公司的Docker源
- 这里我们用到CloudBees Docker Build and Publish plugin这个插件

- 按照如下图所示的配置

- 在“高级设置”中,勾选"Skip tag as latest","Force Pull",并且,如果Dockerfile不在默认(./)目录,还需要在“Dockerfile Path”中指定Dockerfile的具体位置:

- 删除过期的Docker镜像
在成功生成新版本的镜像之后,需要删除(或untag)之前版本的镜像:
#Untag the expired images except the newest image id
#Init the parameters
IMG_NAME=demoapi
IMG_URL=/gridsum/ld/demoapi
(docker images | grep ${IMG_NAME} | awk '{print $2}') >.version
#Delete expired images
count=
maxnum=$(wc -l .version | awk '{print $1}')
] ;then
sort .version | while read line
do
if [ $count -lt $maxnum ] ;then
docker rmi $IMG_URL:$line
let count=count+
fi
done
fi
#Clean the parameters
unset IMG_NAME
unset IMG_URL
rm .version -f
- 建立项目对应的RC文件,注意在RC中指定的Docker镜像版本为本次build的镜像版本:

- 启动新的容器:
# Delete the existed rc by kubectl #NEED to redrect stderr into null or the BUILD process will be FAILED if there IS a RC running /opt/jenkins/kube/kubectl -s http://10.200.xx.xx:8080 delete rc demoapi 2>/dev/null #Create the k8s rc by kubectl /opt/jenkins/kube/kubectl -s http://10.200.xx.xx:8080 create -f ./rc.yaml
- 容器对应的服务最好手动建立,因为服务是常态化的,一般不随源代码版本更迭发生变化,因此服务的创建可以实现创建好;
- 最后对已发布的服务进行简单的功能测试,通过curl即可:

.net项目在linux平台的CI流程(基于Jenkins+mono+jexus)的更多相关文章
- 转:sock_ev——linux平台socket事件框架(基于数据报的测试程序) .
上一篇已经做过注释,这一篇直接上代码 /******************************************************************************** ...
- 转:sock_ev——linux平台socket事件框架(基于字节流的测试程序) .
原文:http://blog.csdn.net/gdutliuyun827/article/details/8257186 由于工作与学习的需要,写了一个socket的事件处理框架,在公司写的已经使用 ...
- 转载~Linux 平台下阅读源码的工具
Linux 平台下阅读源码的工具 前言 看源代码是一个程序员必须经历的事情,也是可以提升能力的一个捷径.个人认为: 要完全掌握一个软件的方法只有阅读源码在Windows下有sourceinsight这 ...
- CentOS安装gitlab,gerrit,jenkins并配置ci流程
CentOS安装gitlab,gerrit,jenkins并配置ci流程 By Wenbin juandx@163.com 2016/4/9 这是我参考了网上很多的文档,配置了这三个软件在一个机器上, ...
- 基于Linux平台的libpcap源码分析和优化
目录 1..... libpcap简介... 1 2..... libpcap捕包过程... 2 2.1 数据包基本捕包流程... 2 2.2 libpcap捕包过程... ...
- Linux平台延时之sleep、usleep、nanosleep、select比较
Linux平台延时之sleep.usleep.nanosleep.select比较 标签: 嵌入式thread线程cpu多线程 2015-05-05 15:28 369人阅读 评论(0) 收藏 举报 ...
- VS2010下创建的VB.NET项目打包发布安装包的流程
VS2010下创建的VB.NET项目打包发布安装包的流程 参考:http://blog.csdn.net/liuyanlinglanq/article/details/8609675 关于relea ...
- 服务端技术进阶(一)web项目的部署(发布)流程
web项目的部署(发布)流程 在myeclipse下新建web工程abc.系统设置默认如下: 项目保存位置:workspace目录\abc.Source文件夹:src,保存所有的java类文件(.ja ...
- Linux平台安装MongoDB及使用Docker安装MongoDB
一.Linux平台安装MongoDB MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包. 下载地址:https://www.mongodb.com/downlo ...
随机推荐
- UITextField的代理方法:textField:shouldChangeCharactersInRange:replacementString
原文链接:http://www.cnblogs.com/zhanggui/p/6101813.html 这个我在开发的过程中用到的次数最多,因此这里就简单对其进行分析.先看看Command+点击 弹出 ...
- 初学HTML 表单交互标签
表单标签在网站中主要负责的是进行与用户间的交互, 如果没有了交互, 那么网站就只是一个展示, 会死气沉沉的. <form>表单标签 <form>表单标签可以把浏览者(也就是我们 ...
- iOS开发之功能模块--用runtime给UIView类别拓展PressMenu工具
这是个很有用的列别工具类,在聊天对话框添加和QQ一样的"复制.粘贴.取消"等选项,而且使用起来很方便,只要找到聊天泡泡内部的某个View,比如Label或者背景冒泡的UIImage ...
- Build 2015 Beijing & Windows 10 China Geek Challenge
6月5日,借着Build 2015在北京召开分会的东风,参加了这次由微软中国举办的Windows 10中国开发者极客挑战赛. 白天是Build 2015课程,学习了Windows 10最新的技术,包括 ...
- 跨云应用部署第一步:使用IPSEC VPN连接AWS中国版和Windows Azure中国版
随着公有云的普及,越来越多的客户将关键应用迁移到云端.但是事实证明,没有哪家云服务提供商可以提供100%的SLA,无论是例行维护还是意外中断服务,对于客户的关键应用而言,都会受到不同程度的影响.此外, ...
- Java:类与继承
Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相关知 ...
- 虚基类&虚继承
发现这个月准备竞赛完全没有更新哎... 改了下某华大一c++测试题...网上对虚继承讲的要么太繁琐要么不到位,自力更生 #include<iostream> #include<fst ...
- makefile 学习笔记
1/ 编写简单makefile test_out: test.o g++ test.o -o test_out test.o: test.cpp test.h g++ -c test.cpp test ...
- HTML ------ 关于表单 Form
Form(表单)主要用于采集和提交用户输入的信息,是页面与WEB服务器交互过程中 最重要的信息来源. 掌握表单(Form)有以下几个要点: 重要form属性 form常用控件 form提交方式 § 重 ...
- NYOJ 70
描述:给定两个数n,m,其中m是一个素数. 将n(0<=n<=2^31)的阶乘分解质因数,求其中有多少个m. 注:^为求幂符号. 输入: 第一行是一个整数s(0<s<=100) ...