基于Ci/Cd 自动化部署Docker容器


后端项目

.gitlab-ci.yml

git仓库代码根目录新增文件:.gitlab-ci.yml 配置如下

# 前置脚本
before_script:
  # gradlew 添加执行权限
  - chmod +x gradlew
  # 输出当前目录
  - echo $(pwd)

# 定义CI执行的阶段,这里可以自己根据情况定义多少个阶段
stages:
  - run
run:
  stage: run
  only:
   # 代码分支
    - master
  tags:
    # gitlab runner 标签
    - test-runner
  # 运行脚本
  script:
    # 编译docker镜像并发布到私有仓库Harbor
    - ./gradlew bootBuildImage -Dorg.gradle.java.home=/data/jdk-17.0.1
    # 部署docker容器
    - ssh -tt centos@192.168.10.22 /data/test_project/dev-run.sh

build.gradle

build.gradle 配置

plugins {
    id 'org.springframework.boot' version '2.5.7'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web:2.5.7'
}

group = 'show.lmm.demo'
version = '0.0.1'
description = 'demoProject'
java.sourceCompatibility = JavaVersion.VERSION_17

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}
test {
    useJUnitPlatform()
}
bootBuildImage{
	//发布到harbor的镜像名称
    imageName = "hub.lmm.show/demo/${project.name}:latest"
    //是否发布
    publish = true
    docker {
    	//中间docker宿主机的地址
        host = "tcp://hub.lmm.show:2375"
        tlsVerify = false
        publishRegistry {
	        //harbor地址
            url = "https://hub.lmm.show/"
            //harbor用户名
            username = "appdeployment"
            //harbor密码
            password = "11ccbb2594E304e73"
        }
    }
}

dev-run.sh

dev-run.sh 配置

#!/bin/sh
projectImage="hub.lmm.show/demo/demoProject"
curDate=`date +%Y%m%d%H%M%S`
servicePath="$(pwd)"
# docker镜像打标签
docker tag "$projectImage:latest" "$projectImage:$curDate"
# 推送docker镜像到hub仓库
docker push "$projectImage:$curDate"
# 删除container
docker rm -f --force `docker ps|grep "$projectImage"|awk '{print $1}'`
# 删除image
docker rmi --force `docker images|grep "$projectImage"|awk '{print $3}'`
# 运行container
docker run -d -p 8080:8080 -v "$servicePath/logs:/workspace/logs" -v "$servicePath/upload:/workspace/upload" -e SPRING_PROFILES_ACTIVE=dev -e TZ="Asia/Shanghai"  -e LANG=en_US.UTF-8  "$projectImage:latest"

前端项目

.gitlab-ci.yml

git仓库代码根目录新增文件:.gitlab-ci.yml 配置如下

# 定义CI执行的阶段,这里可以自己根据情况定义多少个阶段
stages:
  - run
# 定义全局变量
variables:
  CI_REGISTRY_IMAGE: "hub.lmm.show/demo/demoProject:latest"
run:
  stage: run
  only:
    # 代码分组
    - dev
  tags:
    # gitlab runner 标签
    - test-runner
  before_script:
    # 登录docker
    - docker login -u "appdeployment" -p "11ccbb2594E304e73" "https://hub.lmm.show/"
    # 安装npm依赖
    - npm install
  # 运行脚本
  script:
    # 编译前端项目
    - npm run build
    # 编译docker镜像
    - docker build -t $CI_REGISTRY_IMAGE .
    # 推送docker镜像到hub私有仓库
    - docker push $CI_REGISTRY_IMAGE
    # 部署
    - ssh centos@192.168.10.22 /data/demoProject-web/dev-run.sh

Dockerfile

Dockerfile配置

FROM nginx
COPY default.conf /etc/nginx/conf.d/default.conf
COPY ./dist  /usr/share/nginx/html/
RUN echo 'demoProject-web is running'

default.conf

default.conf配置

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
		try_files $uri $uri/ /index.html;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

dev-run.sh

dev-run.sh配置

#!/bin/sh
projectImage="hub.lmm.show/demo/demoProject"
curDate=`date +%Y%m%d%H%M%S`
port=9000
# docker镜像打标签
docker tag "$projectImage:latest" "$projectImage:$curDate"
# 推送docker镜像到hub仓库
docker push "$projectImage:$curDate"
# 删除container
docker rm -f --force `docker ps|grep $port|awk '{print $1}'`
# 删除image
docker rmi --force `docker images|grep "$projectImage" |awk '{print $3}'`
# 运行container
docker run -d -p 9000:80 -e TZ="Asia/Shanghai"  -e LANG=en_US.UTF-8  "$projectImage:latest"

说明

ssh免密登录参考:https://www.lmm.show/3/


文章作者: Ming Ming Liu
文章链接: https://www.lmm.show/7/
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ming Ming Liu !
  目录