文洪飞 發表於 2022-11-15 16:49:00

一文搞懂docker安装Jenkins,从gitee上面拉取代码.部署到另一台服务器支持版本回退

<h1 id="7110-1668495869224">1.前言</h1>
<div>通过docker安装Jenkins,从gitee上面拉取代码.部署到另一台服务器,并用docker启动.达到一键式构建的目标</div>
<div>扩展功能. 1.支持版本回退. 2.限制版本数量,超出自动清理</div>
<h1 id="7176-1668496178189">2.环境准备</h1>
<div>Centos7.x</div>
<div>docker</div>
<div>jdk安装包(maven构建项目的环境,本文是1.8)</div>
<div>maven安装包</div>
<div>git安装包</div>
<h2 id="3966-1668496541925">1.jdk</h2>
<div>jdk-8u161-linux-x64.tar.gz 上传到 /home/jdk</div>
<div id="4067-1668496622707" data-theme="default" data-language="javascript">
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">cd /home/jdk
tar -zxvf jdk-8u161-linux-x64.tar.gz
mv jdk-8u161-linux-x64 jdk1.8
</pre>
</div>
<p>  <img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115162714974-1699861908.png"></p>
</div>
<h2 id="2840-1668496957930">2.maven</h2>
<div>apache-tomcat-8.5.50.tar.gz 上传到 /home/maven</div>
<div id="6020-1668497012648" data-theme="default" data-language="javascript">
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">cd /home/maven
tar -zxvf apache-tomcat-8.5.50.tar.gz
mv apache-tomcat-8.5.50 maven
</pre>
</div>
<p>  <img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115162728359-1996117386.png"></p>
<p>&nbsp;</p>
</div>
<h2 id="9715-1668497068834">3.git</h2>
<div>git-2.24.1.tar.gz 上传到 /home/git</div>
<div id="2087-1668497156257" data-theme="default" data-language="javascript">
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">cd /home/git
tar -zxvf git-2.24.1.tar.gz</pre>
</div>
</div>
<div>安装git到 /home/git/git</div>
<div id="8270-1668497209798" data-theme="default" data-language="javascript">
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">cd /home/git/git-2.24.1
make prefix=/home/git/git all      
make prefix=/home/git/git install</pre>
</div>
</div>
<div>可能会遇到些问题,通过 yum安装缺少的依赖可以解决</div>
<div>成功安装后 会有 /home/git/git/bin/git 文件</div>
<h1 id="8296-1668497467567">3.Jenkins 安装</h1>
<h2 id="1927-1668497513351">1.通过docker下载Jenkins</h2>
<div id="5564-1668497567207" data-theme="default" data-language="javascript">
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">docker   search jenkins/jenkins
docker   pull   jenkins/jenkins</pre>
</div>
</div>
<h2 id="3695-1668497567207">2.启动Jenkins,这步很关键,挂载目录一定要选择对</h2>
<div id="1523-1668497649529" data-theme="default" data-language="javascript">
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">docker run -u root -d -p 18080:8080 -p 50000:50000 \
-v /home/jenkins:/var/jenkins_home   \
-v/home/maven/maven:/usr/local/maven   \
-v /home/git/git:/usr/local/git    \
-v /home/jdk/jdk1.8:/usr/local/jdk   \
-v /etc/localtime:/etc/localtime \
--name jenkins \
jenkins/jenkins</pre>
</div>
</div>
<div>将 jdk,maven,git 的目录挂载到容器</div>
<div>&nbsp;</div>
<div>或者 使用 docker-compose , 后面的是 启动脚本</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">services:

jenkins:
    container_name: jenkins
    image: jenkins</span>/<span style="color: rgba(0, 0, 0, 1)">jenkins
    restart: always<br>    user: root
    ports:
      </span>- 18080:<span style="color: rgba(128, 0, 128, 1)">8080</span>
      - <span style="color: rgba(128, 0, 128, 1)">50000</span>:<span style="color: rgba(128, 0, 128, 1)">50000</span><span style="color: rgba(0, 0, 0, 1)">
    volumes:
      </span>- ./jenkins_home:/<span style="color: rgba(0, 0, 255, 1)">var</span>/<span style="color: rgba(0, 0, 0, 1)">jenkins_home
      </span>- ./maven:/usr/local/<span style="color: rgba(0, 0, 0, 1)">maven
      </span>- ./git:/usr/local/<span style="color: rgba(0, 0, 0, 1)">git
      </span>- ./jdk8:/usr/local/<span style="color: rgba(0, 0, 0, 1)">jdk
      </span>- /etc/localtime:/etc/localtime</pre>
