docker gitea drone实现超轻量级CI CD实战详解

 更新时间:2022年10月12日 14:11:29   作者:leizhenkuo  
这篇文章主要为大家介绍了docker gitea drone实现超轻量级CI CD实战详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

环境安装

需要如下环境

docker + docker-compose

drone + drone-runner gitea

安装docker-ce及docker-compose

卸载旧版本docker,较旧版本的Docker被称为docker或docker-engine。如果已安装这些,请卸载它们以及相关的依赖项。

sudo yum -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

1、安装所需的包

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

2、使用以下命令设置稳定存储库。

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3、安装最新版本的Docker CE和containerd

sudo yum -y install docker-ce docker-ce-cli containerd.io

4、常用命令

systemctl start docker # 开启docker
systemctl stop docker # 关闭docker
systemctl status docker # 检查docker
systemctl enable docker # 设置开机自启动

docker 镜像加速

对于使用systemctl的系统,请在/etc/docker/daemon.json中写入如下内容

{"registry-mirrors":["https://registry.docker-cn.com"]}

之后重启服务:

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

安装docker-compose

1、在官方文档对比docker版本下载合适的docker-compose包

https://docs.docker.com/compose/install/

https://github.com/docker/compose/releases

2、下载安装包

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

将1.24.1换成你要安装的版本,我安装的是1.25.1,也可以选择自己喜欢的版本

3、对二进制文件应用可执行权限

sudo chmod +x /usr/local/bin/docker-compose

4、测试安装

docker-compose --version  #成功时回显示版本号。 
docker-compose version 1.25.1, build a82fef07

安装gitea

创建目录 /home/docker/gitea,创建文件 docker-compose.yml 内容如下

version: "3"
networks:
  gitea:
    external: false
services:
  server:
    image: gitea/gitea:latest # 直接装最新版就好了,没啥好选的,随意
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    networks:
      - gitea
    volumes:
      - ./data:/data  # /home/data可以替换成你想要的挂载目录
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000" # 可以替换成你想要的端口
      - "8222:22" # 8222可以替换成22

docker-compose操作方式

docker-compose up -d 后台启动 Gitea
docker-compose down
docker-compose logs
docker-compose ps 将显示 Gitea 是否正确启动

访问 Gitea

访问:http://server-ip:3000 会进入初始化安装界面,按实际情况配置即可,端口号不用变,URL换成宿主机地址或者域名

修改完后,点击“立即安装”,完成初始化

安装drone+drone-runner

创建目录 /home/docker/drone,创建文件 docker-compose.yml 内容如下

version: '3'
services:
  drone-server:
    restart: always
    image: drone/drone:2
    ports:
      - "9999:80"
    volumes:
      - ./:/var/lib/drone/
      - ./data:/data/
    environment:
      - DRONE_GITEA_SERVER=http://xxxxxxxxx:3000/ # Gitea访问地址
      - DRONE_GITEA_CLIENT_ID=xxxxxxxxx # 应用ID,下一步会获取
      - DRONE_GITEA_CLIENT_SECRET=xxxxxxxxx # 应用密钥,下一步会获取
      - DRONE_SERVER_HOST=xxxxxxxxx:9999
      - DRONE_SERVER_PROTO=http # 支持http, https
      - DRONE_RPC_SECRET=xxxxxxxxx # 通信密钥,下一步会获取
      - DRONE_GIT_ALWAYS_AUTH=true
      - DRONE_GIT_USERNAME=xxxxxxxxx # git用户名
      - DRONE_GIT_PASSWORD=xxxxxxxxx # git密码
      - DRONE_USER_CREATE=username:xxxxxxxxx,admin:true # 管理员用户名,开启管理员账户
  drone-runner-docker:
    restart: always
    image: drone/drone-runner-docker:1
    ports:
      - "10000:3000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_RPC_PROTO=http # 支持http, https
      - DRONE_RPC_HOST=drone-server
      - DRONE_RPC_SECRET=xxxxxxxxx # 通信密钥,下一步会获取
      - DRONE_RUNNER_NAME=drone-runner-docker
      - DRONE_RUNNER_CAPACITY=2

创建文件好后,先不启动,去Gitea配置获取应用ID和密钥

配置应用

