C#

从零开始用Jenkins搭建.NET CI环境

Posted by Zeusro on February 26, 2016

Image

准备工作

安装之后记得安装MSbuild,gitlab,gitlab-hook插件

服务器上面,需要安装.net环境,git

全局设置

  • Git plugin

瞎填一个user name和email就行

Global Tool Configuration

不知道什么时候开始,插件的设置移动到了这个地方,这里需要设置几个地方

  • MSBuild

image

  • Git

主要是设置git的可执行文件,由于我有加到path上,所以忽略

Credentials

证书的设置比较奇葩

需要点击(global),然后在弹出的内容里面点击add Credentials

Job的配置

  • SSH的问题

我们都知道每一个Windows命令其实有着角色附在上面的.以前用git的时候,发现自己是有加ssh私钥到服务器上面的,但是git push失败,那也其实就是因为我们用的角色有问题.

Jenkins用的是Local System account.在用ssh key连接我们gitlab上面的项目时,要把我们系统用户上面的.ssh复制到Jenkins使用的用户用的文件夹.

但是在这之前.需要ssh(在git的安装目录里面有这个exe)一下我们的gitlab主机

1
ssh.exe  -T  [email protected]

确保known_hosts里面有了这个主机后,把整个.ssh文件夹复制到C:\Windows\SysWOW64\config\systemprofile,以及C:\Windows\System32\config\systemprofile这个目录

小技巧

看到permission denied的话,加多一句

1
 ssh-keygen -t rsa -C “[email protected]

看一下know host加到哪个目录,然后把自己生成的丢过去这个导致失败的目录就行.

  • 源码管理 在安装了上文提到的必备插件之后,源码里面就可以选择git,这里面我用了ssh,所以是下图这种格式

Image

重点:

这个证书别用计算机用户那个SSH.我们知道,一个gitlab只允许一台机子一个ssh,同一个ssh不能添加到多个账户.这样就会有一个问题.我们这台编译机要连源码的项目,于是需要一个ssh key.但是它编译后的结果,在Windows中我是用git去做目录同步的,于是需要另外一个ssh 去连我的机器人账户,这2个ssh key一样的话,将会导致一个步骤失败.

源码浏览器,其实是跳到我们的gitlab对应项目上,所以用http

Image

  • 触发器

这个很重要.我们根据自己的需要打勾以及选择之后

Image

复制Build when a change is pushed to GitLab. GitLab CI Service URL后面的url.

回到这个项目对应gitlab项目设置,在setting→_→web hooks里面填上这个URL,并按需要打勾,确认无误后添加.

这样当我们gitlab上面的源码有变动时,就会触发web hook.告诉我们的CI该干活了.

Image

  • MSBuild

这里主要需要学习MSBuild的文法.当初我建这个CI的目的.纯粹是为了编译网站.下面这个几个就是常用的,非常容易理解.

1
2
3
4
5
/p:PublishProfile="F:xxxxx.pubxml"
 /p:DeployOnBuild=true
 /p:Configuration=Release
/p:VisualStudioVersion=12.0  
/property:TargetFrameworkVersion=v4.5

pubxml文件在我们选择发布时就会生成一个.这个自己看,也非常容易理解.

我建议在自己开发的机器msbuild一遍.

一般来讲.我们的msbuild位于*cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319*

然后

1
2
3
4
5
6
7
8
9
10
11
 cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
MSBuild.exe 
"C:\xxxxx.sln" 
/p:PublishProfile="C:\xxxxx.pubxml" 
/p:DeployOnBuild=true  
/p:Configuration=Release 
/p:VisualStudioVersion=12.0  
/property:TargetFrameworkVersion=v4.5  
/verbosity:n 
/t:Rebuild 
/maxcpucount:16

我个人推荐的配置是

1
2
3
4
5
6
7
/p:PublishProfile="C:\xxxxx.pubxml" 
/p:DeployOnBuild=true  
/p:Configuration=Release 
/p:VisualStudioVersion=12.0  
/property:TargetFrameworkVersion=v4.5  
/verbosity:n
/maxcpucount:16

