比德芙还丝滑的DevOps、CiCD工具

946 阅读4分钟

这是我参与更文挑战的第3天,活动详情查看: 更文挑战

GiteaDroneCi

以下安装和操作均为Docker方式

1.安装gitea

1.安装gitea

docker run -d --privileged=true --name=gitea -p 10022:22 -p 10080:3000 gitea/gitea

访问localhost:10080弹出交互安装页面

修改项
基础URL宿主机ip:10080
SSH服务域名宿主机ip
其余选项可以默认,可以自行修改。

2.创建一个测试项目,并通过http方式push到仓库。

我这里随便创建了一个springboot的web项目。

3.生成GiteaOauth

gitea右上角->设置->应用->创建应用

客户端id:5667b0f2-2df0-497d-8c31-37e43f178a26
客户端秘钥:heaoKnIbKmGB3QGpE7NR5QLczaYtwlXA5PYweH3kcPp1

重定向到drone的url上

#我这里drone配置的是80端口
http://192.168.31.79/login

生成rpc秘钥

openssl rand -hex 16 

3.安装drone

 docker run \
    -v /var/run/docker.sock:/var/run/docker.sock \
    --env=DRONE_GITEA_SERVER=http://192.168.31.79:10080/ \
    --env=DRONE_GITEA_CLIENT_ID=5667b0f2-2df0-497d-8c31-37e43f178a26 \
    --env=DRONE_GITEA_CLIENT_SECRET=heaoKnIbKmGB3QGpE7NR5QLczaYtwlXA5PYweH3kcPp1 \
    --env=DRONE_RPC_SECRET=dd6fed184d56520b5c72ff652f941eb2 \
    --env=DRONE_USER_CREATE=username:root,admin:true \
    --env=DRONE_SERVER_HOST=192.168.31.79 \
    --env=DRONE_SERVER_PROTO=http \
    --publish=80:80 \
    --publish=443:443 \
    --restart=always \
    --detach=true \
    --name=drone \
    drone/drone

端口号之类的可以自己改为没被占用的即可,sock必须要挂载,因为drone需要依赖宿主的docker,可以缓存镜像等等。

keyvalue
DRONE_GITEA_SERVERGiteaServerUrl
DRONE_GITEA_CLIENT_ID应用的客户端id
DRONE_GITEA_CLIENT_SECRET应用的客户端秘钥
DRONE_RPC_SECRET应用的Rpc秘钥
DRONE_USER_CREATE管理员用户名对应Gitea的用户名
DRONE_SERVER_HOSTDroneServer的ip+端口

参考: docs.drone.io/server/prov…

3.安装runner

 docker run -d \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -e DRONE_RPC_PROTO=http \
    -e DRONE_RPC_HOST=192.168.31.79 \
    -e DRONE_RPC_SECRET=dd6fed184d56520b5c72ff652f941eb2 \
    -e DRONE_RUNNER_CAPACITY=2 \
    -e DRONE_RUNNER_NAME=drone-runner \
    -p 3000:3000 \
    --restart always \
    --name runner \
    drone/drone-runner-docker

keyvalue
DRONE_RPC_HOSTdrone的ip+端口
DRONE_GITEA_CLIENT_ID应用的客户端id
DRONE_RPC_SECRET应用的Rpc秘钥

参考:docs.drone.io/runner/dock…

4.安装私有镜像仓库(Nexus)

docker run -d -p 7081:8081 -p 7082:8082 -p 7083:8083 -p 5000:5000 --name nexus3   sonatype/nexus3

按照指示获取初始密码后登陆,并修改密码 在这里插入图片描述 如上图创建一个Docker(hosts)类型的镜像仓库,并再Realms添加docker权限 在这里插入图片描述

 #docker.json添加仓库
  "insecure-registries": [
    "192.168.31.79:5000"
  ]

我这里没有去持久化,自己使用时可以修改,注意端口号。

5.配置Dockerfile

在项目的根目录下创建一个Dockerfile文件

FROM openjdk:8
RUN ls
ADD /target/*.jar app.jar
ENTRYPOINT [ "sh", "-c", "java -jar /app.jar" ]

6.配置.Drone.yml

在项目的根目录下创建一个.Drone.yml文件(有个.别忘了)

kind: pipeline
name: run #流水线名称
type: docker #类型
steps:
  - name: 打包&单元测试 #步骤名称
    image: maven:3.6.2-jdk-8 #该步骤使用的镜像
    commands:
      - mvn clean package #镜像中执行的命令
    volumes:
    - name: cache
      path: /root/.m2  #挂载到宿主机的maven上避免每次都重新下载jar包
    when:
      branch: master #分支
      event: [ push ]  #触发事件
  - name: 打包镜像
    image: plugins/docker # 构建docker镜像的镜像
    settings:
      repo: 192.168.31.79:5000/mytest/test #本地镜像仓库,我这里搭建的默认不需要密码
      tags: latest #版本
      registry: 192.168.31.79:5000
      username: admin #nexus的用户名
      password: 123123 #nexus的密码
      insecure: true #http必须加这个默认是https
      tags: latest
    volumes:
      - name: docker
        path: /var/run/docker.sock #挂载sock (这里好像可以不挂载之前报错加上的,可以不加试试)
    when:
      branch: master
      event: [ push ]
volumes:
  - name: cache
    host:
      path: /Users/yujian/.m2 #host目录
  - name: docker
    host:
      path: /var/run/docker.sock #宿主机 docker.sock文件

7.授权drone

访问drone的ip即可得到gitea的授权,点击授权此时会自动添加webhook。 在这里插入图片描述

8.激活项目

在drone->setting中激活项目并开启Trusted信任该项目

9.提交代码触发流水线

在这里插入图片描述 都是绿色则构建成功,这里drone执行完毕后会调用system prune -f清理未启动的镜像和容器。。本机操作需谨慎

10.总结

drone所有step在一个工作空间内,可以直接向下传递,比如build阶段的jar包目录为

/drone/src/target/SpringBootTestDemo-0.0.1-SNAPSHOT.jar

其他容器使用目录为./target/SpringBootTestDemo-0.0.1-SNAPSHOT.jar即可获取

看了下plugins/docker的源码

if p.Cleanup {
		cmds = append(cmds, commandRmi(p.Build.Name)) // docker rmi
		cmds = append(cmds, commandPrune())           // docker system prune -f
	}

Dryrun:  c.Bool("dry-run"),
		Cleanup: c.BoolT("docker.purge"), #改为在settings配置中purge = false就行
		Login: docker.Login{
			Registry: c.String("docker.registry"),
			Username: c.String("docker.username"),
			Password: c.String("docker.password"),
			Email:    c.String("docker.email"),
			Config:   c.String("docker.config"),
		},

问题

使用过程如果发现点击授权重定向到login一直超时没反应,需要查看下docker network是不是有个drone开头的网络需要干掉,当时删掉的唐突没记录ip和原因,暂时没复现

drone整合sonar和部署步骤