Jenkins是什么
Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。
安装Jenkins
Jenkins 支持多种安装方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。这里介绍Docker的安装方式。
安装Docker
见 http://www.884358.com/centos-install-docker/
在Docker中下载并运行Jenkins
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
启动后即可通过服务器IP:8080端口访问。
初次登录按照提示在文件/var/jenkins_home/secrets/initialAdminPassword
中查看登录密码。
docker exec -it [容器ID] /bin/bash
cat /var/jenkins_home/secrets/initialAdminPassword
PS:容器ID可以通过docker ps
查看获得。
安装插件
点击选择插件来安装
,然后搜索并勾选Git plugin
和 Publish Over SSH
两个插件。默认Git plugin是勾选的,但Publish Over SSH没有。
创建管理员用户
插件安装完成后,页面跳转到管理员用户添加页面。按照提示创建管理员:
完成安装
发布PHP代码
实验环境准备
目前我们有一台服务器,通过docker方式安装了一台Jenkins服务器。我们希望通过docker容器里的Jenkins发布php代码到宿主主机。
172.17.0.1 远程服务器(宿主主机)
172.17.0.2 Jenkins服务器
另外还需要一个远程的公开的git仓库(php代码在这个仓库里)
准备git仓库
准备好一个git仓库,可以是github的,也可以是自己搭建的gitlab。
我这里作为测试,在github上创建了一个仓库,地址:https://github.com/dedemao/test-jenkins
仓库里就1个文件:index.php,文件内容如下:
<?php
echo "hello,jenkins!";
?>
一会通过Jenkins将这个代码发布到服务器上的指定目录。
配置ssh免密登录
在Jenkins服务器生成密钥文件:
docker exec -it [容器ID] /bin/bash
ssh-keygen -m PEM -t rsa -b 4096 -f /root/.ssh/jenkins
命令执行后将会在/root/.ssh/文件夹下生成两个文件,一个文件是私钥(jenkins),一个是公钥(jenkins.pub)
生成密钥对后,把公钥(jenkins.pub)的内容粘贴到远程服务器(宿主主机)的/root/.ssh/authorized_keys 文件里。
拷贝完公钥之后,在容器中使用以下命令手动测试一下能否通过ssh登录远程服务器(宿主主机):
ssh -p 22 -i /root/.ssh/jenkins 172.17.0.1
能正常登录则代表没有问题,如果出现让你出入用户密码的情况则是密钥没有配置成功,配置成功的情况下登录是不需要密码的。
配置Jenkins
登录Jenkins,在左侧点击系统管理
,然后点击系统配置
:
在系统配置页面向下拉到页面底部,找到Publish over SSH
将上一步在Jenkins服务器生成的私钥(/root/.ssh/jenkins)文件的内容复制到Key中,然后点击新增:
然后完成远程机器的配置,点击 “Apply” 后如果不需要再继续添加远程机器则点击 “保存” 即可:
新建任务
以上我们配置完了插件以及远程机器,现在就可以开始新建任务了:
输入任务名称,选择构建一个自由风格的项目
,点击确定:
输入任务描述:
源码管理选择git:
最后就是 “构建” ,最核心的一步,选择 “Send files or execute commands over SSH” :
设置好后,点击保存即可。
发布
完成以上操作后,就可以使用这个刚刚创建的任务去工作了,点击左面的 “立即构建” ,就能把git上的代码发布到指定的服务器上:
正在构建
构建完成
查看日志
选择控制台输出:
到远程机器上查看代码是否已发布:
如上,可以看到文件都同步成功了,而且文件的权限组也是我们设置的www。之后只要远程仓库里的源文件的内容发生改变,需要同步到线上则只需要点击该任务的 “立即构建” 即可。
自动构建
通过以上设置,当代码有变化时,需要手动点击“立即构建”才可以同步代码。这是一件很繁琐的事情,如何实现当代码提交到github时自动触发构建功能,目前,有效的解决方案是使用“钩子(webhook)”。
适用于GitHub
安装Github插件
需要配合安装Github
插件。
在系统管理->插件管理处查看是否已安装了github插件:
设置构建触发器
构建触发器勾选GitHub hook trigger for GITScm polling
设置webhook
登录github,给仓库设置webhook地址:
webhook地址为:http://你的jenkins地址/github-webhook/
注意最后的/
不能忘记了,否则会报302错误。
设置好后,提交代码,然后看看是否成功:
适用于GitLab
安装GitLab插件
安装GitLab
和GitLab Hook
插件
系统配置
在系统管理->系统配置处,找到Enable authentication for '/project' end-point
,去掉勾选:
设置构建触发器
在任务中设置构建触发器,选择Build when a change is pushed to GitLab
,并复制后面的GitLab webhook URL,下一步将复制到gitlab中。
设置webhook
登录gitlab,设置web钩子:
添加后,点击测试,如果显示200,则说明配置成功:
其他
重启Jenkins
网址后面输入/restart
svn
适用于使用svn来管理代码。
安装Subversion插件
添加svn凭据
任务设置
设置轮询的方式更新代码:
最后 “构建”选择 “Send files or execute commands over SSH” ,配置方式跟上面的步骤一致。