Jenkins学习笔记(一):Docker安装Jenkins及自动部署Maven项目

安装Jenkins

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

前期Jenkins检查工作

注:本文章于2019年末发布,与现在Jenkins版本有所不同!!仅参考思路。
根据自己java项目环境选择对应的Jenkins版本,本文章java8,目前最新latest的Jenkins已不支持java8,目前最低需支持java11(Java 11 支持 Java 8 的 API) ,而Java 11 上运行 Jenkins,其支持将于 2024 年 9 月 30 日或之后结束。有关更多详细信息,请参阅Jenkins官方文档。!所以建议大家直接安装Java17版本的Jenkins,避免不必要的麻烦,旧版本Jenkins可参考DockerHub官网查看对应的Tags。

镜像加速器

Docker添加阿里云镜像加速器,以便于docker在pul拉取l镜像文件、jenkins插件库安装的时候速度快些。

操作:搜索阿里云官网 =》登录账号后搜索“容器镜像服务 ACR” =》在镜像工具即可看到镜像加速器
镜像加速器

  1. 创建docker文件夹
[root@nginx-1 ~]# sudo mkdir -p /etc/docker
  1. 编辑 daemon.json 文件
[root@nginx-1 ~]# vi /etc/docker/daemon.json
  1. 设置加速器地址
{
  "registry-mirrors": ["https://k9e55i4n.mirror.aliyuncs.com"]
}
  1. 重新加载和重启docker
[root@nginx-1 ~]# systemctl daemon-reload
[root@nginx-1 ~]# systemctl restart docker

部署Jenkins

#拉取Jenkins官方提供的集成blueocean插件的镜像
docker pull jenkinsci/blueocean

#运行容器
docker run -d --name jenkins -u root -p 14639:8080 -p 50000:50000 --privileged=true  -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean

参数说明:
-d:守护进程的方式启动容器,不打印正在运行的此容器的Docker日志。(或 -it:交互的方式启动容器,打印容器的启动日志信息,相当执行了一遍 docker logs -f jenkins )。
-p:将容器的8080端口映射到宿主机的8888端口。
-v:挂载目录(宿主机目录:容器目录);挂载后,修改宿主机的挂载目录将直接影响到容器的目录。
--name:容器的名称。
--privileged:使用该参数,container内的root拥有真正的root权限。
jenkinsci/blueocean:指定镜像名。

docker-compose方式:

version: '3'
services:
  jenkins:
    image: jenkinsci/blueocean    #镜像名称
    container_name: jenkins    #指定容器名
    privileged: true    #使用该参数,container内的root拥有真正的root权限。
    restart: always    #在容器退出时总是重启容器
    user: root    #指定用户                                
    network_mode: "host"    #网络模式(默认bridge)
    ports:    #容器的端口映射到宿主机上(“:”前数字为宿主机端口,“:”后数字为容器端口)
      - "14639:8080"    #自定义宿主机端口8080
      - "50000:50000"
    environment:
      TZ: Asia/Shanghai    #指定容器运行所属时区
    volumes:
    - /etc/localtime:/etc/localtime
    - ./jenkins_home:/var/jenkins_home
    - /var/run/docker.sock:/var/run/docker.sock    #Docker守护进程(Docker daemon)默认监听的Unix域套接字(Unix domain socket),容器中的进程可以通过它与Docker守护进程进行通信。简单来说容器使用宿主机docker命令

访问Jenkins

在浏览器上填入 http://<你的ip>:14639

14639端口号:宿主机映射容器8080的端口号(为了避免8080端口冲突)

成功:显示Jenkins的logo,等待一段时间即可。

#查看Jenkins的运行日志,日志中含有管理员初始密码(ctrl+c:退出日志)
docker logs -f --tail=500 jenkins

失败:如果无法访问请检查系统防火墙或开端口。

 #CentOS7关防火墙
 systemctl stop firewalld
 
 #开放端口
 firewall-cmd --zone=public --add-port=14639/tcp --permanent
 firewall-cmd --reload

手动配置Jenkins

Jenkins初始化

出现如下页面,需要我们手动获取Admin初始密码。
填写Admin初始密码

#进入容器
docker exec -it jenkins /bin/bash

#查看初始密码
cat /var/jenkins_home/secrets/initialAdminPassword

复制输出的内容,粘贴到Administrator password。此时进行下一步你会看到此界面,点击 Install suggested plugins
安装插件
等待安装完毕(如果插件安装失败,可能没配置镜像加速器的原因,走国内仓库下载插件!):
插件安装
漫长的等待之后到了下一步,创建admin用户:
创建admin用户
到这里,整个初始化Jenkins结束了,接下来是配置环境了……

手动配置maven环境(可选)

