Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件,Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。
Jenkins具有非常优秀显著的特性。
- 安装jdk1.8的jdk环境
- 下载Jenkins的war包 中文官网地址:https://www.jenkins.io/zh/
- 运行命令:java –jar Jenkins.war –httpPort=8080
打开浏览器进入链接 http://localhost:8080
注意事项:
替换国外的插件安装地址:点击左边菜单栏的Manage Jenkins—>Manage plugins—>高级—>替换地址https://jenkins-zh.gitee.io/update-center-mirror/tsinghua/update-center.json
- 当你进入http://localhost:8080 先进行解锁Jenkins 选择你所需的插件,可以选择无脑的安装推荐的插件,其次创建你登录的管理员用户,最重要的是安装全局安装配置。位置在Manage Jenkins—>Manage plugins—>Global Tool Configuration
- 利用jenkins构建maven项目时需要安装maven的插件,在插件管理中搜索Maven Integration
构建maven项目
在左边菜单栏目中选择新建item,输入你的项目名称,选择maven项目,在源码管理中选择自己的项目仓库地址,其它地方暂不做修改,(github仓库的地址是用https而不是ssh的形式),点击保存应用。
此时,选择build构建此项目,项目便可以正常启动了,是不是很简单呢。
参考博文:https://blog.csdn.net/achi010/article/details/93708768
Docker-compose安装(推荐)
compose文件
version: '3.1'
services:
jenkins:
image: jenkinsci/blueocean:latest
volumes:
- /etc/localtime:/etc/localtime:ro
- ./volume/data/jenkins/:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- ./maven-setting/apache-maven-3.8.1:/maven-setting/apache-maven-3.8.1
- ./repository:/repository
ports:
- "8080:8080"
expose:
- "8080"
- "50000"
privileged: true
user: root
restart: always
container_name: jenkins
environment:
- TZ=Asia/Shanghai
ip+8080访问,进入到容器内部将密码粘贴(cat /var/jenkins_home/secrets/initialAdminPassword) ,查看日志可以查看对应的密码,我这里是:6f49641e1b254762a77cdcae11797af5,密码输入完成后选择自动安相应插件。
插件下载
- 安装maven插件 —-jenkins利用Maven编译,打包所需插件
- 安装插件:Deploy to container —-支持自动化代码部署到tomcat容器
- 安装插件:Publish Over SSH :通过ssh连接
- 安装ssh插件
- 安装docker代理插件:Docker Pipeline
在使用流水线时假设你没有单独安装maven,可以使用代理下载maven但是需要提前安装mav插件,否则会提示:Invalid agent type “docker” specified. Must be one of [any, label, none]
系统配置
- 配置ssh
配置全局配置
安装jdk
可以从下拉列表选择从com.sun下载,选择版本后,记得填写好自己的oracle的账号密码,因为下载需要账号和密码,也可以通过挂在宿主机形式挂载的话就要像我compose文件那样
安装maven
maven我是通过挂在的形式去实现的,先把maven包拷贝到宿主机指定目录,然后通过挂在到容器内的你自己定义好的目录,在通过jenkins部署时配置下环境变量让它生效即可,然后将你的脚本放到对应ssh服务器的文件夹中,当然你也可以通过touch文件在执行compose up启动也可
Compose 实现自动化部署Springboot
在我们的boot项目pom文件中使用编译自动打包上传
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.2.2</version> <executions> <!-- 用户只需执行mvn package,就会自动执行mvn docker:build 测试环境无需这样做 --> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <imageName>${project.artifactId}:${project.version}</imageName> <dockerHost>http://192.168.1.148:2375</dockerHost> <baseImage>java:8</baseImage> <entryPoint>["java", "-jar", "-Dspring.profiles.active=sit","/${project.build.finalName}.jar"] </entryPoint> <!-- 这里是复制 jar 包到 docker 容器指定目录配置 --> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory><!--jar 包所在的路径,即对应 target 目录--> <include>${project.build.finalName}.jar</include> <!-- 就是我们pkg打包后的simone-app-1.0-SNAPSHOT.jar --> </resource> </resources> </configuration> </plugin> </plugins> </build>
然后再jenkins中配置对应的命令。点击系统配置,然后配置上对应的ssh参数,因为我们点击构建的时候会把代码上传到jenkins某个路径下,并且将boot项目打包成一个image镜像文件,我们配置ssh参数是为了下面的脚本能够执行,因为它会先在root目录下,然后我们通过我们的命令执行对应的docker-compose.yml文件,就会把我们的镜像通过compose的方式进行打包部署
- 填写我们要执行的脚本命令
version: '3'
services:
simone-app:
image: simone-app:1.0-SNAPSHOT
container_name: simone-app-container
restart: always
environment:
- TZ=Asia/Shanghai
ports:
- 20020:20020
volumes:
- /volume/logs:/var/logs
networks:
devops:
name: devops
external: true
k8s 实现自动化部署Springboot
- 第一步:我的jenkins是148服务器,k8s部署在110服务器,首先通过命令将maven配置同时进行maven pkg,但是在构建过程中遇到了问题,说我们命令没有权限执行
我本事是以root用户运行的,并且具备对应权限运行不知道为啥还会爆出权限不足,可能这个root是个假的root吧, 因为当映射本地数据卷时,/muvolume/jenkins目录的拥有者为root用户,而容器中root估计是个假人 所以需要对maven对应的安装目录进行赋权。
chmod 777 -R /root/project-server/jenkins/maven-setting/apache-maven-3.8.1
- 第二步:是通过将打包好的jar包打成镜像文件并上传到我们148的harbor私有仓库上去
- 第三部是ssh到我们110服务器也就是我们k8smaster主机上,执行对应的Delpoment脚本实现部署
FROM openjdk:8u201-jdk-alpine3.9
MAINTAINER heian<1158139789@qq.com>
#系统编码
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
#声明一个挂载点,容器内此路径会对应宿主机的某个文件夹
VOLUME /tmp
#应用构建成功后的jar文件被复制到镜像内,名字也改成了app.jar
ADD target/getway-1.0-SNAPSHOT.jar app.jar
#启动容器时的进程
ENTRYPOINT ["java","-Xms256m","-Xmx512m","-jar","/app.jar"]
EXPOSE 30020
cho "开始部署嘞,兄弟们,工作名称为:" + ${JOB_NAME}
export MAVEN_HOME=/maven-setting/apache-maven-3.8.1
export PATH=$PATH:$MAVEN_HOME/bin
mvn --version
mvn clean package -Dmaven.test.skip=true
echo "maven package 结束" + ${JOB_NAME}
echo "------------- 远程148机器的root用户目录 ----------------"
echo "开始部署嘞,兄弟们,工作名称为:" + ${JOB_NAME}
echo "构建镜像 开始"
cd /root/project-server/jenkins/volume/data/jenkins/workspace/${JOB_NAME}/simone-getway/
docker build -t simone-getway:1.0 -f ./Dockerfile .
echo "构建镜像 结束,开始上传到harbar私有仓库"
oldImg="simone-getway:1.0"
myImg="192.168.1.148:81/myshop/simone-getway:1.0"
docker login 192.168.1.148:81 -u admin -p Harbor12345
docker tag ${oldImg} ${myImg}
docker push ${myImg}
docker images
echo "-----镜像上传结束-----"
echo "------------- 远程110机器的root用户目录 ----------------"
echo "准备发布Deplyment"
kubectl create -f << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: simone-getway
namespace: default
spec:
replicas: 1 #Pod副本期待数量
selector:
matchLabels: #定义RS的标签
app: simone-getway #符合目标的Pod拥有此标签
template:
metadata:
labels:
app: simone-getway
spec:
containers:
- image: 192.168.1.148:81/myshop/simone-getway:1.0
imagePullPolicy: IfNotPresent
name: simone-getway
ports:
- containerPort: 30020
protocol: TCP
volumeMounts:
- name: logdir
mountPath: /logs
- name: localtime
mountPath: /etc/localtime
- name: timezone
mountPath: /etc/timezone
imagePullSecrets:
- name: docker-harbor-registry
volumes:
- name: logdir
emptyDir: {}
- name: localtime
hostPath:
path: /etc/localtime
- name: timezone
hostPath:
path: /etc/timezone
EOF
kubectl get pods