1.下载
1.wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
可能出现问题:cannot verify pkg.jenkins.io's certificate, issued by ‘/C=US/O=Let's Encrypt/CN=R3’
Issued certificate has expired. To connect to pkg.jenkins.io insecurely, use `--no-check-certificate'.
解决方法:yum install -y ca-certificates
2.rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
3.yum -y install jenkins
2.配置
vim /etc/sysconfig/jenkins
#监听端口
JENKINS_PORT="8080"
3.启动方式
方式一:systemctl start jenkins 这种启动方式默认以jenkins用户启动
方式二:以war包方式启动,这种方式以执行以下命令的用户启动
find / -name jnekins.war
启动命令:
nohup java -jar /usr/share/java/jenkins.war --httpPort=8080 &
4.访问jenkins
访问以下页面路径的文件获取密码
5.安装插件-安装推荐的插件
6.安装进行中
7.创建管理员账户密码
8.jenkins安装完成,开始使用jenkins
9.新建pipeline Item 编写脚本
配置如下图所示:
下面是shell脚本:
node {
#定义环境变量-构建目录
env.BUILD_DIR="/usr/local/build-workspace/"
#模块名
env.MODULE="cq-build-screen-backend"
#host域名
env.HOST="192.168.17.12"
#首先从git环境拉取代码
stage('Preparation') {
git 'https://codeup.aliyun.com/622aac17b0f7c700c38a8246/chongqing/cq-build-screen-backend.git'
}
#然后执行maven构建
stage('Maven Build') {
sh "mvn -am clean package"
}
#调用脚本执行构建镜像,build-image-web.sh文件见下图
stage('Build Image') {
sh "/usr/local/script/build-image-web.sh"
}
#调用脚本执行k8s发布,deploy.sh文件如下图
stage('Deploy') {
sh "/usr/local/script/deploy.sh"
}
}
build-image-web.sh文件:(该脚本配置在主机上:/usr/local/script/)
#!/bin/bash
#判断构建目录是否存在,不存在则输出日志
if [ "${BUILD_DIR}" == "" ] ; then
echo "env 'BUILD_DIR' is not set"
exit 1
fi
#定义docker构建目录
DOCKER_DIR=${BUILD_DIR}${JOB_NAME}
#判断目录是否存在,若不存在则创建相应的目录
if [ ! -d ${DOCKER_DIR} ] ; then
mkdir -p ${DOCKER_DIR}
fi
#打印日志
echo "docker workspace: ${DOCKER_DIR}"
JENKINS_DIR=${WORKSPACE}
echo "jenkins workspace: ${JENKINS_DIR}"
echo "WORKSPACE:"${WORKSPACE}
echo "MODULE:"${MODULE}
if [ ! -f ${JENKINS_DIR}/target/*.jar ] ; then
echo "target war file not found ${JENKINS_DIR}/target/*.jar"
exit 1
fi
#进入当前目录下
cd ${DOCKER_DIR}
#删除目录下所有文件
rm -rf *
#把maven构建的jar包移动到当前目录下
mv ${JENKINS_DIR}/target/*.jar .
#把项目中的DockerFile移动到当前目录下来
mv ${JENKINS_DIR}/Dockerfile .
#定义版本:年月日时分秒
VERSION=$(date +%Y%m%d%H%M%S)
#定义镜像名称
IMAGE_NAME=192.168.17.11/demo/${JOB_NAME}:${VERSION}
echo "${IMAGE_NAME}" > ${WORK_SPACE}/IMAGE
echo "building image: ${IMAGE_NAME}"
#使用docker构建镜像
docker build -t ${IMAGE_NAME} .
#将构建的镜像推送的harbor私有镜像仓库
docker push ${IMAGE_NAME}
deploy.sh文件(该脚本配置在主机上/usr/local/script/):这个文件的主要作用是组合当前项目的Deployment文件,然后用k8s发布
#!/bin/bash
#为name变量赋值
name=${JOB_NAME}
#为image变量赋值
image=$(cat ${WORK_SPACE}/IMAGE)
#为host变量赋值
host=${HOST}
echo "deploying... name:${name}, image: ${image}, host: ${host}}"
#删除当前文件夹下的web.yaml文件
rm -f web.yaml
#将以下路径下的web.yaml文件拷贝到当前目录下
cp $(dirname "${BASH_SOURCE[0]}")/template/web.yaml .
echo "copy success"
#替换web.yaml中的name变量
sed -i "s,{{name}},${name},g" web.yaml
#替换web.yaml中的image变量
sed -i "s,{{image}},${image},g" web.yaml
#替换web.yaml中的host变量
sed -i "s,{{host}},${host},g" web.yaml
echo "ready to apply"
#kubectl发布web.yaml文件
kubectl apply -f web.yaml
echo "apply ok"
#将组装好的web.yaml文件打印到jenkins控制台
cat web.yaml
#以下是健康检查内容
success=0
count=60
IFS=","
sleep 5
while [ ${count} -gt 0 ]
do
replicas=$(kubectl get deploy ${name} -o go-template='{{.status.replicas}},{{.status.updateReplicas}},{{.status.readyReplicas}},{{.status.availableReplicas}}')
echo "replicas: ${replicas}"
arr=(${replicas})
if [ "${arr[0]}"=="${arr[2]}" -a "${arr[2]}"=="${arr[3]}" ]; then
echo "health check success!"
success=1
break
fi
((count--))
sleep 2
done
if [ ${success} -ne 1 ]; then
echo "health check failed!"
exit 1
fi
上述deploy.sh文件使用到了模板文件web.yml
web.yaml文件(该脚本配置在主机上/usr/local/script/template/):每个项目的部署文件都类似,所以将web.yaml当中的变量单独提出来,抽成一个模板文件以达到通用的效果
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{name}}
spec:
selector:
matchLabels:
app: {{name}}
replicas: 1
template:
metadata:
labels:
app: {{name}}
spec:
containers:
- name: {{name}}
image: {{image}}
ports:
- containerPort: 8081
---
#service
apiVersion: v1
kind: Service
metadata:
name: {{name}}
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8081
selector:
app: {{name}}
type: ClusterIP
---
#ingress
#apiVersion: networking.k8s.io/v1
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{name}}
spec:
rules:
- host: {{host}}
http:
paths:
- path: /
backend:
serviceName: {{name}}
servicePort: 80
而后用自己的springboot-项目进行测试,以下是DockerFile文件内容:
FROM java:openjdk-8-jre-alpine
WORKDIR /home
COPY *.jar /home
ENTRYPOINT java -jar *.jar
将代码提交到gitee,然后再jenkins界面点击“立即构建”,经过一段时间,提示构建成功: