第一部分 课程介绍及持续集成介绍

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中进行配置:

  1. <role rolename="manager-script"/>
  2. <role rolename="admin-gui"/>
  3. <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关系了(黄色-进行中,蓝色-未开始,绿色-通过,红色-失败)。

Screen Shot 2021-02-17 at 10.36.38 PM.png

35. 并行地进行Jenkins构建

另外新建一个job中命名为static-analysis,并指定同样的git地址和构建配置:执行顶层maven目标 然后填写 checkstyle:checkstyle。

将package job中checkstyle的部分删除,并且在“构建后操作”的“构建其他项目”中,多指定一个项目(用逗号隔开)。

这时候就可以看到pacakge同时触发另外两个job。

Screen Shot 2021-02-17 at 10.50.25 PM.png

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。
Screen Shot 2021-02-18 at 6.56.12 PM.png

在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书写):

  1. pipeline {
  2. agent any
  3. stages{
  4. stage('Init'){
  5. steps {
  6. echo "Testing......"
  7. }
  8. }
  9. stage('Build'){
  10. steps {
  11. echo "Building......"
  12. }
  13. }
  14. stage('Deploy'){
  15. steps {
  16. echo "Code Deployed."
  17. }
  18. }
  19. }
  20. }

然后,新建一个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(没有介绍得太仔细),没有可执行性内容。

  1. pipeline {
  2. agent any
  3. stages{
  4. stage('Build'){
  5. steps {
  6. sh 'mvn clean package'
  7. }
  8. post {
  9. success {
  10. echo '开始存档...'
  11. archiveArtifacts artifacts: '**/target/*.war'
  12. }
  13. }
  14. }
  15. }
  16. }

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的形式。

  1. pipeline {
  2. agent any
  3. tools{
  4. maven 'local maven'
  5. }
  6. stages{
  7. stage('Build'){
  8. steps {
  9. sh 'mvn clean package'
  10. }
  11. post {
  12. success {
  13. echo '开始存档....'
  14. archiveArtifacts artifacts: '**/target/*.war'
  15. }
  16. }
  17. }
  18. stage('Deploy to staging'){
  19. steps{
  20. build job:'deploy-to-staging'
  21. }
  22. }
  23. stage ('Deploy to Production'){
  24. steps{
  25. timeout(time:5, unit:'DAYS'){
  26. input message:'是否部署到生产环境?'
  27. }
  28. build job: 'deploy-to-production'
  29. }
  30. post {
  31. success {
  32. echo '代码成功部署到生产环境'
  33. }
  34. failure {
  35. echo ' 部署失败'
  36. }
  37. }
  38. }
  39. }
  40. }

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方式

  1. yum install -y docker
  2. docker service create
  3. systemctl start docker.service
  4. docker run hello-world

64. Docker基础知识

  1. docker run tomcat:latest
  2. docker run -p 9091:8080 tomcat:latest
  3. docker run -d -p 9091:8080 tomcat:latest
  4. docker ps -a
  5. docker images
  6. docker remove image -f IMAGE-NAME
  7. docker kill IMAGE-ID
  8. docker exec -it CONTAINER-ID
  9. docker container ls

65. Docker项目设置

用一个新job重复了前面章节配置Pipeline的过程,略。

66. Dockerfile概述

介绍了FROM、ADD、COPY、RUN、CMD、VOLUME、WORKERDIR 语法。

67. 添加Dockerfile

介绍了两个配置文件。

jenkinsfile

  1. pipeline {
  2. agent any
  3. tools{
  4. maven 'local maven'
  5. }
  6. stages{
  7. stage ('build'){
  8. steps{
  9. sh 'mvn clean package'
  10. sh "/usr/local/bin/docker build . -t tomcatwebapp:${env.BUILD_ID}"
  11. }
  12. }
  13. }
  14. }

dockerfile

  1. FROM tomcat:8.0
  2. ADD ./webapp/target/*.war /usr/local/tomcat/webapps/
  3. EXPOSE 8080
  4. 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. 文本课程:包含上节内容指引

  1. sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
  2. sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
  3. sudo yum install jenkins-2.238 -y
  4. systemctl start jenkins

74. 在EC2中安装Jenkins Slave:Agent-Part1

新建另外一台设备,然后分别在不同设备上执行不同任务:

  1. // master机器上
  2. su jenkins
  3. vim /etc/passwd // 修改jenkins行的最后falsebash
  4. ssh-keygen
  5. ssh root@116.62.178.111 mkdir -p .ssh //在salve上创建ssh文件夹
  6. cat ~/.ssh/id_rsa.pub | ssh root@116.62.178.111 'cat >> .ssh/authorized_keys' // 拷贝masterpublickeyslave上的受信名单中
  7. // slave机器上
  8. yum -y install java-1.8.0-openjdk.x86_64
  9. 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

广告作者发布的其他课程。