</div>
<div class="cnblogs_code">
<pre>#!/bin/<span style="color: rgba(0, 0, 0, 1)">bash

name</span>=<span style="color: rgba(0, 0, 0, 1)">jenkins
usage() {
echo </span>-e <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">\n sh start.sh start|stop|restart|logs|ps\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}

## 下面是主流程
</span><span style="color: rgba(0, 0, 255, 1)">if</span> [ -z <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> ]
then
      usage
      exit </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
fi
</span><span style="color: rgba(0, 0, 255, 1)">case</span> $<span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">in</span>
      <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">start</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
                echo docker</span>-compose up -<span style="color: rgba(0, 0, 0, 1)">d
                docker</span>-compose up -<span style="color: rgba(0, 0, 0, 1)">d
      ;;
      </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">restart</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
                echo docker restart $name
                docker restart $name
      ;;
      </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">stop</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
                echo docker</span>-<span style="color: rgba(0, 0, 0, 1)">compose down
                docker</span>-<span style="color: rgba(0, 0, 0, 1)">compose down
               
                ## echo docker stop and rm
                ## docker stop $name
                ## docker rm $name
      ;;
      </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">logs</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
                echo docker logs </span>-f --tail=<span style="color: rgba(128, 0, 128, 1)">300</span><span style="color: rgba(0, 0, 0, 1)"> $name
                docker logs </span>-f --tail=<span style="color: rgba(128, 0, 128, 1)">300</span><span style="color: rgba(0, 0, 0, 1)"> $name
      ;;
      </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ps</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
                echo docker ps </span>|<span style="color: rgba(0, 0, 0, 1)"> grep $name
                dockerps </span>|<span style="color: rgba(0, 0, 0, 1)"> grep $name
      ;;
      </span>*<span style="color: rgba(0, 0, 0, 1)">)
                usage
      ;;
esac</span></pre>
</div>
<p>&nbsp;</p>
</div>
<h2 id="6011-1668497833703">3.访问jenkins安装插件</h2>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163023450-1062729331.png"></div>
<div>去 /home/jenkins/secrets/initialAdminPassword 中找密码</div>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163033725-1724067825.png">
<p>&nbsp;</p>
</div>
<div>点击 安装推荐的插件. 这一步比较耗时.</div>
<div>完成后还需安装3个插件,chinese,publish Over ssh,Maven Integration<span class="jenkins-visually-hidden"><br></span></div>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163116234-94538294.png">
<p>&nbsp;</p>
<p><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163124675-1247770848.png"></p>
<p>&nbsp;</p>
<p><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163130390-1404748449.png"></p>
<p>&nbsp;</p>
<p><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163135337-1459950218.png"></p>
<p>&nbsp;</p>




</div>
<div>&nbsp;</div>
<h2 id="2567-1668498311660">4.全局工具配置</h2>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163249005-1766643139.png"></div>
<h3>1.jdk</h3>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163300037-27100922.png">
<p>&nbsp;</p>




</div>
<h3>2.git</h3>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163314249-1369807867.png">
<p>&nbsp;</p>




</div>
<h3>3.maven</h3>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163321888-1999148382.png">
<p>&nbsp;</p>




</div>
<h2 id="9159-1668498497383">5.系统配置</h2>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163329264-2005807479.png">
<p>&nbsp;</p>




</div>
<div>java环境变量</div>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163354173-291742657.png"></div>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221116093244614-1452779742.png">
<p>&nbsp;</p>




</div>
<div>ssh服务器配置.就是项目最终要部署的服务器</div>
<div>这里可以通过 账号密码配置, 也可以通过 ssh免密登录.之后的 链接gitee也会说明</div>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163403349-1779244791.png">
<p>&nbsp;</p>




</div>
<h2 id="4372-1668498720279">6.新建任务</h2>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163451854-38879214.png">
<p>&nbsp;</p>




</div>
<h3>1.General</h3>
<div>增加两个参数, 一个选项 一个字符就可以. 用于 版本构建和回退</div>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163513631-807541094.png">
<p>&nbsp;</p>




</div>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163522638-150336144.png">
<p>&nbsp;</p>