我们需要下载一个maven,然后配置自己公司setting.xml,比如私服地址。最后的时候我将对docker命令进行总结。

#进入容器
docker exec -it jenkins /bin/bash

#进入安装位置
cd /usr/local

#下载maven安装包
wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz

#解压压缩包
tar -zxvf apache-maven-3.3.9-bin.tar.gz

#删除压缩包
rm apache-maven-3.3.9-bin.tar.gz

#配置maven环境变量
vi /etc/profile
	在文件的最下面添加:
		#set Maven environment
		export MAVEN_HOME=/usr/local/maven
		export PATH=$MAVEN_HOME/bin:$PATH
		
#生效profile文件
source /etc/profile

#检查maven是否配置成功(显示maven home、java home等信息则配置成功)
mvn -v

需要替换容器的setting文件,前提是setting文件已经配置好自己公司的私服地址。
从本机配置好setting文件,再将该文件传输到宿主机(也就是虚拟机)中

#在宿主机中安装lrzsz依赖,lrzsz是上传下载的
yum install lrzsz

#上传文件,rz就是上传;sz就是下载,上传本地setting文件
rz

#默认当前位置是上传目录,可以查看当前目录
pwd

#通过dokcer命令将setting文件上传到Jenkins容器中
docker cp [上传目录]/setting.xml jenkins:/usr/local/apache-maven-3.3.9/conf

至此,maven环境配置完成,然后进入管理Jenkins页面……

Jenkins页面配置

进入管理
到管理页面……
到管理页面
点击Manage Plugins,安装maven插件……
安装maven插件
安装成功后,点击Global Tool Configuration,进行全局配置……

  1. maven的setting提供(如果maven自动安装,此步骤忽略):
    setting提供

  2. JDK配置(jenkins默认自动带openjdk,可自行查看系统信息=》环境变量=》JAVA_HOME),或可勾选自动安装
    JDK配置

  3. Maven配置(之前手动安装的maven目录,否则勾选自动安装即可)Maven配置

  4. SSH remote hosts(连接远程服务器,执行shell脚本)

    a.在Jenkins主界面——>系统管理——>插件管理,安装SSH plugin插件,这个插件使用SSH协议远程执行shell命令。

    b.在Jenkins主界面——>系统管理——>系统配置,找到SSH remote hosts,对SSH进行配置让其连接远程服务器。
    在这里插入图片描述

最后,点击 应用 并 保存!

构建maven项目

新建Item

点击 新建Item ,出现如下页面……
在这里插入图片描述
进入Item,配置你的任务……

  1. git配置
    在这里插入图片描述
    第3步添加一个git的凭据提供者,填写git的账号和密码,然后Credentials选择刚刚添加的凭据者。
    添加凭据提供者
  2. 配置Pre Steps(使用shell脚本对已存在的容器进行停止容器,删除容器,删除镜像)
    配置Pre Steps
#!/bin/bash
result=$(docker ps| grep "dec-netty") 
if [[ "$result" != "" ]]
then
echo "================docker stop dec-netty================"
docker stop dec-netty
fi
result1=$(docker ps -a | grep "dec-netty") 
if [[ "$result1" != "" ]]
then
echo "================docker rm dec-netty================"
docker rm dec-netty
fi
result2=$(docker images | grep "dec-netty:0.0.1")
if [[ "$result2" != "" ]]
then
echo "================docker rmi dec-netty:0.0.1================"
docker rmi dec-netty:0.0.1
fi
  1. Build Maven(maven构建项目)
    Build Maven

#maven命令(通过DockerFile将项目构建成docker镜像)
clean package docker:build

项目中的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <parent>
        <groupId>com.deceen</groupId>
        <artifactId>netty-parent</artifactId>
        <version>2.0.8.RELEASE</version>
        <!-- lookup parent from repository -->
        <!--<relativePath/>-->
    </parent>
 
    <artifactId>dec-netty</artifactId>
    <version>0.0.1</version>
    <name>dec-netty</name>
    <packaging>jar</packaging>
    <description>Netty即时通讯</description>
 
    <dependencies>
 
        <!-- web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <!-- Netty -->
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.31.Final</version>
        </dependency>
 
        <!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.59</version>
        </dependency>
 
        <!-- lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
 
    </dependencies>
 
    <build>
        <finalName>app</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!--这块一定要配置否则打jar的时候会说找不到主类-->
                <configuration>
                    <fork>true</fork>
                    <mainClass>com.DecNettyApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            
            ## ===============重要配置如下 ↓ ===============
            <!-- Docker maven plugin -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <!--镜像名,这里用工程名-->
                    <imageName>${project.artifactId}:${project.version}</imageName>
                    <!--DockerFile文件所在目录-->
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    
                    <!--构建镜像的配置信息-->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <!-- docker配置,允许远程访问 -->
                    <dckerHost>http://61.185.75.**:1689</dockerHost>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
            <!-- Docker maven plugin -->
        </plugins>
    </build>
 
