docker+docker-compose+jenkins实现项目持续集成

1.安装docker

1.1:下载docker

yum -y install docker

1.2:启动docker

systemctl start docker

2.安装docker-compose

curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2.1:dokcer-compose集成基础项目环境

version: '3'
services:
  jenkins:
    image: 'jenkins/jenkins'
    container_name: jenkins
    restart: always
    environment:
      - TZ=Asia/Shanghai
    ports:
      - '9998:8080'
      - '50000:50000'
    volumes:
      - '/etc/localtime:/etc/localtime'
      - '/home/data/jenkins:/var/jenkins_home'
  mysql:
    environment:
      MYSQL_ROOT_PASSWORD: "a123456"
    image: mysql
    command: mysqld --default-authentication-plugin=mysql_native_password
    container_name: mysql
    restart: always
    ports:
      - "3306:3306"
  redis:
    image: redis
    container_name: redis
    command: redis-server --appendonly yes --requirepass "a123456"
    ports:
      - "6379:6379"
  minio:
    image: minio/minio
    container_name: minio
    restart: always
    ports:
      - 9000:9000
    command: server /data  #指定容器中的目录 /data
    environment:
      MINIO_ACCESS_KEY: minioadmin    #管理后台用户名
      MINIO_SECRET_KEY: minioadmin #管理后台密码,最小8个字符
    volumes:
      - ./data:/data              #映射当前目录下的data目录至容器内/data目录
      - ./config:/radar/.minio/     #映射配置目录

2.2:jenkins映射文件夹添加权限

 chown -R 1000 /home/data/jenkins

2.3:启动docker-compose

docker-compose up -d

3.Jenkins相关配置

3.1:启动jenkins,访问web页面,IP+端口(docker-compose中指定的映射端口,云服务器需配置安全组)

127.0.0.1:9998

3.2:首次访问需jenkins默认密码,打开jenkins容器日志查看

docker logs -f --tail=100 jenkins
初始密码.png

3.3:进入后选择推荐插件(首次会较慢,需等待),创建管理用户

创建管理账户.png

实例配置.png

jenkins首页.png

3.4:修改中文显示

3.4.1:下载中文插件 Manage Jenkins->Manage Plugins->可选插件

下载中文插件.png

3.4.2:修改配置 Manage Jenkins->Configure System

修改配置.png

3.4.3:重启jenkins

http://ip+port/restart
重启jenkins.png

3.5:全局工具配置

JDK.png

MAVEN.png

node.png

配置node时需要先下载NodeJS插件


CE7CD6D5-EAC5-4c87-9BF0-BEA27C4D10BB.png

3.6:新建项目

新建项目.png

新建一个maven项目时需提前下载 Maven Integration 插件

3.6.1:git仓库配置

进入jenkins容器,创建ssh key,并将生成的id_rsa.pub内容上传到git


jenkins生成sshkey.png

gitSSH配置.png

3.6.2:jenkins凭据添加

SSH KEY凭据.png

gitee凭据.png

云服务器凭据.png

3.6.3:ssh连接配置 系统管理->系统配置

下载ssh plugin、Publish over SSH插件

用于jenkins连接宿主机并执行宿主机命令.png

用于jenkins向宿主机传输文件.png

3.6.4:钉钉消息推送

下载dingtalk插件

3.6.4.1:进入钉钉群,打开群设置,智能群助手,添加机器人

自定义添加机器人.png

添加完成.png

3.6.4.2:配置钉钉消息推送,系统管理->系统配置->钉钉->高级

测试推送.png

3.6.5:项目配置

构建后发送推送.png
jenkins构建时拉取项目的配置.png

构建后配置.png

shell脚本命令放在文章结尾处

3.6.6:开始构建

构建成功.png

钉钉推送.png

3.7:构建vue项目

3.7.1:新建一个自由风格的项目进行配置

git配置.png

指定构建环境.png

执行shell命令.png

构建后操作.png

构建成功.png

shell脚本

#=====================================================================================
#=================================定义初始化变量======================================
#=====================================================================================
#!/bin/bash
#操作/项目路径(Dockerfile存放的路径)
BASE_PATH=/usr/local/docker/pjkj-2c


