目录
1.设计要求:
- 基于docker安装与部署,以保持系统的一致性和可维护性
- 同步/部署的项目数据能自动/手动根据任务配置,版本分支部署
- 假设有git 项目仓库t1, t1的staging(自动)和live(手动)分支部署到目标主机目录
- 支持备份
2.方案
- 安装 docker / git / jenkins / posfix / dovecot
- 新增系统用户 git (用于拉取仓库), jenkins (用于调用shell脚本与收邮件)
3.实施步骤
3.1 准备
- 用户 jenkins 属组
[root@vmtpl01 ~]# id jenkins
uid=1002(jenkins) gid=1002(jenkins) groups=1002(jenkins),10(wheel),1003(www-data)
- 域名:git.{xxx}.com / jenkins.{xxx}.com / mail.{xxx}.com / smtp.{xxx}.com
- 用户密匙两对: for git / jenkins
- 开放防火墙端口
# jenkins访问
firewall-cmd --add-port=8080/tcp --permantent
# 邮件相关
firewall-cmd --add-port=25/tcp --permantent
firewall-cmd --add-port=110/tcp --permantent
firewall-cmd --add-port=143/tcp --permantent
3.2 安装:
docker
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io
git
$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
$ yum install git
sudo groupadd git
sudo useradd git -g git
拷贝用户公匙到 /home/git/.ssh/authorized_keys
cat {path}/id_rsa.pub >> /home/git/.ssh/authorized_keys
初始化git仓库 (git@git.xxx.com:/data/gitrespo/t1.git):
$ mkdir /mnt/gitrepo
$ chown git:git /mnt/gitrepo
$ cd /mnt/gitrepo
$ git init --bare t1.git
$ chown -R git:git t1.gi
用配好的git用户访问t1, 上传一些测试文件
jenkins
方式一 (docker compose 方式)
docker-compose.yml, jenkins数据将保存在 /var/lib/docker/volumes/jenkins_jenkins_data & jenkins_jenkins_docker_certs
version: '3'
services:
jenkins:
restart: always
image: jenkinsci/blueocean:latest
container_name: jenkins
privileged: true
ports:
- '8080:8080'
- '50000:50000'
volumes:
- 'jenkins_data:/var/jenkins_home'
- 'jenkins_docker_certs:/certs/client'
- '/usr/bin/docker:/usr/local/bin/docker'
volumes:
jenkins_data:
driver: local
jenkins_docker_certs:
driver: local
方式二 (传统方式)分别安装与运行两个镜像 docker:dind 与 jenkinsci/blueocean, 其中做了 /mnt 映射
首先,建立容器间通信,建立相关的volumes以持久化应用数据 (将保存在/var/lib/docker/volumes)
docker network create jenkins
docker volume create jenkins_docker_certs
docker volume create jenkins_data
docker container run \
--name jenkins-docker \
--detach \
--privileged \
--network jenkins \
--network-alias docker \
--env DOCKER_TLS_CERTDIR=/certs \
--volume jenkins_data:/var/jenkins_home \
--volume jenkins_docker_certs:/certs/client \
--volume /mnt:/mnt \
--publish 2376:2376 \
--restart=always \
docker:dind
docker container run \
--name jenkins-blueocean \
--detach \
--network jenkins \
--env DOCKER_HOST=tcp://docker:2376 \
--env DOCKER_CERT_PATH=/certs/client \
--env DOCKER_TLS_VERIFY=1 \
--publish 8080:8080 \
--publish 50000:50000 \
--volume jenkins_data:/var/jenkins_home \
--volume jenkins_docker_certs:/certs/client:ro \
--volume /mnt:/mnt \
--restart=always \
jenkinsci/blueocean
Jenkins 系统配置
安装插件:SSH plugin / SSH
系统管理 =》Manage Credentials =》凭据:添加 git和jenkins 的私匙
系统管理 =》系统配置 =》全局属性 配环境变量键值对列表:
- $RSYNC : /usr/bin/rsync
系统管理 =》系统配置 =》SSH remote hosts
邮件通知
Jenkins 项目与任务
- 新建项目文件夹T1
- 在T1下构建 “一个自由风格的软件项目” webapp_staging
- 源码管理
- 触发器定义(git提交后调用),不需要则略过
-- 定义令牌,远程访问url如: JENKINS_URL/view/all/job/T1/job/webapp_staging/build?token=xxxx
-- git hook 定义步骤:
- 在jenkins的要用户管理新添访问用户 “api-builder” 及其密码
- 编辑在git服务器上面的仓库 t1.git/hooks/post-receive,内容:
#!/bin/sh
curl http://api-builder用户:api-builder密码@{domain}:8080/view/all/job/T1/job/webapp_staging/build?token=XXXX
注:记得 chown git:git post-receive, chmod 755 post-receive
- 构建
- sh 脚本
#!/bin/bash
/usr/bin/rsync -avzP -e "ssh -i /data/Auths/ssh/jenkins/id_rsa" /mnt/jenkins_git_repos/t1_staging/ jenkins@{IP}:/data/Projects/Test/t1/staging --delete --chown=nginx:nginx --exclude-from=/data/Settings/common/exclude.list
测试结果,完成。
3.3 与GitLab集成
当仓库在gitlab上,而且需要做webhook时,参考以下配置:
首先,编辑任务,让它在push staging分支时触发:如下图配置,注意 webhook URL 和 secret token都是不一样的!
其次,进入gitlab项目(如:Ben Bi > iot-age-te001 > Webhook Settings > Webhook),填入对应项目,然后进行提交测试。
3.4 备份
应用thinbackup 插件备份方案 (jenkins备份与恢复【转】 - paul_hch - 博客园)
备份路径: /data0/Server/Backups/jenkins