第一部分 课程介绍及持续集成介绍
1. 课程介绍
主要是Jekins,还包含 Maven,Tomcat,Git,Docker,Amazon EC2,checkstyle,VS Code。
带着一起过了下九个部分的内容。
2. 如何学习这门课
先理论,后实践:视频 + PDF + 代码。遇到问题可以在问答区提问。
3. 课程幻灯片
如题
4. 持续集成介绍
什么是持续集成
插入图
为什么需要持续集成
早发现问题,更好的代码质量
采用持续集成的不同阶段
阶段一,无规律地提交代码,手动集成和测试
阶段二,规律地提交代码,定期用脚本进行构建和自动化测试,有问题时提醒团队成员
阶段三,提交代码就马上触发构建,在失败时候立即通知失败的构建
阶段四,代码质量和代码覆盖率和单元测试一起运行,能持续评估代码质量
阶段五,自动化部署,把新的变更直接推入生产环境中
持续集成 vs 持续交付 vs 持续部署
插入图
持续集成,个人研发部分转向整体部分,频繁地进行集成以发现其中的错误。
持续交付,将集成后的代码交付到预发环境中,目标是任何代码都可以在任何时候进行部署,建立在高水平的持续集成之上(不要等所有问题都解决了再交付)。注:这一点很多项目都是最后上线了才发现各种问题。
持续部署,代码通过评审后,自动部署到生产环境中。
使用持续集成的好处和挑战并存,必然是未来软件开发的趋势。
如何实现持续集成
可以进行私有部署(自己在服务器中进行持续集成的环境配置)。
也可以使用云服务 ,将持续集成的功能进行托管,比如:circleci。
构建失败了应该被开发当作最高优先级的问题,部署过程应该是自动,不涉及手动步骤。
**
5. Jekins的介绍和历史
什么是Jekins
- Jenkins 是一个持续集成和构建服务器。
- 用于手动、定期或自动构建软件开发项目。
- 它是一个用 Java 编写的开源持续集成工具。
- Jenkins 适合各种规模的团队,和使用各种语言的 项目。
Jekins的特点
易于使用的、具有很好的可扩展性。
Jekins历史
- Hudson 是由 Kohsuke Kawaguchi 于 2004 年在 Sun 创立的一个业余项目。
- 在 2005 年首次发布。
- Kohsuke 于 2008 年初全职工作在 Hudson 项目上。
- 2010 年成为领先的持续集成解决方案,市场占有率 超过 70%。
- 2011 年更名为 Jenkins。
第二部分 环境配置和Jekins安装
6. Java 9警告
推荐Java8.0(9.0的不支持,因为用到一些插件不被支持)。
7. Mac上安装和配置Java
搜索“install java se”进行官方下载即可。
在~/.bash_profile中增加一行即完成了JAVA_HOME的配置
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/
8. 其他系统下的安装
略。
9. 安装Jekins
官网下载LTS版本, 选择Mac OS的pkg安装包。
安装后按照指引拷贝密码登陆,完成初始化配置,成功后在设置界面,将密码修改为容易记忆的密码。
第三部分 Jekins的架构,术语,UI介绍,及创建第一个Jekins Job
10. Jekins架构和术语
Master和Slave架构。
Job/Project。
Slave/Node。
Executor。
Build。
Plugin。
11. Jekins UI的概述:仪表盘和菜单
略。
12. 创建第一个Jekins Job
创建一个XX类型的Job
- 增加一些描述
- 勾选 “丢弃旧的构建”
- 增加勾选步骤 中选择 增加shell,填入
echo "hello Jenkins"
然后保存。
13. 运行第一个Jekins Job
在Job列表中,点击右边的构建按钮。
插入图
然后点击名字”My First Jekins Job”进入详情。
插入图
点击左下角的地球图标,成功看到#1构建的日志输出:hello Jenkins。
第四部分 用Jekins持续集成
14. 安装Git和Jenkins GitHub插件
安装Git:略。
安装Jenkins Github插件: 在插件管理中进行搜索安装即可,也会顺道安装以来的其他插件。
15. 在本地机器安装Maven
描述软件是如何构建的,描述了项目的以来,是目前最流行的构建工具。
搜素“maven apache”下载。
下载解压后,将bin的地址配置到PATH中,输入 mvn -v
检验maven是否安装成功。
16. 配置Jekins来使用Java、Git和Maven
在Jenkins的配置页面,全局工具配置中,配置了Git,JAVA,MAVEN然后进行了保存。
注:配置Maven的时候,记得将maven的文件夹放在 /usr/local 目录下, 否则会因为权限影响后面的构建。
17. 创建我们的第一个基于maven的Jenkins项目
介绍Maven构建生命周期的不同阶段,指定一个阶段,会包含前面的阶段。
插入图。
新建任务,勾选为Github项目,填入
https://github.com/fallskygaoyan/maven-project.git
构建中选择“调用顶层 Maven 目标”,填写“clean package”。
18. 文本:上节所需资料
略。
19. 问题解决:学员遇到问题的解答
略。
20. Jekins Workspace和运行我们的第一个Jenkins构建
介绍了构建成功过程的日志输出、以及如何在workspace中查看文件内容。
21. 问题解决:学员遇到问题的解答
略。
22. 在Jenkins中进行源代码轮询控制
使用Cron语法进行配置。
Build Triggers -》 Poll SCM -》 *(每分钟都轮询)
Git Polling Log会每分钟进行检查。
还介绍了如何配置SSH。
git commit —allow-empty : 可以用来做空的提交
23. 文本课程:包含上节的内容指引
略。
24. Jenkins其他构建触发器
- 访问Jenkins配置的一个带token的地址,即可触发
- 其他项目被构建的时候,触发本项目的构建
- 定期地进行构建
- 通过Github的钩子(比如提交)进行构建
- 通过定期轮询查询是否有更新 进行构建(前述内容)
25. 文本课程:包含上节的内容指引
略。
第五部分 Jenkins持续检查
26. 代码质量和代码覆盖率度量报告
本节介绍了如何安装checkstyle插件(似乎是默认支持不要安装插件),然后在构建中配置它:
- 在build中,指定使用checkstyle
- 在构建完毕后,指定发布测试报告
并且重点演示了,在build过程中,如果查看发现的问题,修改提交后如何消除这些问题。
最后还提到了Java中最常用的两个用于发现bug的Jenkins插件:FindBugs、PMD
27. 文本课程:包含上节的内容指引
略。
28. Jenkins支持其他构建系统
Apache Ant
安装Ant插件,在build中选择invoke ant即可。
Gradle
安装Gradle插件,在bulid中选择invoke gralde即可。
Shell Scripts
build中选择execute shell,然后输入想执行的命令。
29. 文本课程:包含上节的内容指引
略。
第六部分 Jenkins持续交付
30. 归档构建artifacts
在 “构建后操作” 中选择 “归档成品”,然后填写 /*.war 对所有的war文件进行归档。
在构建结果中可以看到 “构建产生文件”的部分。
31. Staging环境傻姑娘安装和配置tomcat
下载安装apache-tomcat,然后在conf/server.xml中查找<Connector部分,将8080修改为8090(因为和Jenkins的8080端口冲突),在bin文件下通过 chmod +x *给所有可执行文件赋予执行权限后,执行 sh startup.sh即可启动tomcat,通过localhost:8090即可在浏览器访问。
为了让Jenkins有执行tomcat的权限,需要在tomcat-user.xml中进行配置:
<role rolename="manager-script"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-script,admin-gui"/>
32. 部署到Staging环境上
安装 copy artifact 和 deploy to container 插件。
我们将已有的任务重命名为package,表只做打包之意。
另外我们新建一个任务 deploy-to-staging,在它的“构建”步骤中,选择 copy artifacts from another project(从package中拷贝war包),并且填写拷贝规则: /*.war。在“构建后操作”中,填写 /*.war,并且配置tomcat的身份信息和访问信息:tomcat/tomcat,http://localhost:8090。
最后,在package打包完成后,希望它自动触发 deploy-to-staging,因此在“构建后操作”中选择 deploy war/ear to a container。
完成后,通过手动触发package的构建,可以看到deploy-to-container也成功执行,在浏览器上通过 http://localhost:8090/webapp/ 可以访问到web的内容。
33. 问题解决::包含上节的内容指引
略。
34. Jenkins构建Pipeline
上面的内容只有两个job关联,现实中可能有很多job相互关联。
插件build pipeline提供了视图可以方便管理构建视图,安装完插件后,在主面板中选择 initial job 为 package,案后就可以看到可视化的pipeline关系了(黄色-进行中,蓝色-未开始,绿色-通过,红色-失败)。
35. 并行地进行Jenkins构建
另外新建一个job中命名为static-analysis,并指定同样的git地址和构建配置:执行顶层maven目标 然后填写 checkstyle:checkstyle。
将package job中checkstyle的部分删除,并且在“构建后操作”的“构建其他项目”中,多指定一个项目(用逗号隔开)。
这时候就可以看到pacakge同时触发另外两个job。
36. 部署到生产环境
在staging环境中测试完功能后,需要将代码上线到生产环境,并且只能由手动进行触发。
我们先将staging的服务器关闭,然后将已有目录tomcat拷贝,得到下述规则的两个文件夹:
- ${name}-staging
- ${name}-production
将生产环境的端口修改:
8090->9090
8005->8006
8443->8444
8009->8019
然后再分别启动,确保都可以正常打开。
新建另外一个job,名为deploy-to-production。
在package中的构构建后选择 deploy another project(manual),选择 deploy-to-production。
在pipeline中启动package完成后,可以看到 deploy-to-production 右下角有个点击按钮,点击后才会执行部署到生产环境。执行完毕后,可以通过访问 http://localhost:9090查看部署的最新内容。
37. 问题解决:包含上节的内容指引
略。
第七部分 Jenkins Pipeline As Code
38. Pipeline As Code概述
通过在Jenkinsfile文件中,通过DLS语法,我们可以将本来通过GUI进行的CI/CD操作,改造成可以方便迁移的形式。
首先,在自己的Git仓库中新建一个Jenkinsfile文件,内容如下(用Groovy书写):
pipeline {
agent any
stages{
stage('Init'){
steps {
echo "Testing......"
}
}
stage('Build'){
steps {
echo "Building......"
}
}
stage('Deploy'){
steps {
echo "Code Deployed."
}
}
}
}
然后,新建一个job命名为JenkinsAsCodeExample,选择类型为Pipeline。
再然后,Pipeline部分新选择Definition为 Pipeline script from SCM, 类型Git(https://github.com/tangyefei/maven-project.git)。
保存运行后,可以看到每一个自定义stage的执行试驾,在日志中还可以考到输出的内容。
39. 文本课程:包含上节的内容指引
略。
40. Pipeline As Code代码格式介绍以及上传代码到Git仓库
书写了另一个版本的 Jenkinsfile(没有介绍得太仔细),没有可执行性内容。
pipeline {
agent any
stages{
stage('Build'){
steps {
sh 'mvn clean package'
}
post {
success {
echo '开始存档...'
archiveArtifacts artifacts: '**/target/*.war'
}
}
}
}
}
41. Visual Studio Code安装和使用推行界面push代码到git
略。
42. 创建Pipeline job
拆分介绍了第38节的如何下新建Pipeline的内容,可跳过。
43. 自动化我们现有的Jenkins Pipeline
基于第40节的内容(增加了一点关于maven的配置)并且验证了它是可以执行成功的,可略过。
。
44. 问题解决:包含上节的内容指引
略。
45. 使用Pipeline部署到staging环境
修改index.jsp中的文件内容用于验证我们的新配置是否是生效。
新建一个新的job,命名为package(将老的job改为pacakge-old),并将deploy-to-staging和deploy-to-production的触发者改为package(因为随着老job的改名,触发者也被改成了package-old),否则导致看到的是老版的打包内容。
将Jenkinsfile内容替换为如下,可以将前面打包和发布到staging、production的内容变为Pipeline的形式。
pipeline {
agent any
tools{
maven 'local maven'
}
stages{
stage('Build'){
steps {
sh 'mvn clean package'
}
post {
success {
echo '开始存档....'
archiveArtifacts artifacts: '**/target/*.war'
}
}
}
stage('Deploy to staging'){
steps{
build job:'deploy-to-staging'
}
}
stage ('Deploy to Production'){
steps{
timeout(time:5, unit:'DAYS'){
input message:'是否部署到生产环境?'
}
build job: 'deploy-to-production'
}
post {
success {
echo '代码成功部署到生产环境'
}
failure {
echo ' 部署失败'
}
}
}
}
}
46. 使用Pipeline部署到production环境
上节Jenkinsfile的内容,略。
47. Cmder介绍及下载—for Windows
略。
第七部分 Jenkins Pipeline As Code
48. 为Tomcat服务器配置AWS安全组并创建密钥对
注册了账号
服务-EC2
安全组 - 创建安全组 - tomat - 3个规则
- http 0.0.0.0 80;
- custom tcp 8080 0.0.0.0 ;
- ssh myip 22
创建密钥对-下载了一个密钥文件
49. 在AWS上创建EC2实例并模拟staging环境
一个instance代表一台虚拟机。
launch instance - amazon linux (已经安装了java) - p2 micro 1G - netwok - security group(选择新建的安全组)- 选择存在的ssh key - launch instance
生产环境在配置上可以选择:t2 large 8G
50. 在AWS上创建EC2实例并模拟production环境
略。
51. 在创建的AWS实例上运行并运行Tomcat-staging环境
通过terminal连接instance,然后通过sudo yarn install tomcat 8进行安装。
52. 在创建的AWS实例上运行并运行Tomcat-production环境
略。
53. 完全自动化Jenkins Pipeline-代码讲解
作者意图是,在本机启动Jenkins,并且用于触发发布任务,通常它对应的是一个发布平台(某台服务器充当)。
EC2的两个实例充当服务器,安装Tomcat,只做存放war包的工作。
新建job fully-automated,pipeline类型,git,仓库地址.
然后介绍简单了构建代码,内容见下节。
54. 完全自动化Jenkins Pipeline-代码执行
作者使用自己脚本执行完毕后,通过ip地址可以访问到webapp的内容。
修改index.jsp提交后,会自动触发构建和发布到生产环境。
55. 文本课程:包含上节的内容指引
略。
56. Windows下正常工作的Jenkins样例
略。
57. 问题解决:包含上节的内容指引
略。
58 问题解决:包含上节的内容指引
略。
亚马逊 - EC2(Elastic Compute Cloud - 弹性计算云)
腾讯云 - CVM(Cloud Virtual Machine - 云服务器)1年 662.34元
阿里云 - ECS(Elastic Compute Service - 云服务器)1年
第八部分 Jenkins和Docker集成
本章内容相对独立,未经实践,仅仅知道Jenkins+Docker能做什么**:**
- 本地或服务器中,安装Docker
- 本地或服务器中,Jenkins中的Job会轮询Git或被手动触发
- 执行clean package的任务
- 执行docker的命令依据dockerfile打包image
- 手动通过docker命令,image运行成实例,映射到端口提供使用
59. Docker介绍
无什内容,略。
60. 容器介绍
比较了虚拟机和Containers的差别,概念东西,听的不是很明白,略。
61. Docker Hub
Docker Hub可以找到你需要安装的任何东西,都是部署好的可以直接用。
62. Docker的下载安装
介绍Mac下的Docker安装。安装好以后Application总打开下,然后执行 docker run hello-world
验证是否生效。
63. Docker安装-Linux
差别仅在于一个是service方式
yum install -y docker
docker service create
systemctl start docker.service
docker run hello-world
64. Docker基础知识
docker run tomcat:latest
docker run -p 9091:8080 tomcat:latest
docker run -d -p 9091:8080 tomcat:latest
docker ps -a
docker images
docker remove image -f IMAGE-NAME
docker kill IMAGE-ID
docker exec -it CONTAINER-ID
docker container ls
65. Docker项目设置
用一个新job重复了前面章节配置Pipeline的过程,略。
66. Dockerfile概述
介绍了FROM、ADD、COPY、RUN、CMD、VOLUME、WORKERDIR 语法。
67. 添加Dockerfile
介绍了两个配置文件。
jenkinsfile
pipeline {
agent any
tools{
maven 'local maven'
}
stages{
stage ('build'){
steps{
sh 'mvn clean package'
sh "/usr/local/bin/docker build . -t tomcatwebapp:${env.BUILD_ID}"
}
}
}
}
dockerfile
FROM tomcat:8.0
ADD ./webapp/target/*.war /usr/local/tomcat/webapps/
EXPOSE 8080
CMD ["catalina.sh","run"]
69. 构建和标记Docker Image
Manage Jenkins - Config System
build成功。
70. Docker Run
应用Docker image,跑了多个tomcatwebapp。
第九部分 分布式构建
71. 介绍分布式Jenkins构建
大量开发人员不断提交代码时,会触发很多大构建, 仅靠一个Jenkins实例,应对不来。
Jenkins采用的是Master-Slave架构,简言之就是Master负责调度,多个Slave负责执行。
72. 在EC2中安装Jenkins Master
Jenkisn的 Master和Slave Agent需要互相通信。
启动Slave Agent有多种方式,本节重点介绍:通过Master使用SSH的方式启动Slave Agent。
参考73节的内容,在服务器上安装好Jenkins,然后通过 ip:8080的方式进行访问。
73. 文本课程:包含上节内容指引
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
sudo yum install jenkins-2.238 -y
systemctl start jenkins
74. 在EC2中安装Jenkins Slave:Agent-Part1
新建另外一台设备,然后分别在不同设备上执行不同任务:
// master机器上
su jenkins
vim /etc/passwd // 修改jenkins行的最后false为bash
ssh-keygen
ssh root@116.62.178.111 mkdir -p .ssh //在salve上创建ssh文件夹
cat ~/.ssh/id_rsa.pub | ssh root@116.62.178.111 'cat >> .ssh/authorized_keys' // 拷贝master的publickey到slave上的受信名单中
// slave机器上
yum -y install java-1.8.0-openjdk.x86_64
wget http://47.98.33.167:8080/jnlpJars/slave.jar // 从master上下载agent
75. 文本课程:包含上节内容指引
略。
76. 在EC2中安装Jenkins Slave:Agent-Part2
虽然mater可以通过ssh的方式登陆到slave中,但是毕竟将一台机器的密码配置在Jenkins中有所不妥。
本节主要介绍如何在Jenkins做配置,使得Master和Slave之间能够构建起来联络关系。短期无此次需要,细节略。
77. 文本课程:包含上节内容指引
略。
78. 并发Jenkins构建并标记Jenkins构建
作者在服务器上的Jenkins上创建了3个job,他们都是freestyle,execute shell类型,所做的任务都是 sleep 10
。手动点击这三个job,可以看到他们分别被master和slave处理(总计四个处理,包含一个master的调度),从而验证分别是构建成功。
另外,希望某些节点上只做特定任务,Jenkins上可以通过给节点打标签,然后配置节点只做和标签有关的任务实现“专用”。
第十部分 Bonus Lecturer
79. Bonus Lecturer
广告作者发布的其他课程。