1、jenkins与gitlab互联html
1、jenkins与gitlab互联
1. 安装gitlab相关的插件
在可用的插件处搜索gitlab插件java
GitLab、Gitlab Authentication、GitLab Logonode
Blue Ocean 最新版的jenkins已经自动安装了python
2. 在jenkins服务机器上生成 ssh key
要想自动化让jenkins从gitlab上拉取代码,就须要配置ssh密钥,这样验证时就不用输入密码等操做了git
# 若是是镜像部署jenkins的方式需求进入容器 docker exec -it 容器id /bin/bash # 建立ssh密钥 ssh-keygen # 查看生成的公钥 ~/.ssh/id_rsa.pub cat /root/.ssh/id_rsa.pub bash-5.0# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa Your public key has been saved in /root/.ssh/id_rsa.pub The key fingerprint is: SHA256:NELUf0otf4+lY24wF5Lmt/lDCkUWGNJ+EALe+6OIocE root@ab165f23961b The key's randomart image is: +---[RSA 3072]----+ | .oo.o.o+.. | | .. o o+ o | | ..oo..+. | | o .=.*o. | | So Bo. . | | . o.= +..| | E . o.*oB | | o o . . ..O..| | . . . . +.oo| +----[SHA256]-----+ # 查看私钥 bash-5.0# cat /root/.ssh/id_rsa id_rsa id_rsa.pub # 查看公钥 bash-5.0# cat /root/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDR3yL8WPCyZ1YdPZ0ndBpxpUZd5sxqpBg8AgsWMt8aYu5tzU7/4XrKMNaDVBHfhWFjgErY7WUhz4ZZtKF0vBdxrwAJFGcE/iytnyWIjm8NA9743osdcdEjkqwhr2g9/UmTh37Dfa1OqdEsecwRFeBu6KFdlFSlcXsaOKESq1QEDf96C+5u4uCavMvZj5PBAw5ekx22NaTWPEmGI/2xygn0yEeWvPrUzkX0M5EE64mczL/O/W/bW1RdvVaUBByvIytNDdQ1vUVvaoA+kR/t77H6jQ8C3Lr4y5SpA4I7pxMX/VSVzd9LhO60Bn8y18E8+hLLPOSEUbxWtS6WJ//pQj63cD7sL+e9nmRSVDwoCoDsCv9Bi0yR0Ub8NyQW+GgofRXdgDrOdR/Gqt4etq7OIIfslga7+TuSwsHARpxpbaenLu0AYYTYXVX4uEYsPLRlj3ebAlaz/0zXCKM9qIEfrCZZ1fm1PcQ5MQwohRA1log/dzegYFQ9ZN3Rd3raMj9g9CM= root@ab165f23961b
3. 登录gitlab配置ssh密钥-公钥web
在jenkins服务器上无需输入帐密拉取代码docker
bash-5.0# git clone git@192.168.0.152:makemoney/testproject01.git Cloning into 'testproject01'... The authenticity of host '192.168.0.152 (192.168.0.152)' can't be established. ECDSA key fingerprint is SHA256:LsgUyXjraZbqPdGdwEgGnLHsbsREzqj5JJUmHerQ9oc. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.0.152' (ECDSA) to the list of known hosts. remote: Enumerating objects: 11, done. remote: Counting objects: 100% (11/11), done. remote: Compressing objects: 100% (8/8), done. remote: Total 11 (delta 2), reused 0 (delta 0) Receiving objects: 100% (11/11), done. Resolving deltas: 100% (2/2), done.
4. 在jenkins上配置到gitlab无交互式拉取代码
jenkins - 系统管理-ManageCredentials - 全局凭据-添加凭据shell
4.1 jenkins服务器上查看私钥后端
bash-5.0# cat ~/.ssh/id_rsa # 而后将其复制到下图的公钥中
4.2 jenkins控制台添加私钥安全
其实凭据也能够是经过gitlab里建立的token,来实现jenkins与gitlab互联的
gitlab上建立token
用户头像---setting---access tokens
还有几种方式建立凭据
5. 建立任务
5.1 建立任务- 配置项目git地址- 选择配置的ssh证书- 当即构建
5.2 项目仓库上面配置好了,没有报错表示jenkins能够从gitlab拉取代码了,点击当即构建
5.3 查看控制台输出,验证构建结果
5.4 去jenkins服务上验证项目是否pull下来了
默认拉取的代码放在目录中cd /var/lib/jenkins/workspace/,仓库的代码放在以之间建立任务名为目录名的目录里
bash-5.0# cd workspace/testproject-testconnect bash-5.0# ls -lrt total 12 -rw-r--r-- 1 root jenkins 21 Nov 29 05:37 index.html -rw-r--r-- 1 root jenkins 35 Nov 29 05:37 first-test.txt -rw-r--r-- 1 root jenkins 62 Nov 29 05:37 README.md
5.5 在jenkins服务器上配置与后端服务器互联
### 首先得让jenkins与后端服务器无密链接 # 生成密钥,这步刚才已经作了省略 ssh-keygen # 将jenkins的公钥复制到后端预安装服务的机器上【本地的ssh公钥文件安装到远程主机对应的帐户下authorized_keys】 ssh-copy-id 远端服务的ip [root@python-node01 ~]# ssh-copy-id 192.168.0.150 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.0.150's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh '192.168.0.150'" and check to make sure that only the key(s) you wanted were added. # 而后测试下ssh登录,时候须要密码 ssh 192.168.0.150
5.6 在jenkins上配置构建
构建就是配置脚本或shell命令如何自动将服务部署起来
5.7 经过shell命令的方式触发服务部署步骤【为了测试效果】
# 脚本内容以下 # 实现jenkins与生产服务器的免密登录[若是下面这样写了,上面就不用手动在jenkins服务器上操做了] #ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.0.150 # 切换目录到代码目录 cd /var/lib/jenkins/workspace/power-test01 # 打包压缩代码 tar czvf code.tar.gz * # 将代码拷贝到生产服务器上 scp code.tar.gz root@192.168.0.150:/app/code # 关闭如今运行的服务 ssh root@192.168.0.150 "PID=\$(ps aux |grep -v grep |grep main.py|awk '{print \$2}');kill -9 \$PID" # 解包并将代码复制到部署目录中 ssh root@192.168.0.150 "rm -rf /app/run/* && cd /app/code && tar xvf code.tar.gz -C /app/run" # 安装项目依赖包并运行服务 ssh root@192.168.0.150 "cd /app/run && pip install -r requirements.txt && nohup python main.py >/dev/null 2>&1 &"
5.8 查看控制台输出
5.9 访问服务
更新代码,提交gitlab,而后jenkins点击任务的构建,服务就被更新了。
6 建立触发器
前面这种发现仍是不够方便,开发人员更新代码后还须要手动操做jenkins构建,感受仍是很麻烦,那么解决方案就是建立触发器的方式,即当监控某个分支代码有变更时自动调用jenkins进行部署
6.1 代码仓库建立测试分支
# ide或git操做界面,换到项目中,而后建立分支 cd ~/test-gitlab02/ && git branch dev-20201227 && git add . && git commit -m "test hook"
6.2 jenkins安装插件
系统管理-管理插件-可选插件-Gitlab Hook和Gitlab Authentication[以前已安装]
6.3 修改全局权限
修改成全部登录用户能够任何操做
6.4 建立一个开发分支的任务
首页-新建任务-输入任务名-选择Freestyle project的方式建立
注:构建的任务job配置文件,在jenkins服务器的以下位置
[root@jenkins power-test01]# ll /var/lib/jenkins/jobs/ 总用量 0 drwxr-xr-x 3 root root 61 12月 27 23:50 power-dev drwxr-xr-x 3 jenkins jenkins 61 12月 27 20:52 power-test01
6.5 生成一个token
jenkins机器上建立一个token
[root@jenkins power-test01]# openssl rand -hex 12 c8b2faf57578b62cb7b75105
6.6 经过触发远程构建的方式构建触发器
6.7 验证触发器
curl http://192.168.0.153:8080/job/power-dev/build?token=c8b2faf57578b62cb7b75105 # 发现访问一次dev的任务就构建了一次,实验成功
6.8 在gitlab上配置触发器hook
在gitlab上配置触发器hook,从而实现push代码是,触发配置的url,从而联动jenkins构建部署操做
本次选择的是当仓库有更新事件发生是触发
6.9 gitlab上测试效果
test报错403错误时Hook executed successfully but returned HTTP 403,咱们需要进入jenkins 系统设置-Configure Global Security中,关闭(去掉勾选:防止跨站点请求伪造),而后在点击gitlab webhooks test OK 返回201 成功。
老版本的jenkins是能够在安全配置里直接关闭csrf的,但Jenkins版本自2.204.6以来的重大变动有:删除禁用 CSRF 保护的功能。
须要修改jenkins配置文件/etc/sysconfig/jenkins
#JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true" JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true" # 修改好后重启jenkins便可 systemctl restart jenkins && systemctl status jenkins
再次在gitlab上测试,发现ok了。
好了,经过Jenkins联动gitlab实现推送代码到仓库就自动部署就到这里了,我这里只是管中见豹,Jenkins发布还有经过pipline流水线方式,设置每步执行的任务,可视图方式查看每步执行过程,还有Jenkins单点压力过大,也支持搭建分布式等等,有不少方式就待咱们一块儿去探索发现吧……