构建CICD流程-5 centos主机安装jenkins

249 阅读3分钟

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

访问以下页面路径的文件获取密码

image-20220401180929237.png

5.安装插件-安装推荐的插件

image-20220401180838207.png

6.安装进行中

image-20220401180800837.png

7.创建管理员账户密码

image-20220401180656101.png

8.jenkins安装完成,开始使用jenkins

image-20220328141515678.png

9.新建pipeline Item 编写脚本

配置如下图所示:

image-20230222180045270.png

下面是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
doneif [ ${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界面点击“立即构建”,经过一段时间,提示构建成功:

image-20230222180617362.png