内容较多,主要分为以下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相关插件
  1. 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.)
  2. Docker plugin (This plugin allows slaves to be dynamically provisioned using Docker.)
  3. docker-build-step (This plugin allows to add various Docker commands into you job as a build step.)
  • CaaS插件
  1. Kubernates plugin (This plugin allows slaves to be dynamically provisioned on multiple Docker hosts using Kubernetes.)
  • Building插件
  1. Git plugin
  2. Nuget plugin
  3. MSBuild
  • Gitlab Connector
  1. Gitlab Hook Plugin
  2. GitLab Plugin

Jenkins配置连接Gitlab

  • 在jenkins服务器上新生成SSH key
  1. 通过以下指令检查服务器是否已经存在SSH Key:
    1. cat ~/.ssh/id_rsa.pub
  2. 如果没有Key,则通过以下指令新生成一个Key:
    1. ssh-keygen -t rsa -C "jiakai@gridsum.com"
  3. 通过刚才的指令: 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
  • 打包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)的更多相关文章

  1. 转:sock_ev——linux平台socket事件框架(基于数据报的测试程序) .

    上一篇已经做过注释,这一篇直接上代码 /******************************************************************************** ...

  2. 转:sock_ev——linux平台socket事件框架(基于字节流的测试程序) .

    原文:http://blog.csdn.net/gdutliuyun827/article/details/8257186 由于工作与学习的需要,写了一个socket的事件处理框架,在公司写的已经使用 ...

  3. 转载~Linux 平台下阅读源码的工具

    Linux 平台下阅读源码的工具 前言 看源代码是一个程序员必须经历的事情,也是可以提升能力的一个捷径.个人认为: 要完全掌握一个软件的方法只有阅读源码在Windows下有sourceinsight这 ...

  4. CentOS安装gitlab,gerrit,jenkins并配置ci流程

    CentOS安装gitlab,gerrit,jenkins并配置ci流程 By Wenbin juandx@163.com 2016/4/9 这是我参考了网上很多的文档,配置了这三个软件在一个机器上, ...

  5. 基于Linux平台的libpcap源码分析和优化

    目录 1..... libpcap简介... 1 2..... libpcap捕包过程... 2 2.1        数据包基本捕包流程... 2 2.2        libpcap捕包过程... ...

  6. Linux平台延时之sleep、usleep、nanosleep、select比较

    Linux平台延时之sleep.usleep.nanosleep.select比较 标签: 嵌入式thread线程cpu多线程 2015-05-05 15:28 369人阅读 评论(0) 收藏 举报 ...

  7. VS2010下创建的VB.NET项目打包发布安装包的流程

    VS2010下创建的VB.NET项目打包发布安装包的流程 参考:http://blog.csdn.net/liuyanlinglanq/article/details/8609675  关于relea ...

  8. 服务端技术进阶(一)web项目的部署(发布)流程

    web项目的部署(发布)流程 在myeclipse下新建web工程abc.系统设置默认如下: 项目保存位置:workspace目录\abc.Source文件夹:src,保存所有的java类文件(.ja ...

  9. Linux平台安装MongoDB及使用Docker安装MongoDB

    一.Linux平台安装MongoDB MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包. 下载地址:https://www.mongodb.com/downlo ...

随机推荐

  1. IOS开发基础知识--碎片6

    三十三:IOS多视图跳转方法 第一种: 跳转:[self presentModalViewController:control animated:YES]; 返回:[self dismissModal ...

  2. iOS 疑难杂症 — — 在 Storyboard 里 Add Size Class Customization 后再从代码里无法修改的问题

    前言 公司的产品同时适配 iPhone 和 iPad ,并坚持用 Storyboard 来做适配,今天又踩一个坑(以前遇到过)还以为是 XCode 的鬼毛病. 声明  欢迎转载,但请保留文章原始出处: ...

  3. android 图片性能优化

    本章讲述在android开发中,图片处理方面的优化.包括知识点为大图加载,图片压缩,图片缓存处理及开源图片处理框架Universal-Image-Loader. 1.图片引发的内存不足 当在andro ...

  4. 第一课 ionic 日志输出

    写程序的首要问题就是要打印日志,因为只有将日志输出才能真正了解程序的运行状态. 日志输出有两种方式 1.console输出 console.log("测试一下") console. ...

  5. Memcache学习整理

    一.Memcache 是什么? 组成:程序进程管理.Socket 程序进程:Memcache把内存先分成几个大份,每一份分成多个小份.例如:小份中有5M...0.9M.0.8M.....0.1M,一份 ...

  6. ORACLE优化器RBO与CBO介绍总结

    RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...

  7. 在执行xp_cmdshell的过程中出错,调用'LogonUserW'失败,错误代码:'1909'

    在上篇文章Could not obtain information about Windows NT group/user 'xxxx\xxxx', error code 0x5里面,我介绍了SQL ...

  8. Linq专题之提高编码效率—— 第二篇 神一样的匿名类型

    说起匿名类型,我们都知道这玩意都是为linq而生,而且匿名类型给我们带来的便利性大家在实战中应该都体会到了,特别适合于一次性使用,临时 使用这些场景,虽然说是匿名类型,也就是说是有类型的,只是匿名了而 ...

  9. kattle 发送post请求

    一.简介 kattle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定.它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述 ...

  10. 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)

    萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...