</project>

1、pom文件中的 dckerHost 是什么,怎么填写?
答:配置服务器开启远程访问docker,可通过DockerFile打成镜像放在服务器上,在宿主机中进行开启设置。
Docker直接开启端口访问是不安全的,别人只要连上之后就可以任意操作,建议必须开启Docker的TLS认证方法。(本文简化流程,暂不提供,可参考 Docker开启TLS 文章)

# 修改docker配置,允许远程访问
vi /lib/systemd/system/docker.service
# 其中ExecStart=后,斜杠(\)前,添加配置:
	-H tcp://0.0.0.0:1689 -H unix:///var/run/docker.sock
# 修改后如下:
ExecStart=/usr/bin/dockerd -H fd:// \
				-H tcp://0.0.0.0:1689 \
				-H unix:///var/run/docker.sock \
				--containerd=/run/containerd/containerd.sock
# 修改后刷新配置,重启服务
systemctl daemon-reload
systemctl restart docker

2、pom文件中的dockerDirectory目录下有什么内容?
答:docker的Dockerfile文件,通过Dockerfile将maven项目构建成docker镜像,文件名字是固定的,Dockerfile不能修改。
 
Dockerfile内容如下:

FROM java:8
MAINTAINER luzc
COPY app.jar /
ENTRYPOINT ["java","-jar","app.jar"]

