pre-conceptCI的含义CI的意思是持续构建。将代码库中的代码拉取后,执行用户预设和定义的操作脚本,通过一系列的编译操作构建产品,并将产品推送到产品库中。常用工具有GitlabCI、GithubCI、Jenkins等,此环节不参与部署,只负责构建代码,然后保存构建。构造称为工件,保存工件的地方称为工件库。CD的含义CD有两个含义:持续部署(ContinuousDeployment)和持续交付(ContinuousDelivery)。持续交付的概念是:产品库中的产品取出后,部署到测试环境/交付给客户进行前期测试。持续部署是在生产环境中部署工件。初始化环境下面开始实际操作CI和CD。建议自己搭建一个新的服务器,以免弄乱环境。如果需要购买,可以参考文档保姆级指南:购买阿里云ecs服务器。不管是新买的电脑还是自己的电脑,电脑的基本环境如下dockergitjava:jenkins是基于java环境的jenkins假设机器是基于centos的,接下来我们开始搭建服务。docker安装yuminstall-yyum-utilsdevice-mapper-persistent-datalvm2sudoyum-config-manager--add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyuminstalldocker-ce-ysystemctlstartdockersystemctlenabledocker需要配置docker镜像源为阿里云,否则docker下载镜像等操作会极慢sudomkdir-p/etc/dockersudotee/etc/docker/daemon.json<<-'EOF'{"registry-mirrors":["https://fwvjnv59.mirror.aliyuncs.com"]}EOF修改后需要重新加载所有修改后的配置文件sudosystemctldaemon-reloadsudosystemctlrestartdockergitinstallyuminstallgit-y这里需要初始化git,即生成sshpublic和privatekeysssh-keygen-trsa-C“你的邮箱”生成成功,公钥和私钥会存放在/.ssh/下,可以通过以下命令查看公钥,在github等平台配置或码云使对应私钥有权限操作仓库cat~/.ssh/id_rsa。pub扩展:私钥可以通过下面的命令获取,这里不需要,但是后面配置jenkins权限的时候需要,可以关注cat~/.配置jenkins的yum源[root@jenkins~]#wget-O/etc/yum.repos.d/jenkins.repohttps://pkg.jenkins.io/redhat-stable/jenkins.repo[root@jenkins~]#rpm--importhttps://pkg.jenkins.io/redhat-stable/jenkins.io.key然后下载yuminstalljenkins-y如果很慢就ctrl+c停止原Command,执行如下命令从清华大学地址下载wgethttps://mirrors.tuna.tsinghua.edu.cn/jenkins/war/latest/jenkins.war至此,我们最简洁版的CI环境已成立。了解jenkins启动jenkins服务Jenkins可以理解为一个java项目,目标是为软件的持续集成提供一个软件平台,如下图更直观既然是一个项目,我们需要启动它才能启动一个服务,运行如下命令启动jenkinssystemctlstartjenkins如果想开机自动启动,建议执行以下命令systemctlenablejenkins访问jenkins服务。如何验证是否成功?自然地,访问此服务。jenkins默认服务提供的端口是8080,在浏览器中输入ip:8080(如果是阿里云服务器,记得配置安全组开启这个端口),进入Jenkins登录页面,如果出现如下界面,表示jenkins初始化成功接下来我们对jenkins的第一次启动做一些初始化工作,如果已经使用过可以直接跳过本章;首先,你需要一个密码,Jenkins启动时会将密码写入指定目录,直接去cat复制粘贴即可。但是在点击之前,需要更改jenkins插件的镜像,否则会很慢sed-i's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.清华。edu.cn\/jenkins/g'/var/lib/jenkins/updates/default.json&&sed-i's/http:\/\/www.google.com/https:\/\/www.baidu.com/g'/var/lib/jenkins/updates/default.json入门:配置用户配置地址,一般直接下一步就好了。如果出现如下界面,说明你的初始化工作已经完成。让我们开始享受你的詹金斯吧!既然应用jenkins是一个【软件持续集成的软件平台】,那么自然要做下面两件事比如git,node,nginx等多个应用的??集成,将多个应用的??工作集成到一个任务中,而jenkins控制的是内部细节,也就是说jenkins是一个以任务为单位的应用案例:设置通过docker下载node的任务下面我们查看docker版本以通过docker拉取node镜像为例,创建一个newtask其实就是执行下面的命令,但是我们要通过jenkins来控制,因为这意味着以后一些复杂的脚本也可以以任务的形式自动执行。docker-vdockerpullnode:latest首先新建一个任务,添加构建任务要执行的脚本。至此,我们就完成了任务的创建。接下来,让我们开始构建这个任务吧!首先返回项目详情,然后点击BuildNow,最后进入构建任务详情查看Log,如果最后输出STATUS:SUCCESS,说明成功补充:如果出现如下失败错误,说明用户【jenkins]没有访问docker服务的权限,所以我们需要将用户添加到这个服务对应的组中执行以下命令gpasswd-ajenkinsdocker,然后更新。Newgrpdocker应用案例:编译react工程接下来我们来实际操作一下。目标很简单:让Jenkins帮我们做以下几步执行build命令处理一个存放在git或code中的文件云端的react项目会生成一个build目录来启动一个nginx服务,然后把里面的内容移到下面构建到nginx的静态文件目录,这样服务器上就会有相应的服务,我们可以直接访问nginx服务端口访问项目,就可以为一个项目的自动构建和自动部署提供服务,之后后面连接git或者码云上传hooks,我们就可以实现自动集成或者自动部署,其实就是我们所说的CICD搭建node环境,如果要编译react项目,至少要有node服务jenkins服务,这个服务是以插件的形式提供的。大致思路是:先下载node插件并安装插件,全局配置中心会出现对应的服务,我们选择指定的版本启动,这样在提供对应node服务的需求中詹金斯实现了。知道了思路,让我们开始实施吧!首先我们需要下载node插件,等待安装重启。然后,我们需要将节点添加到jenkins全局配置中。首先找到系统全局配置并安装指定版本,选择从镜像安装至此我们就拥有了node环境。测试节点环境。接下来,我们应用我们在执行任务时创建的节点环境。首先,创建一个任务。这个过程和以前一样。唯一不同的是最后一步需要选择节点环境。选择我们自己的版本就可以了。我们在任务中执行如下脚本node-v执行任务,看到状态为SUCCESS,输出node版本,说明node环境搭建成功。创建react项目接下来我们在本地创建一个react项目(假设名称ci-pro)并上传到码云,我们直接在本机初始化,然后推送到码云;使用脚手架npmversion6+直接执行npxcreate-react-appci-pro或更低版本,你必须在本地安装并执行create-react-appci-pro。如果之前没有安装过这个脚手架,需要执行如下命令安装npminstall-gcreate-react-app,等待安装完成。我们将有以下目录结构。├──README.md├──package.json├──public│├──favicon.ico│├──index.html│├──logo192.png│├──logo512.png│├──manifest.json│└──robots.txt├──src│├──App.css│├──App.js│├──App.test.js│├──index.css│├──index.js│├──logo.svg│├──reportWebVitals.js│└──setupTests.js└──yarn.lock连接nginx按照前面的思路,我们需要把product项目编译后在nginx的静态资源目录下。然后通过nginx提供服务,那么自然我们需要访问nginx服务,首先执行nginx配置文件创建对应的文件mkdirconf&&viconf/default.conf指定静态资源目录default.conf文件的内容server{listen80;server_name_;root/etc/nginx/html;}这里我们通过docker提供nginx服务,涉及移动目录,配置自定义配置文件等,我们需要自定义镜像,这就需要我们实现自己的Dockerfile,并创建对应的文件viDockerfile来做以下两件事:Jenkins执行后生成的构建目录打包命令移动到nginx的静态资源目录,指定一个自定义的配置文件FROMnginx:1.15COPYbuild/etc/nginx/htmlCOPYconf/etc/nginx至此,我们就完成了本地项目的搭建,接下来就是关联远程仓库和push吧好吧,看看当前的目录树。├──Dockerfile├──README.md├──conf│└──default.conf├──package.json├──public│├──favicon.ico│├──index.html│├──logo192.png│├──logo512.png│├──manifest.json│└──robots.txt├──src│├──App.css│├──App.js│├──App.test.js│├──index.css│├──index.js│├──logo.svg│├──reportWebVitals.js│└──setupTests.js└──yarn.lock配置jenkins对仓库的权限假设我们有了仓库的ssh地址,然后进入我们jenkins任务的配置页面,添加这时候会提示没有权限。原因很简单。本机公私钥对分配给码云上的公钥。自然这台机器有操作远程仓库的权限,但是jenkins服务器上没有私钥。我们只需要在jenkins中配置私钥获取权限,在哪里配置呢?Configuration=>SourceCodeManagement=>Git=>Repositories->Credentials=>Add=>SSHUsernamewithprivatekey关于私钥的获取方式,这里可以查看git安装模块的内容,我们已经完成jenkins的配置关于混帐。配置脚本返回jenkins,配置构建任务时要执行的脚本。要做以下两点安装依赖,执行项目build并执行Dockerfile文件生成镜像并根据新镜像启动服务(为避免端口冲突,先关闭镜像下的所有服务)的内容脚本如下(如果是云服务器,注意在控制台打开端口)#!/bin/shnpminstall--registry=https://registry.npm.taobao.orgnpmrunbuilddockerbuild-treact-project.dockerkill$(dockerps|awk'/ci-project/{print$1}')dockerrun-d-p3000:80ci-project脚本添加位置如图,我们的配置工作就完成了,再接再厉,开始搭建吧!构建任务与之前相同。返回到任务详细信息并单击立即构建。开始构建时,可以查看构建任务详情判断是否成功。尝试访问服务[ip:3000],如果出现如下反应Service界面,说明成功!
