之前给公司搭建过一套 gitlab+gerrit+jenkins 的持续集成环境,由于操作起来有点繁琐,自己也没太搞清楚该怎么用,所以一直就只用了 gitlab 来做代码管理。最近要做一个项目自动部署的功能,使用过 jenkins 一定知道他的自动化功能。所以就从 jenkins 创建自动部署任务的方式来入手。
jenkins 可以配置触发器,当有新的提交时,触发执行相应的任务。由于 jenkins 和项目部署不在同一服务器上,所以我想用 ssh 到远程服务器后执行对应的部署脚本来做自动部署。
我是按照倒推的思路来完成整个流程的。
项目是用 git 管理的,首先脚本要能够实现切换到指定目录下后 pull 对应的分支。
- #! /bin/bash
- #切换到项目路径下
- cd ~/coffee/myproject
- git checkout -f
- git clean -fd
- git pull
可以通过接收的参数,来决定切换的项目路径
- #! /bin/bash
- #切换到指定目录
- if [ "$1"x = "project1"x ];
- then
- cd ~/coffee/myproject1
- elif [ "$1"x = "project2"x ];
- then
- cd ~/coffee/myproject2
- elif [ "$1"x = "project3"x ];
- then
- cd ~/coffee/myproject3
- else
- echo "failed"
- exit
- fi
- git checkout -f
- git clean -fd
- git pull
首先在本地配置好在 jenkins 所在的服务器上可以免登录 ssh 到要部署的服务器上:利用 ssh-keygen 生成公钥后,粘贴到目标服务器上~/.ssh/authorized_keys 文件中。此时在 jenkins 服务器上即可远程执行更新脚本 /
- ssh root@192.168.1.100 "/root/myscript/pull.sh project1"
(1) 填写项目名称
(2) 在源码管理的位置,选择 git,在 Repository URL 里填写项目的 URL,结果遇到报错
- stdout:
- stderr: Permission denied (publickey,keyboard-interactive).
- fatal: Could not read from remote repository.
- Please make sure you have the correct access rights
- and the repository exists.
这种权限错误,一般是因为 ssh 公钥没有添加到 git 服务器上。但是这里需要注意的一点是,需要填写 jenkins 用户下的公钥。
执行 su - jenkins 后,发现没有任何反应。原因是 / etc/passwd 中的 / bin/bash 变成了 / bin/false。
- sudo vim /etc/passwd
将
- jenkins:x:103:160:Jenkins Continuous Integration Server:/var/lib/jenkins:/bin/false
改为
- jenkins:x:103:160:Jenkins Continuous Integration Server:/var/lib/jenkins:/bin/bash
这时执行 su - jenkins 后可以切换用户,但是命令提示符的用户名显示的是
- -bash-4.1$
解决方法是在 jenkins 用户下的 bash_profile 添加命令行提示符环境变量
- vim ~/.bash_profile
添加
- export PS1='[\u@\h \W]\$'
加载修改完的 bash_profile:
- source ~/.bash_profile
此时前面的用户名提示恢复正常:
- [jenkins@localhost ~]$
我在开始安装 jenkins 时,使用以下命令生成过公钥 jenkins.pub:
- ssh-keygen -C jenkins@163.com
将公钥添加到 gitlab 后,仍然报权限错误。此时看到 gitlab 上添加 ssh 公钥说明,生成公钥需要选择 - t rsa,而 ssh-keygen 默认使用的加密是 dsa。
使用命令
- ssh-keygen -t rsa
将新生成的公钥添加到 gitlab 服务器上,
之后就不再报权限错误了。
Branch Specifier (blank for'any')填写自己要响应的分支变化。
(3) 构建触发器选择
首先需要在 jenkins 安装插件 Gitlab Hook Plugin, 安装完之后在构建触发器就能看到:
- Build when a change is pushed to GitLab.GitLab CI Service URL: http: //xxx.com/project/myproject1
选中该选项。因为要在有 push 事件发生时,进行自动部署,因此勾选 Build on Push Events。
(4) 构建里选择增加构建步骤 ->Execute shell
Command 里写远程执行更新脚本的命令
- ssh root@192.168.1.100 "/root/myscript/pull.sh project1"
(5) 可选:如果想要一个失败的消息通知,可以在构建后操作里,增加构建后操作步骤 ->Email Notification,填写自己的邮箱即可
点击保存。
但是此时还没有配置完,我们需要通过 gitlab 的 web hooks 的功能,来让 jenkins 接收到 push 的消息。
4、 配置 web hooks
刚才在构建触发器里有一项,里面提供的地址就是我们要在 gitlab 的 web hooks 里填写的地址 (下面只是我的一个示例地址)
- Build when a change is pushed to GitLab.GitLab CI Service URL: http: //xxx.com/project/myproject1
填写完之后,我们的整个自动部署流程就已经可以运行了。自己 push 一下试试吧。
参考:
来源: http://www.bubuko.com/infodetail-1968219.html