3、构建任务时,日志报错[FATAL] Non-resolvable parent POM for com.deceen:dec-netty:0.0.1: Could not find artifact com.deceen:netty-parent:pom:2.0.8.RELEASE in bintray (http://dl.bintray.com/andimarek/graphql-java) and ‘parent.relativePath’ points at no local POM @ line 5, column 13
答:将pom文件中的parent节点中的relativePath注释掉即可。

  1. 配置Post Steps(运行容器)
    配置Post Steps
#运行容器
docker run -d --name dec-netty -p 12025:8080 dec-netty:0.0.1
echo '================ 运行容器日志信息 ================'
#打印容器的运行日志
docker logs -f dec-netty

最后,点击 应用 并 保存!

构建任务

构建任务
点击第2步的构建列队中的任务,查看任务的日志信息……
控制台输出
显示Finished: SUCCESS,则说明Jenkins自动构建成功!!!
Success

自动构建

前面都是通过Jenkins手动进行项目部署,Jenkins强大的原因是自动帮你持续部署项目,当项目push到git上时,Jenkins就会去git上拉取代码进行构建。下面我将介绍git两种方法进行自动构建。

Gitblit

  1. 编辑jenkins.groovy文件
    在git目录/data/groovy/jenkins.groovy
    编辑jenkins.groovy
    注意:保存后,需要重启Gitblit服务。

这里的Gitblit的版本是1.8.0,所以配置Jenkins地址有所不同。

  1. Gitblit配置钩子(hooks)
    进入Gitblit中的项目目录,点击 编辑
    编辑
    接下来点击 receivereceive
    最后在pre-receive 脚本中将jenkins移入Selected选择栏中,然后点击保存!
    pre-receive 脚本
  2. 配置jenkins的任务
    配置jenkins的任务
    最后点击 应用并保存!你就可以push代码时,jenkins就会自动帮你构建项目了。

Gitblit的Jenkins groovy插件会调用Jenkins的钩子来按需建立这种方式。

GitLab

GitLab中使用webhook向jenkins通知,当有代码push后将通知jenkins进行构建。

  1. 在Jenkins中找到通知地址
    在这里插入图片描述
  2. 进入Jenkins设置允许匿名访问jenkins,这样GitLab才要成功通知Jenkins
    在这里插入图片描述
  3. 在gitlab中设置允许请求本地网络服务
    在这里插入图片描述
  4. 设置钩子地址,即jenkins中的项目地址
    在这里插入图片描述
  5. 钩子添加成功
    在这里插入图片描述

命令总结

Docker命令

#查看某个镜像版本信息
docker search 镜像
#拉取镜像
docker pull 镜像
#列出已有镜像
docker images
#导出镜像
docker save REPOSITORY:TAG/镜像ID > /镜像路径/镜像.tar.gz
举例:docker save centos7:latest > /root/centos7.tar.gz
#导入镜像
docker load < /镜像路径/镜像.tar.gz
举例:docker load < /root/centos7.tar.gz
#移除镜像
docker rmi REPOSITORY:TAG/镜像ID
#运行容器方法一(守护进程)
docker run -d --name 容器取名 -p 宿主机端口:容器端口 --privileged=true REPOSITORY:TAG/镜像ID
#运行容器方法二(交互)
docker run -it --name 容器取名 -p 宿主机端口:容器端口 --privileged=true REPOSITORY:TAG/镜像ID /bin/bash
#查看容器正在启动情况
docker ps
#查看容器所有启动情况
docker ps -a
#进入容器
docker exec -it 容器名 /bin/bash
#退出容器
exit
#复制文件到容器中
docker cp /文件路径/文件 容器名:/存储路径
举例:docker cp /usr/local/setting.xml jenkins:/usr/local/apache-maven-3.3.9/conf
#启动容器
docker start 容器名/容器ID
#暂停容器
docker stop 容器名/容器ID
#移除容器
docker rm 容器名/容器ID
#一键启动、移除、暂停所有容器
docker start  `docker ps -qa`
docker rm `docker ps -qa`
docker stop `docker ps -qa`
#批量删除tag为"<none>"镜像
docker rmi $(docker images | egrep '<none>' | awk '{print $3}')
#挂载 /opt/etc 前需要将目录下的文件复制到宿主机下,将 /opt/emqx/etc 目录下的文件复制到宿主机下
docker run --rm emqx/emqx:5.2.1 sh -c 'cd /opt/emqx && tar -c etc' | tar -C $PWD -x
#执行容器内部命令,检查nginx配置文件
docker exec -it nginx:latest nginx -t

#查询容器日志
docker logs -f -t --tail=500 容器名
#查看运行容器的挂载详细信息(-A:后面指定显示行数)
docker inspect 容器名 |grep Mounts -A 20
#dokcer开机自启某个容器
docker update --restart=always 容器名
#前提Docker服务开机自启
sudo systemctl enable docker.service

其他命令

#创建文件
mkdir 文件名
#复制粘切文件
mv 原文件目录 目标文件目标 
#删除文件
rm 删除文件目录
#删除文件夹
rm -rf 删除文件夹目录

#查看防火墙状态
systemctl status firewalld
#暂停防火墙状态
systemctl stop firewalld
#启动防火墙状态
systemctl start firewalld
#永久关闭防火墙(关机重启才会生效)
systemctl disable firewalld
#开放端口号
firewall-cmd --zone=public --add-port=端口号/tcp --permanent
firewall-cmd --reload
#移除端口号
firewall-cmd --zone=public --remove-port=端口号/tcp --permanen
#查看所有开放端口列表
firewall-cmd --zone=public --list-ports

#查看某应用进程
ps -ef | grep 应用名
#查看某端口
netstat -lnp|grep 端口名

#查找所有yum包
yum list all
#根据关键字查询
yum list all|grep 关键字
#安装基本依赖,wget 网页下载 lrzsz上传下载 bash-completion tab补全 vim 编辑器
yum install wget lrzsz bash-completion vim -y

#设置服务开机启动
chkconfig 服务名 on 

#查找文件 /:从根目录开始找
find / -name 文件名   

#安装zip解压
yum install unzip -y
#解压zip包
unzip 包名.zip

#查看内存占用情况
free -g
#查看硬盘内存
df -h
  • 18
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Jenkins是一个开源的自动部署工具,它可以帮助我们实现持续集成和自动部署。而Docker是一种虚拟化技术,可以将应用程序及其依赖打包成一个可移植的容器,实现快速部署和可靠性。 在使用Jenkins进行自动部署时,可以搭配使用DockerMaven来创建一个完整的自动部署环境。首先,我们需要在Jenkins服务器上安装Docker,然后使用Docker创建一个虚拟容器,容器中包含了我们的项目代码和相关的环境依赖。 接下来,我们可以使用Maven来管理和构建我们的项目。在Jenkins上配置好Maven构建任务后,每当代码有更新或提交时,Jenkins自动触发构建任务。在构建任务中,Jenkins会从代码仓库中拉取最新的代码,并使用Maven进行编译、测试、打包等操作。 当构建成功后,Jenkins可以将构建好的应用程序打包成一个Docker镜像,然后将镜像推送到Docker仓库。我们可以使用Docker的相关命令将该镜像部署到服务器上,即可实现自动部署。在部署过程中,Docker自动解析容器中的依赖,并创建一个虚拟环境来运行我们的应用程序。 通过使用JenkinsDockerMaven,我们可以实现一个完整的自动部署环境。这样一来,我们只需要在代码有更新时提交到代码仓库,Jenkins就会自动触发构建任务,并将构建好的应用程序部署到服务器上。这大大提高了部署效率,减少了人工操作的错误和风险,同时也提高了系统的可靠性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值