Docker五部曲之五:通过Docker和GitHub Action搭建个人CICD项目

这篇具有很好参考价值的文章主要介绍了Docker五部曲之五:通过Docker和GitHub Action搭建个人CICD项目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目介绍

该项目是一个入门CICD-Demo,它由以下几部分组成:

  • Dockerfile:用于构建自定义镜像
  • compose.yml:用于搭建应用程序依赖环境并部署
  • deploy.yml:通过GitHub Actions连接腾讯云服务器并构建环境

通过这个Demo,你可以:

  • 从开发到部署所需的所有操作全部都在本地定义完成
  • 不需要在服务器上手动安装任何软件即可完成部署
  • 每次在代码合并到master时自动完成构建和部署

项目地址:CICD-Blog
测试网址:www.ningyu.ink

Docker五部曲之五:通过Docker和GitHub Action搭建个人CICD项目,Docker,docker,github,容器,github actions,CICD,腾讯云

Dockerfile解析

这个Dockerfile分为四个构建阶段:

  • base:构建基础镜像
  • dev:构建开发环境镜像
  • build:打包
  • prod:构建生产环境镜像
# syntax=docker/dockerfile:1

FROM eclipse-temurin:17-jdk-jammy as base
WORKDIR /blog
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN chmod +x mvnw
RUN ./mvnw dependency:resolve
COPY src ./src

FROM base as dev
EXPOSE 8080
RUN chmod +x mvnw
CMD ["./mvnw", "spring-boot:run"]

FROM base as build
RUN ./mvnw package

FROM eclipse-temurin:17-jre-jammy as prod
EXPOSE 8080
COPY --from=build /blog/target/blog-*.jar /blog.jar
CMD ["java", "-jar", "/blog.jar"]

compose.yml解析

该文件包含两个profiles:

  • dev:开发环境,可使用docker compose --profiles dev up -d --build在本地运行
  • prod:生产环境:可使用docker compose --profiles prod up -d --build在服务器运行
services:
  blog-dev:
    build:
      context: .
      target: dev
    container_name: blog
    ports:
      - "8080:8080"
    environment:
      - MYSQL_URL=jdbc:mysql://mysql/blog?serverTimezone=Asia/Shanghai
    volumes:
      - ./:/blog
    networks:
      mysql-net:
    depends_on:
      - mysql-dev
    profiles:
      - dev

  blog-prod:
    build:
      context: .
      target: prod
    container_name: blog
    environment:
      - MYSQL_URL=jdbc:mysql://mysql/blog?serverTimezone=Asia/Shanghai
    volumes:
      - ./:/blog
    networks:
      mysql-net:
      nginx-net:
    depends_on:
      - mysql-prod
    profiles:
      - prod

  mysql-dev:
    image: mysql:8.0
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=blog
    volumes:
      - mysql_data:/var/lib/mysql
      - mysql_config:/etc/mysql/conf.d
      - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      mysql-net:
    profiles:
      - dev

  mysql-prod:
    image: mysql:8.0
    container_name: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=blog
    volumes:
      - mysql_data:/var/lib/mysql
      - mysql_config:/etc/mysql/conf.d
      - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      mysql-net:
    profiles:
      - prod

  nginx-dev:
    image: nginx
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    environment:
      - NGINX_HOST=ningyu.ink
      - NGINX_PORT=80
    volumes:
      - ./nginx/templates:/etc/nginx/templates
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/ssl:/etc/nginx/ssl
    networks:
      nginx-net:
    profiles:
      - dev

  nginx-prod:
    image: nginx
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    environment:
      - NGINX_HOST=ningyu.ink
      - NGINX_PORT=80
    volumes:
      - ./nginx/templates:/etc/nginx/templates
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/ssl:/etc/nginx/ssl
    networks:
      nginx-net:
    profiles:
      - prod

volumes:
  mysql_data:
  mysql_config:

networks:
  mysql-net:
    driver: bridge
  nginx-net:
    driver: bridge

Nginx反向代理到容器以及SSL证书设置

Nginx的所有配置都在项目下的nginx目录下并通过三个挂在绑定挂载到了容器中:

Docker五部曲之五:通过Docker和GitHub Action搭建个人CICD项目,Docker,docker,github,容器,github actions,CICD,腾讯云
其中:

  • ssl:用于存放SSL证书
  • templates:用于存放前端代码
  • nginx.conf:用于自定义配置

由于本项目还没有前端代码,所以在访问时直接代理到了后端接口,具体配置如下:

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
     listen 443 ssl;
     server_name ningyu.ink;
     ssl_certificate  /etc/nginx/ssl/ningyu.ink_bundle.crt;
     ssl_certificate_key /etc/nginx/ssl/ningyu.ink.key;
     ssl_session_timeout 5m;
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
     ssl_protocols TLSv1.2 TLSv1.3;
     ssl_prefer_server_ciphers on;
        location / {
          proxy_pass http://blog:8000/test/log;
        }
    }

    server {
        listen       80;
        server_name  ningyu.ink;
        return 301 https://$host$request_uri;
    }
}

