Jenkins-FE

CI 持续集成

现在越来越多的公司开始走向微服务的架构,我们面临着巨大的挑战,

原先的单体架构 -> 微服务

单一  统一部署 -> 服务自治,独立部署

服务数量 10 -> 100+

  1. 服务数量爆发式增加, 部署需要自动化,人力成本.
  2. 迭代较短,频繁发布,需要对整个流程把控,质量监控
  3.  服务器权限管理, 流程不统一,不规范

总结我们的需求

  • 自动化

  • 可  信赖

  • 可管理

这里所一个粗略的流程,只是主干和基本机构的搭建. 作为一个技术愿景的 demo:

 安装 Jenkins

Docker 方式安装:

https://jenkins.io/doc/book/installing/#downloading-and-running-jenkins-in-docker

https://jenkins.io/doc/tutorials/build-a-node-js-and-react-app-with-npm/

docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean

按文档走即可安装成功.

Credentials

这里需要几个账号:

  • 部署的账号应该是统一的,用来和服务器进行访问. (需要 ssh 配置)
  • 开发者登录账号,不同的人应该可以有不同的权限管理

对  于统一账号  要进入 jenkins 容器进行配置.

docker exec -it jenkinsContainer /bin/bash

https://help.github.com/enterprise/2.13/user/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/

在被部署服务器上 /root/.ssh/authorized_keys 文件里添加 publickey
在 jenkins 系统内为这个人添加 privatekey

配置 PipeLine

pipeline {
// 这里是用node 8.xx来做执行的容器
agent {
docker {
image 'node:carbon'
}
}
stages {
stage('Install') {
steps {
// 安装packages
sh 'npm install'
}
}
stage('Build') {
steps {
// 打staging的包,具体请跟进不同项目的npm 命令执行
sh 'npm run staging-build'
}
}

stage('UT') {
steps {
// 以后有单元测试,也是要执行npm命令进行测试
echo 'should run unit test in this stage'
}
}

stage('E2E Testing') {
steps {
// E2E 测试
echo 'should run E2E cases in this stage'
}
}

stage('Deploy') {
steps {
// 设置好的jenkins部署账号的ID, 已在部署服务器上配好ssh
sshagent (credentials: ['e9c209ac-5e6b-43d6-9759-e53d98257ce9']) {
sh "whoami"
// 把dist目录scp到目标服务器特定地址, 这里可以考虑先放入某个后续文件夹中
sh "scp -v -r -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no dist root@108.160.132.39:/data"
// 下面可以加ssh到服务器上执行某个 shell 去真正的部署,替换文件,要实际场景和需求
}
}
}
stage('Clean') {
steps {
cleanWs (deleteDirs: true, patterns: [[pattern: 'node_modules', type: 'EXCLUDE']])
}
}
}
}

把 Jenkinsfile 和 code 放在一起,类似 dockerfile

Build

后续可优化/调研

  • commit hook
  • 是否可以暂停 pipeline, 通过手工确认继续 (比如手工测试环节)
  • 如何其他服务进行连接,是否会正常等待对方结束,如何判断结束是否失败
  • 打包方式变为 push docker image 到自有仓库
  • 通知方式

注:

如果起了 jenkins 的 docker,  下次再启动数据不会清除的,如果想重新走安装流程.
需要 
docker volume ls 看那个jenkins-data 的 volume,要干掉这个