进入Gitea,点击头像-设置-应用

1、创建应用

应用名称 drone

重定向 URI http://xxxxxxxxxx:9999/login 就是drone入口地址

创建好后,会获取ClientID和ClientSecret

2、生成新的令牌

令牌名称 drone

创建好后,会获取令牌

3、修改刚刚 /home/docker/drone下的 docker-compose.yml

应用ID、应用密钥 修改为刚刚获取的 ClientID和ClientSecret

通信密钥 修改为刚刚获取的 令牌

4、启动

进入 /home/docker/drone 执行 docker-compose up -d

实战

这是一个springboot的例子

在项目pom.xml同级目录下添加如下文件

Dockerfile

#指定基础镜像(一般指定程序所依赖的环境)
#本例子是构建SpringBoot所以我指定的jdk环境变量
FROM openjdk:8
#添加维护者信息
MAINTAINER author:leizk
MAINTAINER mail:appler1998@qq.com
#将./hello-world.jar添加到容器的/opt目录中
COPY ./game.jar /opt
#指定dockerfile的命令在哪个目录下执行
WORKDIR /opt
#指定容器和外界交互的端口
EXPOSE 8080
#容器运行后执行的命令(该命令在WORKDIR指定的工作目录下执行)
#注意:多个CMD指令只有最后一个会生效
CMD java -jar game.jar
#在构建镜像时执行的命令
#我这边用它来打印java的环境变量
RUN java -version
#添加该镜像的元数据
LABEL version="1.0" description="这是一个Web服务器" by="edc"

.drone.yml

kind: pipeline
type: docker
name: game
steps:
    - name: build-jar # 流水线名称
      image: maven:3.8.5-openjdk-8 # 定义创建容器的Docker镜像
      volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
      - name: maven-cache
        path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载
      - name: maven-build
        path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
      commands: # 定义在Docker容器中执行的shell命令
      - mvn clean package -DskipTests=true # 应用打包命
      - cp target/game.jar /app/build/game.jar
      - cp Dockerfile /app/build/
      - cp run.sh /app/build/
    - name: build-docker # 流水线名称
      image: plugins/docker
      volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
      - name: maven-build
        path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
      - name: docker
        path: /var/run/docker.sock # 挂载宿主机的docker
      settings:
        dockerfile: /app/build/Dockerfile
      commands: # 定义在Docker容器中执行的shell命令
        - cd /app/build
        - chmod +x run.sh
        - sh run.sh
        - docker ps
volumes: # 定义流水线挂载目录,用于共享数据
  - name: maven-build
    host:
      path: /home/docker/drone/maven/build # 从宿主机中挂载的目录
  - name: maven-cache
    host:
      path: /home/docker/drone/maven/cache
  - name: docker
    host:
      path: /var/run/docker.sock

run.sh

#!/bin/sh
# 定义应用组名
group_name='nnzmr'
# 定义应用名称
app_name='game'
# 定义应用版本
app_version='latest'
echo '----copy jar----'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----'
# 打包编译docker镜像
docker build -t ${group_name}/${app_name}:${app_version} .
echo '----build image----'
docker run -p 8080:8080 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'

这是一个vue项目的例子

.drone.yml

这里有个小bug,我想把npm install的依赖保存下来,下次用,但是好像没有成功,我再弄弄看

kind: pipeline
type: docker
name: search
steps:
  - name: prepare # 流水线名称
    image: node:14-alpine # 定义创建容器的Docker镜像
    volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
      - name: node-model
        path: /app/model # 将maven下载依赖的目录挂载出来,防止重复下载
      - name: node-cache
        path: /app/cache # 将maven下载依赖的目录挂载出来,防止重复下载
      - name: node-build
        path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
    commands: # 定义在Docker容器中执行的shell命令
      - npm config set prefix "/app/model"
        npm config set cache "/app/cache"
      - npm config set registry https://registry.npm.taobao.org
      - npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass
      - npm install
      - npm run build
      - cp -r dist /app/build/
      - cp Dockerfile /app/build/
      - cp default.conf /app/build/
      - cp run.sh /app/build/
  - name: build # 流水线名称
    image: plugins/docker
    volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
      - name: node-build
        path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
      - name: docker
        path: /var/run/docker.sock # 挂载宿主机的docker
    settings:
      dockerfile: /app/build/Dockerfile
    commands: # 定义在Docker容器中执行的shell命令
      - cd /app/build
      - chmod +x run.sh
      - sh run.sh
      - docker ps
