您现在的位置是:首页 >技术交流 >jenkins结合docker实现自动部署网站首页技术交流
jenkins结合docker实现自动部署
环境
使用虚拟机搭建环境,centos7.8系统
主机 | 说明 | 必要软件 |
---|---|---|
192.168.8.110 | jenkins服务节点 | jekins,jdk8,tomcat9 |
192.168.8.101 | harbor服务,docker管理镜像 | harbor |
192.168.8.111 | jenkins工作节点 | maven,jdk8,git,docker |
jenkins安装
rpm方式安装
1.安装JDK8
yum install java-1.8.0-openjdk* -y
2.yum方式安装
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins
3.启动Jenkins服务
systemctl start jenkins
systemctl enable jenkins
4.打开浏览器访问
http://192.168.8.110:8080
war方式安装
jenkins官方下载地址
选择合适的版本,注意各个版本依赖的jdk版本,如果jdk版本不符合会导致插件安装失败
下载好war包后使用tomcat部署即可
在图片给出的目录中查看登陆密码
cat /var/lib/jenkins/secrets/initialAdminPassword
登陆成功后点击“选择插件安装”,然后就是漫长的安装插件。。。。。。。。
agent工作节点配置
1.docker安装(TODO)
2.jdk8安装
下载地址:
https://www.oracle.com/webapps/redirect/signon?nexturl=https://download.oracle.com/otn/java/jdk/8u261-
b12/a4634525489241b9a9e1aa73d9e118e6/jdk-8u261-linux-x64.tar.gz
tar -zxf jdk-8u261-linux-x64.tar.gz
mv jdk1.8.0_261/ /opt/jdk1.8
3.git 安装
官网下载速度非常慢。国内加速地址大部分为windows版本。登录https://github.com/git/git/releases查看git的最新版。不要下载带有-rc的,因为它代表了一个候选发布版本。
https://www.kernel.org/pub/software/scm/git/git-2.28.0.tar.gz
1.安装依赖环境:
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
2.删除yum方式安装的git:
添加依赖时自动yum安装了git1.8版本。需要先移除git1.8版本。
yum -y remove git
tar -zxvf git-2.28.0.tar.gz
mv git-2.28.0 /opt/git2.28
./configure --prefix=/opt/git2.28
cd /opt/git2.28/
make && make install
4.maven安装
下载地址:
https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apachemaven-3.6.3-bin.tar.gz
tar -zxf apache-maven-3.6.3-bin.tar.gz.gz
mv apache-maven-3.6.3 maven
创建本地仓库:
mkdir -p /data/maven/repository
设置本地仓库目录
<localRepository>/data/maven/repository</localRepository>
配置阿里云仓库地址
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
maven工程配置jdk8编译
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
5.统一配置
vi /etc/profile
加入以下内容
export PATH
export JAVA_HOME=/opt/jdk1.8
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export MAVEN_HOME=/opt/maven
export PATH=$MAVEN_HOME/bin:$PATH
export PATH=$PATH:/opt/git2.28/bin
source /etc/profile
检测环境
java -version
mvn -v
git --version
配置软连接
ln -s /opt/jdk1.8/bin/java /usr/bin/
ln -s /opt/mvn/bin/mvn /usr/bin/
ln -s /opt/git2.28/bin/git /usr/bin
ln -s /opt/maven/bin/mvn /usr/local/bin/ 这里解决通过jenkins在agent节点上执行mvn命令,mvn无法找到的问题
jenkins agent节点配置
jenkins连接agent方式有两种:java方式和ssh方式,java方式就是在agent节点部署个jar包
ssh方式连接agent
1.master节点免密登陆agent节点
在服务节点生成秘钥
ssh-keygen -t rsa
复制公钥
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.198.154
免密登录测试
ssh 192.168.8.111
2.配置jenkins凭据
位置:jenkins工作台->系统管理->凭据管理(manager credentials)
类型:SSH Username with private key
私钥信息获取:
在生成秘钥的服务节点执行命令,将打印的私钥信息拷贝
cat .ssh/id_rsa
创建agent节点
位置:jenkins工作台->系统管理->节点管理(Manage nodes and clouds)
注意标签:稍后选择执行节点会用到配置的标签,通过标签选择
新建构建任务
脚本:
pipeline {
agent {
label 'agent-111'
}
stages {
stage('环境监测') {
steps {
echo '环境监测'
sh '''java -version
mvn -v
git --version
docker -v'''
}
}
}
}
piepline脚本是groovy语法,可以点击上面蓝色字体“流水线语法”,进流水线语法工具来生成
选择自己需要的操作,例如从svn拉取代码,执行shell脚本等,例如上述环境监测语法,选择sh,将命令粘贴到命令输入框,点击生成流水线脚本即可,然后将生成的脚本内容粘贴到脚本的steges->stege->steps中
构建任务
选择刚创建的agent-test任务,点击“Build Now ->构建计划”
点击console output进入控制台,可以看到流水线脚执行的结果
实战
创建项目jenkinsdemo
使用jenkins完成以下构建步骤:
- 环境检测:检测agent-111节点基础软件运行情况
- 拉取代码:从git服务器拉取项目
- 编译构建:agent-111执行maven命令;使用jib插件声明周期push镜像至harbor-101服务
器 - 删除容器:删agent-111服务器jenkinsdemo容器
- 删除镜像:删除agent-111服务器jenkinsdemo镜像
- 登录harbor:docker登录harbor-101服务器
- 拉取镜像:拉取jenkinsdemo镜像
- 运行容器:运行jenkinsdemo容器
创建项目
创建一个springboot项目jenkinsdemo
写一个简单的helloController
在pom文件中引入jib插件,jib是google出品的用来做容器镜像构建的类库,无需编写Dockerfile,无需深入学习dockerfile,通过maven插件为java用构建docker镜像,此类插件还有dockerfile-maven-plugin,docker-maven-plugin等,这两款插件都需要自己编写Dockerfile,这里选择jib插件最重要的原因是镜像构建的速度,docker-maven-plugin每次构建都是全量构建,因此速度较慢,jib构建只是从新构建修改的内容,因此构建速度快。jib github官网地址:https://github.com/GoogleContainerTools/jib
jib的pom配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.demo</groupId>
<artifactId>jenkinsdemo</artifactId>
<version>1.0</version>
<name>jenkinsdemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.name}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>2.5.2</version>
<configuration>
<!--from标签配置镜像的基础镜像,相当于Dockerfile的FROM-->
<from>
<!--使用harbor上的jdk8基础镜像-->
<image>192.168.8.101:5000/dan/openjdk:8-alpine3.9</image>
<!--harbor服务器登陆信息-->
<auth>
<username>admin</username>
<password>Harbor12345</password>
</auth>
</from>
<to>
<!--镜像名称和tag,使用了mvn内置变量${project.version},表示当前工程的version-->
<image>192.168.8.101:5000/dan/${project.name}:${project.version}</image>
<auth>
<username>admin</username>
<password>Harbor12345</password>
</auth>
</to>
<container>
<!--配置jvm参数-->
<jvmFlags>
<jvmFlag>-Xms512m</jvmFlag>
</jvmFlags>
<!--配置使用的时区-->
<environment>
<TZ>Asia/Shanghai</TZ>
</environment>
<!--要暴露的端口-->
<ports>
<port>8080</port>
</ports>
</container>
<!--可以进行HTTP-->
<allowInsecureRegistries>true</allowInsecureRegistries>
</configuration>
<!--将jib与mvn构建的生命周期绑定 mvn package自动构造镜像-->
<!--打包及推送命令 mvn -DsendCredentialsOverHttp=true clean
package-->
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
在项目根目录下新建文件,名称为Jenkinsfile,用来存放流水线脚本,后面会配置从git上拉取脚本,而不是在jenkins上编写。
将项目上传到git上,自己搭建的gitlab或者gitee都可以
创建git凭据
新建一个凭据,用来登陆git服务器,拉取代码
创建任务 jenkinsdemo
选择流水线
这里repository url下有红色保存,原因是在jenkins服务器上没有安装git才会导致报错,安装git即可
创建流水线任务,脚本来源配置为从git上来取,也就上面创建项目中的Jenkinsfile。
编写流水线脚本 Jenkinsfile
pipeline{
agent {
label 'agent-222' //这里通过标签选择执行任务的agent节点
}
stages{
stage('环境检测'){
steps{
echo '环境监测'
}
}
stage('拉取代码'){
steps{
echo '拉取代码'
}
}
stage('编译构建'){
steps{
echo '编译构建'
}
}
stage('删除容器'){
steps{
echo '删除容器'
}
}
stage('删除镜像'){
steps{
echo '删除镜像'
}
}
stage('登陆harbor'){
steps{
echo '登陆harbor'
}
}
stage('拉取容器'){
steps{
echo '拉取容器'
}
}
stage('运行容器'){
steps{
echo '运行容器'
}
}
}
}
下面对脚本内容进行填充
使用jenkins提供的流水线语法工具
1.环境检查
java -version
mvn -v
git --version
docker -v
生成流水线语法方式同上,将生成的脚本内容粘贴到环境监测阶段
2.拉取代码
从git中拉取代码
将生成的脚本拷贝到拉取代码阶段
3.编译构建
mvn clean package -Dmaven.test.skip=true jib:build -DsendCredentialsOverHttp=true
maven构建命令,并使用jib插件, -DsendCredentialsOverHttp=true配置是使用http从harbor仓库拉取镜像,默认必须使用https。
同样是生成shl脚本,同1
4.删除容器
#删除容器shell脚本,先检查容器是否存在,如果存在先停止,然后删除容器
echo '检查容器是否存在'
containerid=`docker ps -a | grep -w jenkinsdemo | awk '{print $1}'`
if [ "$containerid" != "" ];then
echo ‘容器存在,停止容器’
docker stop $containerid
echo ‘删除容器’
docker rm $containerid
fi
同样是生成shl脚本,同1
5.删除镜像
#删除镜像shell脚本
echo '检查镜像是否存在'
imageid=`docker images | grep jenkinsdemo | awk '{print $3}'`
if [ "$imageid" != "" ];then
echo '删除镜像'
docker rmi -f $imageid
fi
同样是生成sh脚本,同1
6.登陆harbor
docker login -u admin -p Harbor12345 192.168.8.101:5000
同样是生成sh脚本,同1
7.拉取容器
docker pull 192.168.8.101:5000/dan/jenkinsdemo:1.0
同样是生成sh脚本,同1
8.运行容器
docker run -itd --name jenkinsdemo -p 8080:8080 192.168.8.101:5000/dan/jenkinsdemo:1.0
同样是生成sh脚本,同1
完整脚本内容:
pipeline{
agent {
label 'agent-111'
}
stages{
stage('环境检测'){
steps{
echo '环境监测'
sh '''java -version
mvn -v
git --version
docker -v'''
}
}
stage('拉取代码'){
steps{
echo '拉取代码'
//略
}
}
stage('编译构建'){
steps{
echo '编译构建'
sh 'mvn clean package -Dmaven.test.skip=true jib:build -DsendCredentialsOverHttp=true'
}
}
stage('删除容器'){
steps{
echo '删除容器'
sh '''echo '检查容器是否存在'
containerid=`docker ps -a | grep -w jenkinsdemo | awk '{print $1}'`
if [ "$containerid" != "" ];then
echo ‘容器存在,停止容器’
docker stop $containerid
echo ‘删除容器’
docker rm $containerid
fi'''
}
}
stage('删除镜像'){
steps{
echo '删除镜像'
sh '''echo '检查镜像是否存在'
imageid=`docker images | grep jenkinsdemo | awk '{print $3}'`
if [ "$imageid" != "" ];then
echo '删除镜像'
docker rmi -f $imageid
fi'''
}
}
stage('登陆harbor'){
steps{
echo '登陆harbor'
sh 'docker login -u admin -p Harbor12345 192.168.8.101:5000'
}
}
stage('拉取容器'){
steps{
echo '拉取容器'
sh 'docker pull 192.168.8.101:5000/dan/jenkinsdemo:1.0'
}
}
stage('运行容器'){
steps{
echo '运行容器'
sh 'docker run -itd --name jenkinsdemo -p 8080:8080 192.168.8.101:5000/dan/jenkinsdemo:1.0'
}
}
}
}
脚本完成后push到git
构建任务
选择之前创建的jenkinsdemo任务,点击构建
构建成功后浏览器访问:http://192.168.8.111:8080
可以反复构建任务,检查脚本是否能正确执行
---------------------------------------------over--------------------------------------------------------