</div>
<h3>2.源码管理. <span style="color: rgba(255, 0, 0, 1)">又一个难点</span></h3>
<p>&nbsp;</p>
<div>这里介绍两种方式:</div>
<p>&nbsp;</p>
<div>1)ssh免密登录</div>
<p>&nbsp;</p>
<div>2)账户密码登录</div>
<p><span style="color: rgba(255, 0, 0, 1)"></span></p>
<p>&nbsp;</p>
<h4><span style="color: rgba(0, 0, 0, 1)">1)ssh免密登录</span></h4>
<div>配置之前需要先<span style="color: rgba(255, 0, 0, 1)">进入容器</span>生成 秘钥</div>
<div id="3429-1668499519588" data-theme="default" data-language="javascript">
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">docker exec -it jenkins /bin/bash
ssh-keygen -t rsa #之后一路回车
</pre>
</div>
<p> </p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">cd /root/.ssh/
</pre>
</div>
<p>  <img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163639565-715589332.png"></p>
</div>
<div>id_rsa: 私钥. 用于在Jenkins中填写</div>
<div>id_rsa.pub:公钥. 需要在 gitee中配置</div>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163726114-1715936540.png">
<p>&nbsp;</p>
</div>
<div>&nbsp;<img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163734454-933854790.png">
<p>&nbsp;</p>
</div>
<div>&nbsp;<img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163743572-694776495.png">
<p>&nbsp;</p>
</div>
<div>&nbsp;<img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163751015-994226602.png">
<h4>&nbsp;2)账户密码登录</h4>
<div>在系统设置内增加下环境变量.</div>
<div>否则会出现错误:</div>
<div>
<div>stderr: fatal: unable to find remote helper for 'https'</div>
</div>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221116093146855-379326432.png">
<p><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221116093206327-1451911650.png"></p>
<p><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221116093215858-1664885520.png"></p>
<p>&nbsp;</p>
</div>
<p></p>
</div>
<h3>3.Pre Steps</h3>
<div>有可能pom不是根目录,自行修改</div>
<div>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">clean install -Dmaven.test.skip=true
</pre>
</div>
<p>  </p>
</div>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115163826081-1882528177.png">
<p>&nbsp;</p>
</div>
<h3>4.Post Steps</h3>
<div><span style="color: rgba(255, 0, 0, 1)">这个地方是重点</span></div>
<div>需要配置3个</div>
<div>1.构建和回退脚本</div>
<div>
<div>2.把jar包上传到远程服务器并执行docker.sh脚本启动</div>
<div>3.删除多余备份版本,只保留8个</div>
</div>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115164101295-1790040169.png">
<p>&nbsp;</p>
</div>
<div>&nbsp;</div>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115164109091-1593764717.png">
<p>&nbsp;</p>
</div>
<div id="6534-1668500222400" data-theme="default" data-language="javascript">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">case</span> $status<span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)">
go)
echo </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">status:$status</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
path</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">../his/${BUILD_NUMBER}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">      #创建每次要备份的目录,可以自行更改
</span><span style="color: rgba(0, 0, 255, 1)">if</span> [ -<span style="color: rgba(0, 0, 0, 1)">d $path ];
then
   echo </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">The files is alreadyexists </span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
   mkdir </span>-<span style="color: rgba(0, 0, 0, 1)">p$path
