简单的自动构建环境

前情提要

2021年底,闲人老师事情不多就开始为企业项目服务化做准备,搭建了一个基础集群
集群搭建了当然要用起来,本篇就介绍下如何用开源软件搭建一套自动构建的项目环境
有了这个环境,项目开发将更加容易标准化,间接提升项目质量

如果要了解集群如何搭建可以看闲人老师的上一篇博文。

搭建过程

1. 搭建Gitea代码仓库

Gitea类似于GitHub、Bitbucket和GitLab,是一个用Go语言编写的轻量级开源代码托管解决方案。它分叉自Gogs项目,目标是提供最简单、最快、最轻松的方式来搭建自己的Git仓库服务。它支持所有Go语言支持的平台和架构,包括在amd64、i386、ARM、PowerPC等架构上的Linux、macOS和Windows。

  • 打开Portainer地址,选择管理节点,进入储存卷管理,新建全局卷:gitea和mysql
  • 打开Portainer地址,选择管理节点,进入堆栈管理,按需新建堆栈:gitea
version: "3.7"
networks:
  app:
    external: true
volumes:
  gitea:
    external: true
  mysql:
    external: true
services:
  server:
    image: gitea/gitea:1.16.0-rootless
    environment:
      - GITEA__database__DB_TYPE=mysql
      - GITEA__database__HOST=mysql:3306
      - GITEA__database__NAME=gitea
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=gitea
    restart: always
    user: 1001
    networks:
      - app
    volumes:
      - gitea:/var/lib/gitea
    depends_on:
      - mysql
  mysql:
    image: mysql:8
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=gitea
      - MYSQL_USER=gitea
      - MYSQL_PASSWORD=gitea
      - MYSQL_DATABASE=gitea
    networks:
      - app
    volumes:
      - mysql:/var/lib/mysql
  • 打开konga管理界面(上一篇文章中设为konga.dev.abc.com
  • 新建服务:Name:Git仓库服务,Url:http://gitea_server:3000
  • 进入服务新建路由:Name:Git仓库服务,Hosts:gitea.dev.abc.com

:如有需要可以在Portainer中新增Config映射到gitea中的/etc/gitea/app.ini或使用环境变量进行配置覆盖

传送门:安装、配置

2. 搭建Registry镜像仓库

Registry 是一个无状态的、高度可扩展的服务器端应用程序,它存储并允许您分发 Docker 映像。Registry 是开源的,在宽松的Apache 许可下。

  • 打开Portainer地址,选择管理节点,进入储存卷管理,新建全局卷:registry
  • 打开Portainer地址,选择管理节点,进入堆栈管理,按需新建堆栈:registry
version: "3.7"
networks:
  app:
    external: true
volumes:
  registry:
    external: true
services:
  server:
    image: registry
    restart: always
    networks:
      - app
    ports:
      - 5000:5000 # 内部使用无需开放
    volumes:
      - registry:/var/lib/registry
  • 打开konga管理界面(上一篇文章中设为konga.dev.abc.com
  • 新建服务:Name:Docker仓库服务,Url:http://registry_server:5000
  • 进入服务新建路由:Name:Docker仓库服务,Hosts:registry.dev.abc.com

:如果只作为内部CI暂存实用,则不需要暴露Port端口,也不需要Konga中进行部署

传送门:官方文档

3. 安装DroneCI关联到Git仓库

Drone是一款基于Docker的自助式持续集成平台工具,它使忙碌的团队能够自动化他们的构建、测试和发布工作流。

  • 进入Gitea个人后台 > 应用 > 管理 OAuth2 应用程序 > 输入名称和URI > 保存 > 复制Key和Secret
    • 应用连接:http://git.dev.abc.com/user/settings/applications >
    • 应用名称:drone
    • 重定向 URI:http://drone.dev.abc.com/login
  • 生成一个本机随机Secret,可以使用命令openssl rand -hex 16
  • 打开Portainer地址,选择管理节点,进入储存卷管理,新建全局卷:drone
  • 打开Portainer地址,选择管理节点,进入堆栈管理,按需新建堆栈:drone
version: '3.7'
volumes:
  drone:
    external: true
networks:
  app:
    external: true
services:
  server:
    image: drone/drone:2
    restart: always
    networks:
      - app
    volumes:
      - drone:/data
    environment:
      - DRONE_GITEA_CLIENT_ID=在Gitea中生成的Key
      - DRONE_GITEA_CLIENT_SECRET=在Gitea中生成的Secret
      - DRONE_GITEA_SERVER=http://gitea.dev.abc.com
      - DRONE_GIT_ALWAYS_AUTH=true
      - DRONE_RPC_SECRET=上一步生成的本机随机Secret
      - DRONE_SERVER_HOST=drone.dev.abc.com
      - DRONE_SERVER_PROTO=https
      - DRONE_USER_CREATE=username:管理员Gitea用户名,admin:true #设置某个Gitea用户为管理员
  agent:
    image: drone/drone-runner-docker:1
    restart: always
    depends_on:
      - server
    networks:
      - app
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_RPC_PROTO=http
      - DRONE_RPC_HOST=server
      - DRONE_RPC_SECRET=上一步生成的本机随机Secret
  • 打开konga管理界面(上一篇文章中设为konga.dev.abc.com
  • 新建服务:Name:Drone自动构建,Url:http://drone_server:5000
  • 进入服务新建路由:Name:Drone自动构建,Hosts:drone.dev.abc.com
  • 打开drone地址,使用管理员账号登录,选择需要自动构建的项目,进入Setting并启动自动构建

:drone管理员账户与普通账户不同在于,可以对项目打开更多权限,允许其调用主机文件。如果需要docker.sock权限,则必须打开Trusted项

传送门:官方文档

4. 让代码自动部署

此例子处打包一个React项目

  • 打开Portainer地址,选择管理节点,进入堆栈管理,按需新建堆栈:docker-react-app
version: '3.7'
networks:  
  app:
    external: true
services:
  dev:
     image: docker-react-app:latest
     networks:  
       - app
  prod:
     image: docker-react-app:release
     networks:  
       - app
  • 加入Dockerfile文件
FROM nginx:1.21.1-alpine
COPY ./build /usr/share/nginx/html
  • 加入drone.yml
---
kind: pipeline
name: devlop
clone:
  depth: 1 #克隆深度1,加速克隆
trigger:
  branch: master
  event: push
volumes: # 使用此项需要Trusted权限
  - name: docker
    host:
      path: /var/run/docker.sock
steps:
  - name: install
    pull: if-not-exists
    image: node:16.6.0-alpine
    commands:
      - yarn config set registry https://registry.npm.taobao.org
      - yarn install
      - yarn build
    environment:
      NODE_ENV: production
  - name: build
    pull: if-not-exists
    image: docker:dind
    privileged: true
    volumes:
      - name: docker
        path: /var/run/docker.sock
    commands:
      - "echo '${DRONE_COMMIT}' > build/version.html" #在项目中打入一个静态配置文件
      - "docker build -t docker-react-app:${DRONE_COMMIT} -f Dockerfile ." #构建项目镜像
      - "docker tag docker-react-app:${DRONE_COMMIT} docker-react-app:latest" #为镜像打上latest标签
      - "docker service update --image docker-react-app:${DRONE_COMMIT} docker-react-app_dev" # 使用新镜像重新启动服务
---
kind: pipeline
name: prodution

clone:
  depth: 1
trigger:
  event: tag # 只在打标签时运行
volumes:
  - name: docker
    host:
      path: /var/run/docker.sock
steps:
  - name: install
    pull: if-not-exists
    image: node:16.6.0-alpine
    commands:
      - yarn config set registry https://registry.npm.taobao.org
      - yarn install
      - yarn build
    environment:
      NODE_ENV: production
      REACT_APP_TARGET: production
  - name: build
    pull: if-not-exists
    image: docker:dind
    privileged: true
    volumes:
      - name: docker
        path: /var/run/docker.sock
    commands:
      - "echo '${DRONE_TAG}' > build/version.html"
      - "docker build -t docker-react-app:${DRONE_TAG} -f Dockerfile ." # 使用TAG号作为镜像版本号
      - "docker tag docker-react-app:${DRONE_TAG} docker-react-app:release"  # 更新release标签为最新的正式版本
      - "docker service update --image docker-react-app:${DRONE_TAG} docker-react-app_prod"
  • 通过GIT提交,将会自动触发构建流程并重新启动项目服务
  • 打开Drone地址,查看自动构建进度
  • 打开konga管理界面(上一篇文章中设为konga.dev.abc.com
  • 新建服务:Name:DockerReactApp,Url:http://docker-react-app_dev
  • 进入服务新建路由:Name:DockerReactApp,Hosts:docker-react-app.dev.abc.com
  • 打开上一步的项目路由地址,查看自动部署成果

部署完毕

好了,我们有了一个CI自动构建的集群了。
所有业务内容,都可以通过服务进行测试部署。
架构知识博大精深,如果有其它疑问,欢迎加闲人老师的QQ群互相学习:1033245535

你可能感兴趣的:(架构,架构,php集群,容器,docker,微服务架构)