jenkins+docker+nexus一套完整的持续集成方案

一、思路

假定我们现在有三个环境:dev、test、prod,项目以springboot为例,做到三个环境使用同一镜像,确保误差做到最小

镜像tag号

规则:年月日_git提交ID(8位)(20201202_1a1d18fd)
优点:时间可以快速区别是哪天的镜像,git提交ID可以定位到源代码,若线上项目需要临时修复bug,可以根据git commit id切出新分支来开发、测试、上线。

jenkins

布署在dev环境的机器上,我dev的机器到test是做了免密登录的

dev

每次持续构建项目并打镜像起动,此时不推仓库,所以jenkins脚本每次构建需要删除之前的容器及镜像

test

  1. 上传dev里最后一次构建的镜像到仓库
  2. 从仓库里下载最新上传的镜像并启动

prod

在生产环境上也有个jenkins,一般生产环境是运维管的,我们开发不接触生产环境,我们提供需要发布的tag号给运维,运维根据这个tag号能过jenkins发布项目。这个tag就是从dev上传到仓库,test测试通过,由测试人员提供给运维的。

二、jenkins脚本

dev

#!/bin/bash -ilex
ls

NAME="admin-api"
PORT="8882"
GIT_ID=$(git rev-parse HEAD)
TAG=$(date +"%Y%m%d")"_"${GIT_ID:0:8}

cd $NAME

gradle clean build -x test
docker rm -f $NAME || true
docker rmi -f `docker images | grep ${
      NAME} | awk '{print $3}'` || true
docker build -t 124.70.219.129:9021/only-class/$NAME:$TAG .
docker run --name $NAME -d -p ${PORT}:8080 -v /data/logs/$NAME:/app/log -e SPRING_PROFILES_ACTIVE=dev 124.70.219.129:9021/only-class/$NAME:$TAG

test

上传dev里最后一次构建的镜像到仓库后,SSH到test机器执行发布脚本

#!/bin/bash -ilex

NAME="admin-api"
PORT="8882"
TAG=$(docker images | grep -m1 ${
      NAME} | awk '{print $2}')

docker login 124.70.219.129:9021 -u admin -p Only@2020
docker push 124.70.219.129:9021/only-class/$NAME:$TAG

ssh [email protected] "cd /data/script/deploy && sh oc-api.sh $NAME $PORT $TAG"

echo "版本号:"$TAG

test机器发布sh脚本文件

NAME=$1
PORT=$2
TAG=$3

docker login 124.70.219.129:9021 -u admin -p Only@2020
docker rm -f $NAME || true
docker rmi -f $(docker images | grep ${
      NAME} | awk '{print $3}') || true
docker run --name $NAME -d -p ${PORT}:8080 -v /data/logs/$NAME:/app/log -e SPRING_PROFILES_ACTIVE=test 124.70.219.129:9021/only-class/$NAME:$TAG

三、仓库(nexus)

由于每次发test都会推一个新tag镜像到仓库,需要定时清理磁盘,方法请参考我的另两篇笔记《docker快速搭建私服nexus》和《私服nexus作为docker仓库用法》

你可能感兴趣的:(环境安装,docker,jenkins,nexus)