使用Docker 部署jenkins 实现自动化部署

发布于:2024-04-04 ⋅ 阅读:(29) ⋅ 点赞:(0)

使用docker部署Jenkins,项目: https://gitee.com/y_project/RuoYi-Vue 作为部署项目示范

docker jenkins

docker run  \
--name jenkins   \
-d   \
-u root   -p 58080:8080 -p 50000:50000   \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime:ro   \
-v /var/run/docker.sock:/var/run/docker.sock   \
-v  /mydata/myjenkins/home:/home  \
-v /mydata/myjenkins/jenkins_home:/var/jenkins_home    \
jenkinsci/blueocean

mkdir -p /mydata/myjenkins/jenkins_home
mkdir -p /mydata/myjenkins/home

sudo chown -R 1000:1000 /mydata/myjenkins/home
sudo chown -R 1000:1000 /mydata/myjenkins/jenkins_home

# 将最新Jar copy 容器
docker cp /mydata/jenkins.war myjenkins:/usr/share/jenkins/jenkins.war

# 配置加速
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

Java jenkinsfile

jenkinsfile

import java.text.SimpleDateFormat
node {
    try {
        //名字这么写是为了可以发布到腾讯docker仓库,可随意更改
        def dockerId='tengxun'
        def dockerUrl='registry.cn-hangzhou.aliyuncs.com'
        def dockerNamespace='smartdress'
        def dockerName='smartdress-ht'
        def env='dev'
        
        def dateFormat = new SimpleDateFormat("yyyyMMddHHmm")
        def dockerTag = dateFormat.format(new Date())
        
        // maven Home
        def mvnHome
        stage('git clone'){
            sh 'pwd'
            git (credentialsId: '005', url: 'https://gitee.com/xxx/xxx.git',  branch: "dev", changelog: true)
        }

        stage('mvn package') {
            sh 'pwd'
            docker.image('maven:3.6.0-jdk-8-alpine').inside('-v /mydata/maven/m2:/root/.m2 -v /mydata/maven/settings.xml:/usr/share/maven/ref/settings.xml') {
                sh 'java -version'
                sh 'mvn --version'
                sh 'mvn clean install -Dmavan.test.skip=true'
            }
        }
        stage('docker run') {
			sh 'pwd'
			def imageUrl = "${dockerUrl}/${dockerNamespace}/${dockerName}:${dockerTag}"
			def customImage = docker.build(imageUrl)
			
			sh "docker rm -f ${dockerName} | true"
			// 创建相关网络
			// docker network create ruoyi
			// docker network connect ruoyi redis
			// docker network connect ruoyi mysql
			// docker network connect ruoyi ruoyi
			customImage.run("-it -d --name ${dockerName} -p 9898:9898 --network ruoyi")
			//only retain last 3 images,自动删除老的容器,只保留最近3个
			sh """docker rmi \$(docker images | grep ${dockerName} | sed -n  '3,\$p' | awk '{print \$2}') || true"""
        }
        currentBuild.result="SUCCESS"
    } catch (e) {
        currentBuild.result="FAILURE"
        throw e
    } finally {
        //此处若想发布邮件,需要在系统管理-系统设置中配置邮件服务器
        //mail to: 'xxxx@qq.com',subject: "Jenkins: ${currentBuild.fullDisplayName}${currentBuild.result}",body:"${currentBuild.result}"
    }
}

vue jenkinsfile