通过编译后上服务器一遍来说没问题

但是,我特么就是有问题啊!!!!

  1. nuget feed的问题

    因为我项目里面用了我私有的nuget包,这个包在nuget的官方源头是找不到的.所以我需要像在VS那样,在CI server上面配置自己的feed 在C:\Windows\SysWOW64\config\systemprofile\AppData\Roaming\NuGet中找到NuGet.Config,改为 ```XML <?xml version=”1.0” encoding=”utf-8”?>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1. 编译失败问题
    
    这个不能忍了.妹的在我的电脑一点问题都没有,在server上死活不给编译过去.后来重点排查了程序中的第三方dll和我的后宫nuget包,发现错误都出在那里.之所以在开发机上面没有发觉,是因为开发机上面的nuget依赖有本地缓存.编译的时候直接跳过去了.于是历经了35次后,本宝宝的程序终于在CI上面编译成功

1. git没有权限clone不了项目的问题
    这个是job的配置出错.job的git配置里面,选择SSH Username with private key,直接输入私钥,要完整复制 ~/.ssh/id_isa里面的内容。即是包括首尾那个没有意义的分割符!


## 血泪教训
1. 不要使用gitlab的**test hook**

    当时我项目有2个分支,我要生成的是某个分支的,但是点了一下test hook.我擦,主分支的东西都被拉过去了.
1. 





## 异常处理
###anonymous没有Overall/Administer权限
http://stackoverflow.com/questions/22833665/hudson-security-accessdeniedexception2-anonymous-is-missing-the-overall-admini


###误设置了安全选项导致无法登录进去

修改
```xml
<authorizationStrategy class="hudson.security.AuthorizationStrategy$Unsecured"/>
1
2
3
cd jenkins目录
:重启
jenkins restart   - Forces

更改Jenkins目录

Stop Jenkins service

Move C:\Users\Coola.jenkins folder to d:\Jenkins

Using regedit, change HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Jenkins\ImagePath to “d:\Jenkins\jenkins.exe”

Start service

一些配置

  1. 这个权限对应“任何用户可以做任何事(没有任何限制)” ```xml
1
2
3
1. 这个权限对应“登录用户可以做任何事”     
```xml
<authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy"/>

插件选用

插件名 用途 介绍url
proxy 代理  
gitlab 用于与gitlab集成 https://wiki.jenkins-ci.org/display/JENKINS/GitLab+Plugin
publish-over-ssh 通过ssh连接其他Linux机器  
Mercurial 构建工具 https://wiki.jenkins-ci.org/display/JENKINS/Mercurial+Plugin
gitlab-hook Enables Gitlab web hooks to be used to trigger SMC polling on Gitlab projects https://wiki.jenkins-ci.org/display/JENKINS/GitLab+Hook+Plugin
     
     
     

参考链接:

  1. 取消安全选项
  2. 配置权限
  3. 用 GitLab + Jenkins 搭建 CI
  4. Jenkins搭建.NET自动编译测试与发布环境
  5. 利用Jenkins+Gitlab搭建持续集成(CI)环境
  6. 用MSBuild和Jenkins搭建持续集成环境(1)
  7. 用MSBuild和Jenkins搭建持续集成环境(2)
  8. Jenkins进阶系列
  9. Jenkins CI integration
  10. GitLab Documentation
  11. Configuring your repo for Jenkins CI
  12. Jenkins git clone via SSH on Windows 7 x64
  13. 使用Jenkins搭建持续集成服务
  14. Hosting Your Own NuGet Feeds
  15. Using MSBuild.exe to “Publish” a ASP.NET MVC 4 project with the cmd line
  16. 项目开发环境搭建手记(5.Jenkins搭建)
  17. MSBuild DeployOnBuild=true not publishing
  18. How to change Jenkins default folder on Windows
  19. Jenkins环境变量