volumes: # 定义流水线挂载目录,用于共享数据
  - name: node-build
    host:
      path: /home/docker/drone/node/build # 从宿主机中挂载的目录
  - name: node-model
    host:
      path: /home/docker/drone/node/model
  - name: node-cache
    host:
      path: /home/docker/drone/node/cache
  - name: docker
    host:
      path: /var/run/docker.sock

Dockerfile

# 设置基础镜像
FROM nginx
#设置CTS时区
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面
COPY ./dist /usr/share/nginx/html/
#用本地的 default.conf 配置来替换nginx镜像里的默认配置
COPY default.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

run.sh

#!/bin/sh
# 定义应用组名
group_name='nnzmr'
# 定义应用名称
app_name='search'
# 定义应用版本
app_version='latest'
echo '----copy jar----'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----'
# 打包编译docker镜像
docker build -t ${group_name}/${app_name}:${app_version} .
echo '----build image----'
docker run -p 8081:80 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'

default.conf

server {
    listen       80;
    server_name  localhost;
    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;
    error_log  /var/log/nginx/error.log  error;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

成果展示

贴几张在用的图片

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

构建流程根据你定义的pipline执行

在这里插入图片描述

可以结合portainer来管理你的容器

在这里插入图片描述

以上就是docker gitea drone实现超轻量级CI CD实战详解的详细内容,更多关于docker gitea drone轻量级CI CD的资料请关注脚本之家其它相关文章!

相关文章

  • 使用Docker将容器打成镜像的方法步骤

    使用Docker将容器打成镜像的方法步骤

    本文主要介绍了使用Docker将容器打成镜像的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Docker部署Nginx并修改配置文件的两种方式

    Docker部署Nginx并修改配置文件的两种方式

    这篇文章主要给大家介绍了关于Docker部署Nginx并修改配置文件的两种方式,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-01-01
  • 完美解决docker安装mysql后Navicat连接不上的问题

    完美解决docker安装mysql后Navicat连接不上的问题

    这篇文章主要介绍了完美解决docker安装mysql后Navicat连接不上的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Docker buildx构建多平台镜像并推送到私有仓库的方法

    Docker buildx构建多平台镜像并推送到私有仓库的方法

    这篇文章主要介绍了Docker buildx构建多平台镜像并推送到私有仓库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • docker安装fastdfs镜像的一些注意事项

    docker安装fastdfs镜像的一些注意事项

    在安装docker fastdfs镜像时大家需要注意如果是云服务器则需要在云服务器后台的安全组入口方向放开22122、23000以及8888端口,并且在云服务器防火墙配置放开以上三个端口,具体内容详情大家跟随小编一起看看吧
    2021-05-05
  • docker容器中文乱码的解决方法

    docker容器中文乱码的解决方法

    Docker默认不支持中文,在docker中部署Java运行环境,查看日志时都是乱码,下面这篇文章主要给大家介绍了关于docker容器中文乱码的解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Docker Windows最新版(4.17.x)修改镜像存储路径的详细步骤

    Docker Windows最新版(4.17.x)修改镜像存储路径的详细步骤

    这篇文章主要介绍了Docker WIndows最新版(4.17.x)修改镜像存储路径的步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Docker Compose部署微服务项目上线功能

    Docker Compose部署微服务项目上线功能

    这篇文章主要介绍了Docker Compose部署微服务项目上线,需求是这样的编写一个SpringBoot + Redis 的微服务项目,并提供 hello接口,每访问一次接口,计数器+1,本文给大家分享实现思路,需要的朋友可以参考下
    2022-07-07
  • Navicat 连接服务器端中的docker数据库的方法

    Navicat 连接服务器端中的docker数据库的方法

    这篇文章主要介绍了Navicat 连接服务器端中的docker数据库,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • docker start启动容器后仍然exit状态的解决

    docker start启动容器后仍然exit状态的解决

    这篇文章主要介绍了docker start启动容器后仍然exit状态的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06

最新评论