jenkins简介
Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。
CI(Continuous integration持续集成)持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。
[root@server2 ~]# rpm -ivh jdk-8u171-linux-x64.rpm
[root@server2 ~]# rpm -ivh jenkins-2.283-1.1.noarch.rpm
[root@server2 ~]# cd /var/lib/jenkins/
[root@server2 jenkins]# systemctl start jenkins
[root@server2 jenkins]# vim hudson.model.UpdateCenter.xml
[root@server2 updates]# sed -i.bak 's/http:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
[root@server2 updates]# sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
docker
先搭建一个本地仓库:
[root@server2 ~]# yum install docker-ce -y
[root@server2 ~]# docker info
[root@server2 ~]# systemctl enable docker.service
[root@server2 ~]# systemctl start docker.service
[root@server2 ~]# sysctl -a | grep bridge-nf-call-iptables
[root@server2 ~]# vim /etc/sysctl.d/docker.conf
[root@server2 ~]# sysctl --system
[root@server2 ~]# docker pull registry
[root@server2 ~]# docker history registry:latest
[root@server2 ~]# docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry
[root@server2 ~]# chmod 777 /var/run/docker.sock
在jenkins 中编写一个Dockerfile
[root@server1 ~ ]# cd demo
[root@server1 demo]# vim Dockerfile
FROM nginx
COPY index.html /usr/share/nginx/html
[root@server1 demo]# git add Dockerfile
[root@server1 demo]# git commit -m "add Dockerfile"
[root@server1 demo]# git push origin master
在jenkins中安装插件
测试上传镜像:
[root@server2 ~]# docker pull nginx
[root@server2 ~]# docker tag nginx:latest localhost:5000/nginx:latest
[root@server2 ~]# docker push localhost:5000/nginx:latest
再次测试:
[root@server1 demo]# vim index.html
www.westos.org
www.westos.org
www.westos.org
www.westos.org
[root@server1 demo]# git commit -a -m "update index.html"
[root@server1 demo]# git push origin master
修改docker.sock权限,不然jenkins无法直接执行docker命令:
[root@server2 ~]# chmod 777 /var/run/docker.sock
替换成私有仓库
仓库我这里使用的是sever11,提前搭好的直接使用,只需将证书给server2 server3
[root@server11 docker]# scp -r certs.d/ server2:/etc/docker/
[root@server11 docker]# scp -r certs.d/ server3:/etc/docker/
在项目test配置中修改仓库位置,如下图:
再次点击立即构建,查看控制台
Jenkins使用tls方式连接docker构建主机
生成key和ca证书
[root@server3 ~]# openssl genrsa -aes256 -out ca-key.pem 4096
[root@server3 ~]# openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
生成server-key和csr文件(server3为dcker主机名)
[root@server3 ~]# openssl genrsa -out server-key.pem 4096
[root@server3 ~]# openssl req -subj "/CN=server3" -sha256 -new -key server-key.pem -out server.csr
可以使用ip地址方式进行tls连接
[root@server3 ~]# echo subjectAltName = DNS:server3,IP:172.25.3.3,IP:127.0.0.1 >> extfile.cnf
[root@server3 ~]# echo extendedKeyUsage = serverAuth >> extfile.cnf
[root@server3 ~]# openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cn
Jenkins使用tls方式连接docker构建主机
安装docker证书:
[root@server3 ~]# cp ca.pem server-cert.pem server-key.pem /etc/docker/
[root@server3 ~]# cp /usr/lib/systemd/system/docker.service /etc/systemd/system/docker.service
[root@server3 ~]# vim /etc/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2376
[root@server3 ~]# systemctl daemon-reload
[root@server3 ~]# systemctl restart docker
[root@server3 ~]# netstat -antlp | grep 2376
添加证书.
[root@server3 ~]# cat key.pem
[root@server3 ~]# cat cert.pe
[root@server3 ~]# cat ca.pem
将这三个添加到其中。
新建一个任务,这里是我创建好的截图
现在进行配置
添加docker交付任务
安装一个SSH插件
[root@server1 demo]# cat index.html
www.westos.org
www.westos.org
www.westos.org
www.westos.org
hello world
hello world
[root@server1 demo]# git commit -a -m "update index.html v2"
[root@server1 demo]# git push origin master
[root@server3 ~]# curl localhost
jenkins结合ansible
添加ansible交付任务:
Jenkins服务器提前部署好到目标主机的ssh免密,并安装ansible软件包。
由于是以jenkins用户调用ansible命令,所以需要设置jenkins用户到目标主机的免密。
新建playbook代码仓库
[root@server1 playbook]# tree .
.
├── ansible.cfg
├── httpd.conf.j2
├── inventory
│ ├── prod
│ └── test
├── playbook.yml
└── README.md
[root@server1 playbook]# vim ansible.cfg
[defaults]
command_warnings=False
remote_user=jenkins
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
[root@server1 playbooke]# vim playbook.yml
---
- hosts: all
tasks:
- name: install httpd
yum:
name: httpd
state: present
- name: start httpd
service:
name: httpd
state: started
[root@server1 playbooke]# mkdir inventor
[root@server1 playbooke]# cd inventor/
[root@server1 inventor]# ls
prod test ## 填写主机名
在执行playbook时可以指定inventory文件: test、prod
只需指定git仓库即可,无需gitlab主动触发,因为需要手动选择inventory构建参数
[root@server4 ~]# groupadd -g 996 jenkins
[root@server4 ~]# useradd -u 998 -g 996 jenkins
[root@server4 ~]# echo westos| passwd --stdin jenkins
[root@server2 ansible]# usermod -s /bin/bash jenkins
[root@server2 ansible]# su - jenkins
-bash-4.2$ cd workspace/
-bash-4.2$ ls
-bash-4.2$ cd ansible
-bash-4.2$ ssh-keygen
-bash-4.2$ ssh-copy-id server4
注意:要在jenkins上执行一下,会同步到文件