fi
\cp </span>-r ${WORKSPACE}<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> $path      #复制当前版本代码到历史文件夹
#composer update
echo "Completing!"
;;
back)
echo "status:$status"
echo "version:$version"
rm -rf ${WORKSPACE}/*             #删除工作空间代码
cd ../his/$version            #进入备份目录
echo $version                   #输出获取的版本号
\cp -r ./* ${WORKSPACE}/       #拷贝历史版本至工作空间
;;
*)
   exit
;;
esac</span></pre>
</div>
<p>&nbsp;</p>
</div>
<div>&nbsp;<img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115164204426-227674656.png">
<p>&nbsp;</p>
</div>
<div>&nbsp;<img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115164212294-1091951107.png">
<p>&nbsp;</p>
</div>
<div>&nbsp;</div>
<div id="9172-1668500291088" data-theme="default" data-language="javascript">
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">cd../his/                                                #进入备份的目录
ls -t |awk 'NR&gt;8'|xargs rm -rf        #先安装时间排序,然后保留前8个历史版本
</pre>
</div>
<p>  </p>
</div>
<div>&nbsp;</div>
<h1 id="1746-1668500330304">4.项目服务器docker文件</h1>
<p>登录到项目需要部署的服务器,</p>
<p>在项目的文件夹新建两个文件&nbsp;Dockerfile 和 docker.sh</p>
<div id="3616-1668500465476" data-theme="default" data-language="javascript">
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">cd /home/ticket
ls
</pre>
</div>
<p>  <img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115164421628-351429509.png"></p>
</div>
<div>Dockerfile</div>
<div id="3333-1668500386006" data-theme="default" data-language="javascript">
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">FROM openjdk:8-jre
#基础镜像

#指定dev,指定nacos注册地址&amp;配置中心地址
ENV PARAMS="--server.port=8080 --spring.profiles.active=dev --spring.cloud.nacos.discovery.server-addr=ip:18848 --spring.cloud.nacos.config.server-addr=ip:18848 --spring.cloud.nacos.config.namespace=test --spring.cloud.nacos.config.file-extension=yml"
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &amp;&amp; echo 'Asia/Shanghai' &gt;/etc/timezone

# 统一改名app.jar
COPY *.jar /app.jar
EXPOSE 8080

#传入环境变量
ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar app.jar ${PARAMS}"]
</pre>
</div>
<p>  </p>
<div>docker.sh 构建脚本</div>
<div>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">#!/bin/bash
#变量声明
APP_NAME="ticket"
APP_PORT="8080"

echo 1-停止启动服务 docker stop ${APP_NAME}
docker stop ${APP_NAME}

echo 2-删除服务 docker rm ${APP_NAME}
docker rm ${APP_NAME}

echo 3-删除镜像 docker rmi ${APP_NAME}
docker rmi ${APP_NAME}

echo 4-构建新镜像 docker build -t ${APP_NAME} .
docker build -t ${APP_NAME} .

echo 5-启动新镜像
docker run -d -p ${APP_PORT}:8080 --name ${APP_NAME} ${APP_NAME}

echo 6-脚本执行完成
</pre>
</div>
<p>  </p>
</div>
<p></p>
</div>
<div id="3085-1668500409496">5.一键构建</div>
<div><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115164608349-399404380.png">
<p><img src="https://img2022.cnblogs.com/blog/1205818/202211/1205818-20221115164620841-1901626614.png"></p>
<h1>&nbsp;5.补充,不使用插件上传脚本,vue项目和springboot</h1>
<h2>1)springboot项目上传样例</h2>
<div class="cnblogs_code">
<pre>sshpass -p <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">目标服务器密码</span><span style="color: rgba(128, 0, 0, 1)">'</span> scp -o StrictHostKeyChecking=no -v -r -P <span style="color: rgba(128, 0, 128, 1)">22</span> ${WORKSPACE}/system/target/boot-service.jar root@<span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">100.100</span>:/home/<span style="color: rgba(0, 0, 0, 1)">boot
##远程执行启动脚本
sshpass </span>-p <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">密码</span><span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(128, 0, 0, 1)"> ssh -p 22 root@192.168.100.100&lt;&lt; eeooff </span>
<span style="color: rgba(0, 0, 0, 1)">
cd </span>/home/<span style="color: rgba(0, 0, 0, 1)">boot
sh start.sh restart
exit
eeooff
exit;</span></pre>
</div>
<h2>2)vue项目样例</h2>
</div>
<div>&nbsp;
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">#source /etc/profile #声明环境变量
#npm cache verify #清除缓存
npm install#安装
rm -rf dist
npm run build   #构建生产环境项目
cd ${WORKSPACE}
rm -f dist.tar
tar -cvf dist.tar dist##打tar包
chmod -R 755 dist.tar
# zip -r dist.zip dist #打包成.zip格式

##开始上传
sshpass -p '密码' scp -o StrictHostKeyChecking=no -v -r -P 22 ${WORKSPACE}/dist.tar root@192.168.100.100:/home/nginx/html/test

##远程执行启动脚本
sshpass -p '密码' ssh -p 22 root@192.168.100.100&lt;&lt; eeooff

cd /home/nginx/html/test
rm -rf ./dist
tar xvf dist.tar
chmod -R 755 ./dist
rm -f dist.tar
exit
eeooff
exit;
</pre>
</div>
<p>  </p>
</div>
<div>&nbsp;</div>
<div>&nbsp;</div><br><br>
来源:https://www.cnblogs.com/changhai/p/16892979.html
頁: [1]
查看完整版本: 一文搞懂docker安装Jenkins,从gitee上面拉取代码.部署到另一台服务器支持版本回退