作者:John-Li
未经允许!禁止转载!
借鉴于:https://www.yuque.com/u32605276/ggmv94/mtwg6cb4uxl52x2x?singleDoc=#Tb2yP
安装Jenkins
下载jdk或者自己上传包 https://www.oracle.com/java/technologies/downloads/
Maven下载 https://downloads.apache.org/maven/maven-3/
wget https://downloads.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
tar -xvzf apache-maven-3.8.8-bin.tar.gz
tar zxvf jdk-8u121-linux-x64.tar.gz
mv jdk1.8.0_121/ java
mv apache-maven-3.8.8/ java/maven
mv java/ /usr/local/
配置环境变量: vim /etc/profile
JAVA_HOME=/usr/local/java
MAVEN_HOME=/usr/local/java/maven
PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL JAVA_HOME MAVEN_HOME
source /etc/profile 刷新配置
java -version 验证一下
mvn -v
jenkins服务rpm包下载地址https://get.jenkins.io/redhat/
选择jenkins对需要的版本,复制链接地址或者直接点击下载都可以
wget https://get.jenkins.io/redhat/jenkins-2.361-1.1.noarch.rpm --no-check-certificate
yum install epel-release java-11-openjdk-devel -y
rpm -ivh jenkins-2.361-1.1.noarch.rpm rpm安装或者yum安装都可以
yum -y install jenkins-2.361-1.1.noarch.rpm
systemctl daemon-reload
systemctl start jenkins 启动jenkins
systemctl status jenkins 查看一下jenkins的状态
启动时间会很久,稍等3分钟后访问IP+8080
安装插件
Git server
Git Parameter
Docker
Deploy to container
Publish Over SSH
ssh
Image Tag Parameter
Yet Another Docker
Maven Integration plugin
GIT plugin
#安装好后重启Jenkins
配置SSH免密
公钥发送到后端服务器,才能实现免密;
[root@jenkins ~]# ssh-keygen
[root@jenkins ~]# ssh-copy-id -i root@后端服务器地址
配置Docker工具
系统管理-->>全局工具配置-->>Docker
添加凭据
系统管理-->> Manage Credentials
#类型选择
Docker Registry Auth
Email:(写仓库最开始网址)
https://registry.cn-hangzhou.aliyuncs.com
用户名:(登录仓库的用户名)
密码:(登录仓库的密码)
创建项目
配置jenkins机器私钥和后端机器地址
系统管理-->>系统配置-->>Publish over SSH
Publish over SSH #配置jenkins机器私钥
系统管理-->>系统配置-->>SSH Servers
SSH Servers #配置远程后端服务器
构建一个自由风格的项目
选择丢弃旧的构建设置相应参数
选择参数化构建过程中的Image Tag Parameter设置相应参数
Name(标签):DOCKER_IMAGE #可自定义
Image Name(命令空间/镜像名):aceqwe-doceker/hexo
Tag Filter Pattern(标记筛选器模式):.* #根据实际情况,可以使用正则表达式
Registry URL(仓库地址):https://registry.cn-hangzhou.aliyuncs.com
Tag Ordering(排序方式):Descending Versions(降序)
# Natural Ordering:自然排序
# Reverse Natural Ordering:反向自然排序
# Descending Versions:降序
# Ascending Versions:升序
在构建选择执行shell选项
docker login --username=用户名 -p 密码 registry.cn-hangzhou.aliyuncs.com
docker pull registry.cn-hangzhou.aliyuncs.com/${DOCKER_IMAGE}
rm -rf 项目名称.tar
docker save -o 项目名称.tar registry.cn-hangzhou.aliyuncs.com/${DOCKER_IMAGE}
docker rmi registry.cn-hangzhou.aliyuncs.com/${DOCKER_IMAGE}
设置构建后操作,将镜像压缩的包传送到目标服务器,执行脚本运行docker镜像
Name:ssh-test #设置的远程服务器
Source files(源文件):hexo.tar #镜像压缩后的名字
Remote directory(远程目录):upload #存放压缩文件目录(可自定义)
Exec command(远程脚本):/opt/upload/hexo/hexo-up.sh #脚本存放目录
编写远程脚本(可以自己增加命令与命令运行间隔时间)
#此脚本放在后端服务器上
[root@k8s-node2 upload]# cd /opt/upload/项目名
[root@k8s-node2 项目名]# vim 项目名.sh
#!/bin/bash
# 备份目录
BACKDIR=/opt/back-dir/项目名字
# 更新目录
UPDATADIR=/opt/upload/项目名字
# 新容器信息目录
NEW_CONTAINER_DIR=/opt/upload/项目名字/CONTAINER_NAME
# 旧镜像版本号
TAG=$(docker images | grep registry.cn-hangzhou.aliyuncs.com/仓库地址 | awk -F" " '{print $2}')
# 旧镜像名字
IMAGES=registry.cn-hangzhou.aliyuncs.com/仓库地址:$TAG
# 旧容器名字
OLD_CONTAINER_NAME=$(docker ps -a |grep registry.cn-hangzhou.aliyuncs.com/仓库地址 |awk '{print $NF}')
DIR(){
if [ ! -d $BACKDIR ];then
rm -rf $BACKDIR
mkdir -p $BACKDIR
fi
if [ ! -d $NEW_CONTAINER_DIR ];then
rm -rf $NEW_CONTAINER_DIR
mkdir -p $NEW_CONTAINER_DIR
fi
}
BACK(){
DIR
if [ -f $UPDATADIR/项目名字.tar ];then
mv $UPDATADIR/项目名字.tar $BACKDIR/项目名字-$(date "+%F-%T").tar
fi
mv /root/upload/项目名字.tar $UPDATADIR
}
DOCKERIMAGES(){
echo $IMAGES &>$NEW_CONTAINER_DIR/images.txt
echo $OLD_CONTAINER_NAME &> $NEW_CONTAINER_DIR/CONTAINER.txt
docker ps -a |grep '项目名字'
if [ $? -eq 0 ];then
docker stop $(cat $NEW_CONTAINER_DIR/CONTAINER.txt)
docker rm $(cat $NEW_CONTAINER_DIR/CONTAINER.txt)
fi
docker images |grep 'registry.cn-hangzhou.aliyuncs.com/仓库地址'
if [ $? -eq 0 ];then
docker rmi $(cat $NEW_CONTAINER_DIR/images.txt)
fi
}
START(){
DOCKERIMAGES
docker load < $UPDATADIR/项目名字.tar &> $NEW_CONTAINER_DIR/images.txt && \
awk -F " " '{print $3}' $NEW_CONTAINER_DIR/images.txt |awk -F"/" '{print $NF}' > $NEW_CONTAINER_DIR/NEW_CONTAINER_NAME.txt && \
sed -i "s+:++g" $NEW_CONTAINER_DIR/NEW_CONTAINER_NAME.txt && \
sed -i "s+v++g" $NEW_CONTAINER_DIR/NEW_CONTAINER_NAME.txt && \
sed -i "s+\.++g" $NEW_CONTAINER_DIR/NEW_CONTAINER_NAME.txt
sleep 3
docker run 项目启动命令
}
BACK
START