其中我们将80端口转发到了443端口,并且在配置文件中可以直接使用容器名称进行网络代理(前提是在同一网络下):

Docker五部曲之五:通过Docker和GitHub Action搭建个人CICD项目,Docker,docker,github,容器,github actions,CICD,腾讯云

MySQL的准备工作

MySQL的compose.yml构建语法是这样的:

  mysql-prod:
    image: mysql:8.0
    container_name: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=blog
    volumes:
      - mysql_data:/var/lib/mysql
      - mysql_config:/etc/mysql/conf.d
      - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      mysql-net:
    profiles:
      - prod

它做了以下事情:

  • 传递了两个环境变量:
    • MYSQL_ROOT_PASSWORD指定了root密码
    • MYSQL_DATABASE指定了容器运行后需要创建的数据库
  • 绑定了三个卷:其中第三个指定了一个在项目目录/sql/init.sql的初始化脚本,该脚本用于在数据库中创建应用需要的表

Spring和环境变量的交互

可以看到application.yml内容是这样的:

server:
  port: 8080

spring:
  application:
    name: blog
  datasource:
    username: ${MYSQL_USER:root}
    password: ${MYSQL_PASSWORD:123456}
    url: ${MYSQL_URL:jdbc:mysql://localhost/blog?serverTimezone=Asia/Shanghai}
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  mapper-locations: classpath:mapper/*.xml

其中通过${}读取的环境变量值都是在compose.yml中定义的,这极大增强了灵活性。

GitHub Action解析

GitHub Action通过.github/workflows下的deploy.yml起作用,其文件内容是这样的:

name: Deploy
on:
  push:
    branches:
      - master
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to tencent server
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.REMOTE_HOST}}
          key: ${{ secrets.SERVER_SSH_KEY }}
          username: ${{ secrets.REMOTE_USER }}
          script: |
            # 切换到主目录
            cd ~ || exit
            # 判断是否安装了Docker,如果没有则使用官方提供的脚本安装Docker
            if ! command -v docker &> /dev/null ; then
              curl -fsSL https://get.docker.com -o get-docker.sh
              sh get-docker.sh
            fi
            # 判断是否拉拉取了代码,没有拉取则拉取
            if [ ! -d "./blog" ]; then
              git clone https://github.com/chinesecooly/blog.git
            fi
            # 进入工作目录
            cd blog || exit
            # 更新代码
            git pull
            # 运行prod环境下的构建,并且每次都重新构建镜像
            docker compose --profile prod up -d --build

它的作用如下:

  • 当向master分支推送代码时就自动运行该action
  • 使用了一个别人定义好的action(appleboy/ssh-action@v1.0.3)通过ssh连接到了腾讯云服务器,这个action需要三个参数(with语句中指定的),这三个参数存储在以下位置,需要根据自己的服务器配置。
    Docker五部曲之五:通过Docker和GitHub Action搭建个人CICD项目,Docker,docker,github,容器,github actions,CICD,腾讯云
  • 最后与执行了一个Shell脚本,该脚本有以下功能:
    • 首先检查服务器上是否安装了Docker,如果没安装则下官方提供的Shell脚本进行安装
    • 再检查是否拉取了代码,如果没拉取则拉取
    • 然后进入项目目录并更新代码
    • 最后使用docker compose --profile prod up -d --build命令部署项目,--profile选项指定了选取的profile-d选项指定了容器在后台运行,--build选项指定了每次运行这条指令时都重新构建镜像,这保证了我们每次更新的代码都能署到服务器上

项目测试

以下Controller是该项目提供的一个测试Controller,他完成了一次接收请求、操作数据库、做出响应的过程:

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
    @Resource
    private TestMapper testMapper;

    @GetMapping("/log")
    public Result log() {
        Test test = new Test();
        test.setMsg("a get request");
        test.setData(LocalDateTime.now());
        testMapper.insert(test);
        return Result.success(test);
    }
}

项目部署后访问一下是这样的:

Docker五部曲之五:通过Docker和GitHub Action搭建个人CICD项目,Docker,docker,github,容器,github actions,CICD,腾讯云

我们在dev修改一下代码:

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
    @Resource
    private TestMapper testMapper;

    @GetMapping("/log")
    public Result log() {
        Test test = new Test();
        test.setMsg("a get request after one push");
        test.setData(LocalDateTime.now());
        testMapper.insert(test);
        return Result.success(test);
    }
}

合并到master并推送,等待几秒再次访问一下:

Docker五部曲之五:通过Docker和GitHub Action搭建个人CICD项目,Docker,docker,github,容器,github actions,CICD,腾讯云

以下是GitHub Actions两次执行的记录:

Docker五部曲之五:通过Docker和GitHub Action搭建个人CICD项目,Docker,docker,github,容器,github actions,CICD,腾讯云

结语

通过本文你可以扩展更复杂的应用场景,如有不明白或建议,可留言联系我,如果可以的话点个关注,谢谢。文章来源地址https://www.toymoban.com/news/detail-804868.html

到了这里,关于Docker五部曲之五:通过Docker和GitHub Action搭建个人CICD项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • github-action+docker实现项目可持续自动化部署

    这篇文章以部署vue3项目和nuxt2项目为例结合 github-action , docker , nginx 等介绍不同的项目自动部署流程 部署vue3项目 步骤: 1、腾讯云开启镜像仓库 2、github配置secrets 3、项目根目录创建dockerfile文件(在action工作流中创建镜像) 4、github配置action工作流(yml文件) 上面步骤执行结

    2024年04月26日
    浏览(43)
  • 入门小白,使用ubuntu,使用docker或者docker-compose搭建家庭个人网盘nextcloud,外网通过IPV6域名访问。第三篇--配置 ddns-go 以及 dynv6

    由于在第一篇中说过,放弃使用ipv4 连接 优点,家里设备都可以拥有一个 ipv6公网地址 缺点,地址会变。。。 缺点,公司网络网络下,可能访问不到。。。 所以采用ddns-go 配置 dynv6的方案 即使设备的ipv6地址变化了,也不用你做额外的事,一切交给系统就行。 不用写代码,不

    2024年02月06日
    浏览(51)
  • Docker五部曲之一:容器术语介绍

    本文内容翻译自参考文献。 要理解容器术语,重要的是要精确地理解容器是什么。容器实际上是两个不同的东西。像普通的Linux程序一样,容器实际上有两种状态——休眠和运行。在休眠状态下,容器是保存在磁盘上的一个文件(或一组文件)。这称为容器镜像或容器存储库

    2024年01月16日
    浏览(47)
  • 如何使用Github搭建个人博客

    在本文中,我将介绍如何使用GitHub搭建个人博客( 免费 )。GitHub是一个功能强大的版本控制和协作平台,它也可以用来托管和发布静态网页。通过将你的个人博客托管在GitHub上,你可以享受到版本控制的好处,并且能够与其他开发者进行协作。 在GitHub官网上创建一个账号,

    2024年02月15日
    浏览(47)
  • Hexo搭建个人博客(github)

    记录搭建个人博客的过程 本文使用Hexo+GitHub Page的方法搭建博客,下面是环境准备的步骤,包括nodejs的安装和git的安装(注:本教程仅适用于windows用户) 详情请参考这篇博客: NVM的安装使用与配置(node, npm, yarn 为了把本地的网页上传到git上,需要在系统上下载git,详情参考

    2024年02月21日
    浏览(51)
  • Github搭建个人博客全攻略

    Github是开发者的代码仓库,一个开源和分享社区。 本文前提是已注册github账号。 假设用户名为MyName 进入个人主页(https://github.com/用户名),选择Repositories,点击New Repository name填入MyName.github.io,即MyName/ MyName.github.io ,点击Create Repository 安装Git或TortoiseGit(后者添加环境变量)

    2024年02月16日
    浏览(62)
  • 使用 Github、Hugo 搭建个人博客

    Hugo 静态网站构建手册:https://jimmysong.io/hugo-handbook/ :开源 博客 框架   官网:https://pages.github.com/ 文档:https://docs.github.com/zh Websites for you and your projects. (为你的项目提供网站)。 GitHub Pages 是通过 GitHub 托管和发布的公共网页。Github Pages 本质上是一个静态网站托管系统

    2024年01月16日
    浏览(76)
  • 使用hugo+github搭建免费个人博客

    前提条件 win11电脑一台 电脑安装了git 电脑安装了hugo github账号一个 初始化一个博客 打开cmd窗口,使用hugo新建一个博客工程 下载主题 主题官网:themes.gohugo.io 在上面找一个主题,我这里找名称为 m10c 的主题:m10c | Hugo Themes (gohugo.io) 注意 :不同主题的安装方式不同,以后再专

    2024年01月18日
    浏览(58)
  • 在Github搭建个人博客-详细步骤整理

    去年就有在 Github 搭建博客的想法,但是因为工作太忙搁置了,昨天想起来这事儿,于是网上各种查阅资料,感觉虽然搭建方式比较多,但都不是很全,走了很多弯路,折腾了我一天,才终于搭建好了自己的 GIthub 博客,在此记录梳理一下,希望可以帮到大家,欢迎交流! 博

    2024年02月15日
    浏览(40)
  • 2022 如何在 GitHub 上搭建个人网站(github.io)

    前言 目前,想要搭建自己的项目演示,又想要免费的服务,这时就可以使用 GitHub 提供的 免费 Pages服务:github.io。 成果展示 步骤 第一步:新建仓库 在GitHub上,创建一个新的仓库,仓库名设置为如下格式:账户名.github.io 第二步:添加文件 创建后,这里为了简化操作,直接

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包