项目的正常运行离不开完备的测试和正确的部署。通常在项目开发的过程中,我们会写出不同类型的测试从而最大程度的减少bug查找修复时间、降低项目重构成本、增加项目迭代过程中对代码质量的信心,保证项目正常上线。为了能够给用户呈现最新的项目开发成果,一次次手动拷贝代码、登陆远程主机、配置代码运行环境显然比较低效。所以,自动化测试和部署能够有效提升项目开发效率。 这篇博客也是总结一下我最近在开发的一个前端项目中使用jenkins+gitlab进行自动化测试和部署的过程。

jenkins的安装和配置

我是在阿里云主机上搭建的jenkins服务器,云主机配置:

  • 操作系统: Ubuntu 16.04.2
  • 内存: 2GB
  • CPU: 1核
  • 硬盘:40GB

安装

  1. 需要一个拥有sudo权限的非root用户
  2. 登陆主机,将jenkins的apt key加入系统: wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
  3. 将jenkins的包地址加入系统的source.list: echo deb https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list
  4. 执行安装: sudo apt-get update && sudo apt-get install jenkins

配置

  1. 按照上述步骤,即可完成安装,现在启动jenkins,使用命令sudo systemctl start jenkins。一般来说这样直接访问8080端口就可以用了,但是不知道什么原因,虽然日志里边启动成功,但无法访问8080端口。一番查询发现通过这个命令:java -jar /usr/share/jenkins/jenkins.war可以正常启动jenkins。或者将jenkins启动写成一个脚本:
    1
    2
    3
    4
    
    /usr/bin/daemon --name=jenkins --inherit --env=JENKINS_HOME=/var/lib/jenkins \
    --output=/var/log/jenkins/jenkins.log --pidfile=/var/run/jenkins/jenkins.pid \
    -- /usr/bin/java -Djava.awt.headless=true -jar /usr/share/jenkins/jenkins.war\
    --webroot=/var/cache/jenkins/war --httpPort=8080
    

    ``

  2. 接下来访问8080端口进行登录,初次登陆会让你设置一个root用户:,按照图片中的指引,拷贝密码sudo cat /var/lib/jenkins/secrets/initialAdminPassword,进入下一步。
  3. 安装推荐的插件: 并且将gitlab相关的插件也一并下载。
  4. 创建管理员用户:
  5. 创建gitlab api token: 打开gitlab api token页面:访问地址https://gitlab.com/profile/personal_access_tokens 创建token,并保存token值; 打开jenkins设置gitlab api token:访问地址https://host:port/credentials/store/system/domain/_/newCredentials 将刚才保存的api token填写一下保存即可。
  6. 创建gitlab连接,为下一步做准备: 需要填写Connection name:gitlabGitlab host URL:https://gitlab.comCredentials:gitlab api token。 这里需要注意两点:Enable authentication for '/project' end-point需要勾掉,不然会影响gitlab githook的设置;Credentials的设置选择刚才创建的gitlab api token即可。
  7. 新建jenkins pipeline任务:

通过上述几步,可以完成jenkins的初步配置,完成登陆。接下来可以配置gitlab相关内容,为自动化测试和部署做准备。

gitlab githook

接下来,设置gitlab的githook:在你的gitlab项目页面中找到https://gitlab.com/username/projectname/settings/integrations,需要设置的就是URL,此处的url就是上边新建的jenkins任务对应的地址,比如我的:https://service.eclipsesv.com/project/rc-pipeline 如下图: 完成设置之后保存即可。

jenkins pipeline

关于这个任务的配置只需要按照下边的图即可: 需要注意的是:gitlab connection 设置为上边设置好的gitlab连接,GitLab Repository Name设置为你要测试部署项目的名称。 最后也是最关键的,设置这个jenkins任务的pipeline script:

 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
29
30
node {
   echo 'Hello World'
   # 检出代码
   stage('Checkout code'){
       checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'c*****************', url: 'git@gitlab.com:wangmengcn/react-cesium.git']]])
   }
   # 安装依赖包
   stage('Init env'){
       sh 'yarn install'
   }
   # 运行测试
   stage('Run test'){
       sh 'yarn ctest'
   }
   # 代码构建
   stage('Run build'){
       sh 'yarn cbuild'
   }
   # 发布生成结果
   stage('Deploy code'){
       sh 'cd dist'
       sh 'ls'
       sh 'rm -rf /var/lib/jenkins/cesium/*'
       sh 'cp -r dist/* /var/lib/jenkins/cesium'
   }
   # 清理项目目录
   stage('Clean workspace'){
       deleteDir()
   }
}

设置完成之后,每次push到master的代码都会触发新的build和deploy:

小结

这篇博客主要是介绍了jenkins+gitlab进行自动化测试和部署前端项目的一个流程,当然可以通过jenkins强大的插件系统完成除了上边这些功能以外的复杂工作,在以后的工作学习过程中养成良好习惯,让测试和部署尽量能够自动化完成。🍻🍻🍻