# jenkins构建好的源jar路径,jenkins的workspace下,jenkins服务内地址为:/var/jenkins_home/workspace
#因为docker启动的jenkins,目录进行了宿主机的目录挂载,则使用宿主机目录:  /root/jenkins/workspace
#完整地址应为:/root/jenkins/workspace/项目名称/target/  后面会进行拼接
SOURCE_PATH=/usr/local/jenkins/workspace/pjkj-2c/target/


#【docker 镜像】【docker容器】【Dockerfile同目录下的jar名字[用它build生成image的jar]】【jenkins的workspace下的项目名称】
SERVER_NAME=data-server-api

#容器id  [grep -w 全量匹配容器名] [awk 获取信息行的第一列,即容器ID]  [无论容器启动与否,都获取到]
CID=$(docker ps -a | grep -w "$SERVER_NAME" | awk '{print $1}')

#镜像id  [grep -w 全量匹配镜像名] [awk 获取信息行的第三列,即镜像ID]
IID=$(docker images | grep -w "$SERVER_NAME" | awk '{print $3}')


#源jar完整地址  [jenkins构建成功后,会在自己的workspace/项目/target 下生成maven构建成功的jar包,获取jar包名的完整路径]
#例如:/usr/local/jenkins/workspace/swapping/target/SERVER_NAME.jar
SOURCE_JAR_PATH=$(find "$SOURCE_PATH"  -name "*$SERVER_NAME*.jar" )

DATE=`date +%Y%m%d%H%M%S`


#=====================================================================================
#============================对原本已存在的jar进行备份================================
#=====================================================================================



# 备份
function backup(){
    if [ -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
        echo "=========================>>>>>>>$SERVER_NAME.jar 备份..."
            mv $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar
        echo "=========================>>>>>>>备份老的 $SERVER_NAME.jar 完成"

    else
        echo "=========================>>>>>>>老的$BASE_PATH/$SERVER_NAME.jar不存在,跳过备份"
    fi
}



#=====================================================================================
#=========================移动最新源jar包到Dockerfile所在目录=========================
#=====================================================================================



# 查找源jar文件名,进行重命名,最后将源文件移动到Dockerfile文件所在目录
function transfer(){


    echo "=========================>>>>>>>源文件完整地址为 $SOURCE_JAR_PATH"
    echo "=========================>>>>>>>重命名源文件"
        mv $SOURCE_JAR_PATH  $SOURCE_PATH$SERVER_NAME.jar

    echo "=========================>>>>>>>最新构建代码 $SOURCE_PATH$SERVER_NAME.jar 迁移至 $BASE_PATH"
        cp $SOURCE_PATH$SERVER_NAME.jar $BASE_PATH

    echo "=========================>>>>>>>迁移完成Success"

}



#=====================================================================================
#==================================构建最新镜像=======================================
#=====================================================================================



# 构建docker镜像
function build(){

    #无论镜像存在与否,都停止原容器服务,并移除原容器服务
    echo "=========================>>>>>>>停止$SERVER_NAME容器,CID=$CID"
    docker stop $CID

    echo "=========================>>>>>>>移除$SERVER_NAME容器,CID=$CID"
    docker rm $CID

    #无论如何,都去构建新的镜像
    #构建新的镜像之前,移除旧的镜像
    if [ -n "$IID" ]; then
        echo "=========================>>>>>>>存在$SERVER_NAME镜像,IID=$IID"


        echo "=========================>>>>>>>移除老的$SERVER_NAME镜像,IID=$IID"
        docker rmi $IID

        echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,开始---->"
        cd $BASE_PATH
        docker build -t $SERVER_NAME .
        echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,完成---->"

    else
        echo "=========================>>>>>>>不存在$SERVER_NAME镜像,构建新的镜像,开始--->"


        cd $BASE_PATH
        docker build -t $SERVER_NAME .
        echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,结束--->"
    fi
}


#=====================================================================================
#==============================运行docker容器,启动服务===============================
#=====================================================================================


# 运行docker容器
# 先备份老的jar包
# 再移动新的jar包到Dockerfile文件所在目录
# 接着,构建新的镜像
# 最后运行最新容器,启动服务
function run(){
    backup
    transfer
    build

    docker run --name $SERVER_NAME -itd --net=host -v /etc/localtime:/etc/localtime:ro  -v /usr/local:/usr/local $SERVER_NAME
}

#入口
run
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容