import java.text.SimpleDateFormat
node {
    try {
        // 名字这么写是为了可以发布到腾讯docker仓库,可随意更改
        def dockerId='tengxun'
        def dockerUrl='registry.cn-hangzhou.aliyuncs.com'
        def dockerNamespace='amewin'
        def dockerName='ruoyi-vue'
        def env='dev'
        
        def dateFormat = new SimpleDateFormat("yyyyMMddHHmm")
        def dockerTag = dateFormat.format(new Date())
        
        stage('git clone'){
            sh 'pwd'
            git (credentialsId: '005', url: 'https://gitee.com/xxx/xxx.git',  branch: "0324", changelog: true)
        }
        
        stage('Node Install') {
             sh 'ls'
            dir('./ruoyi-ui') {
                sh 'pwd'
                docker.image('node:16.20.2-alpine').inside('-v /mydata/node:/root/.npm/') {
    
                    sh 'pwd'
                    sh "node -v"
                    sh "npm -v"
    				// 设置sass下载地址
    				sh 'npm config set registry http://registry.npm.taobao.org/'
                    sh "npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/"

                    sh 'npm install --registry=https://registry.npmmirror.com'
                    sh "npm run build:prod"
                    sh "tar -zcvf dist.tar.gz dist"
                    stash name: "dist", includes: "dist.tar.gz"
                    
                    sh "echo '<---ok--->'"
                }
            }
        }
        
        stage('Docker deploy') {
            dir("ruoyi-ui") {
                sh 'pwd'
                def imageUrl = "${dockerUrl}/${dockerNamespace}/${dockerName}:${dockerTag}"
                def customImage = docker.build(imageUrl)
                
                sh 'echo ${imageUrl}'

                sh "docker rm -f ${dockerName} | true"

                customImage.run("-it -d --name ${dockerName} -p 3000:80 --network ruoyi ")

                //only retain last 3 images,自动删除老的容器,只保留最近3个
                sh """docker rmi \$(docker images | grep ${dockerName} | sed -n  '4,\$p' | awk '{print \$3}') || true"""
            }
     
        }
        currentBuild.result="SUCCESS"
    } catch (e) {
        currentBuild.result="FAILURE"
        throw e
    } finally {
        //此处若想发布邮件,需要在系统管理-系统设置中配置邮件服务器
        //mail to: 'xxxx@qq.com',subject: "Jenkins: ${currentBuild.fullDisplayName}${currentBuild.result}",body:"${currentBuild.result}"
    }
}

Dockerfile 部署脚本

Java Dockerfile

FROM java:8

MAINTAINER Mr.Chen zsdfcc@163.com

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && mkdir -p /ruoyi

WORKDIR /ruoyi

EXPOSE 9898

ADD ./ruoyi-admin/target/ruoyi-admin.jar /ruoyi/ruoyi-admin.jar

CMD java -jar -Xmx512M -Xms256M  -Dfile.encoding=UTF8   -Duser.timezone=GMT+08 -Dspring.profiles.active=jenkins  ruoyi-admin.jar

nginx Dockerfile

FROM nginx:latest

# 传参数据
# ARG PROFILE

# 将dist文件中的内容复制到 `/usr/share/nginx/html/` 这个目录下面
COPY dist/ /usr/share/nginx/html/
# 用本地配置文件来替换nginx镜像里的默认配置
COPY nginx-dev.conf /etc/nginx/nginx.conf

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

nginx-dev.conf

user root;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log main;
    sendfile on;
    keepalive_timeout 65;
    server {
        listen 80;
        server_name vue.xxx.xyz;

        charset utf-8;
        client_max_body_size 20m;

        location / {
            root /usr/share/nginx/html;
            try_files $uri $uri/ /index.html;
            index index.html index.htm;
        }

        location ~ .*\.(gif|jpg|jpeg|png)$ {
            expires 24h;
            root /usr/share/nginx/uploadPath/upload/img;#指定图片存放路径
            # access_log /www/server/nginx/logs/images.log;#图片 日志路径
            proxy_store on;
            proxy_store_access user:rw group:rw all:rw;
            proxy_temp_path /usr/share/nginx/uploadPath;#代理临时路径
            proxy_redirect off;

            proxy_set_header Host smartdress-ht;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size 10m;
            client_body_buffer_size 1280k;
            proxy_connect_timeout 900;
            proxy_send_timeout 900;
            proxy_read_timeout 900;
            proxy_buffer_size 40k;
            proxy_buffers 40 320k;
            proxy_busy_buffers_size 640k;
            proxy_temp_file_write_size 640k;
            if ( !-e $request_filename) {
                proxy_pass http://smartdress-ht:9898;#代理访问地址
            }
        }

        location /prod-api/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://smartdress-ht:9898/;
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            # root html;
            root /usr/share/nginx/html;
        }
    }
}