centos7搭建gitea+drone+harbor前提

前提

  1. 安装 docker、docker-compose
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
复制代码
yum -y install docker-ce-18.06.1.ce-3.el7
复制代码
systemctl enable docker && systemctl start docker
复制代码
  1. 为了快速拉取镜像,设置默认拉取仓库为阿里
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
复制代码
systemctl restart docker
复制代码
  1. 安装nginx

安装镜像源rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum 安装 yum install -y nginx
设为开机启动 systemctl enable nginx
启动nginxsystemctl start docker

gitea

安装

使用docker安装
docker镜像 https://hub.docker.com/r/gitea/gitea/tags
github地址 https://github.com/go-gitea/gitea

docker run -d --name=gitea -p 2222:22 -p 9080:3000 --restart=always -v /data/gitea:/data gitea/gitea:1.15.3
复制代码

映射到物理机的端口:9080

修改配置文件vi /data/gitea/gitea/conf/app.ini,在最后面添加下面配置信息

[mirror]
DEFAULT_INTERVAL = 1m
MIN_INTERVAL = 1m

[cron.update_mirrors]
SCHEDULE = @every 1m
复制代码

mirror 同步外部镜像时间
cron.update_mirrors 定时任务轮询时间

初始化

IP访问

浏览器直接访问http://xxx:9080

域名访问

修改nginx配置文件
vi /etc/nginx/nginx.conf 添加下面的内容

server
{
    listen 80;
    server_name {{DOMAIN}};
    
    location ~* \.(gif|png|jpg|css|js|woff|woff2)$
    {
        proxy_pass http://127.0.0.1:9080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        expires 12h;
    }
    location /
    {
        proxy_pass http://127.0.0.1:9080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;

        add_header X-Cache $upstream_cache_status;

        #Set Nginx Cache
        add_header Cache-Control no-cache;
    }
}
复制代码

{{DOMAIN}}:修改为真实的域名

systemctl enable nginx && systemctl start nginx
复制代码

域名配置https

  1. 自己购买域名证书
  2. 申请免费的域名证书

初始化示例

数据库

可以使用 SQLite
image.png

或者选择使用Mysql,选择Mysql时,需要填写好数据的相关信息
image.png

域名设置

注意:HTTP服务端口,3000保持不变
根据实际的安装情况填写红色部分
IP
image.png

域名
image.png

https
image.png

管理员设置

image.png

drone

访问gitea,右上角点击 设置->应用,管理 OAuth2 应用程序,创建新的OAuth2 应用程序

image.png
重定向URL 填写为 drone 的登录地址,推荐使用https

  1. http://{{ip}}:{{port}}/login
  2. http://域名/login
  3. https://域名/login

BA8C3035-698A-4CB3-9A91-947E3E0003EA.png

记录 客户端ID 、客户端密钥

安装 drone-server

ip+port

docker run \
  --volume=/data/drone:/data \
  --env=DRONE_GITEA_SERVER={{gitea地址,需要带上协议}} \
  --env=DRONE_GITEA_CLIENT_ID={{客户端ID}} \
  --env=DRONE_GITEA_CLIENT_SECRET={{客户端密钥}} \
  --env=DRONE_RPC_SECRET={{随机生成,并且保存好数据}} \
  --env=DRONE_SERVER_HOST={{ip}}:{{port}} \
  --env=DRONE_SERVER_PROTO={{drone域名或者drone ip:drone port,不需要加上协议}} \
  --publish=9091:80 \
  --publish=10443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:1
复制代码

域名

docker run \
  --volume=/data/drone:/data \
  --env=DRONE_GITEA_SERVER={{gitea地址,需要带上协议}} \
  --env=DRONE_GITEA_CLIENT_ID={{客户端ID}} \
  --env=DRONE_GITEA_CLIENT_SECRET={{客户端密钥}} \
  --env=DRONE_RPC_SECRET={{随机生成,并且保存好数据}} \
  --env=DRONE_SERVER_HOST={{drone域名或者drone ip:drone port,不需要加上协议}} \
  --env=DRONE_SERVER_PROTO=http \
  --publish=9091:80 \
  --publish=10443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:1
复制代码

https

docker run \
  --volume=/data/drone:/data \
  --env=DRONE_GITEA_SERVER={{gitea地址,需要带上协议}} \
  --env=DRONE_GITEA_CLIENT_ID={{客户端ID}} \
  --env=DRONE_GITEA_CLIENT_SECRET={{客户端密钥}} \
  --env=DRONE_RPC_SECRET={{随机生成,并且保存好数据}} \
  --env=DRONE_SERVER_HOST={{drone域名或者drone ip:drone port,不需要加上协议}} \
  --env=DRONE_SERVER_PROTO=https \
  --publish=9091:80 \
  --publish=10443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:1
复制代码

DRONE_GITEA_SERVER gitea 地址
例如:
http://192.168.10.10:9091
http://gitea.localhost
https://gitea.localhost
DRONE_GITEA_CLIENT_SECRET 上一步在gitea创建的客户端ID
DRONE_GITEA_CLIENT_SECRET 上一步在gitea创建的客户端密钥
DRONE_RPC_SECRET 随机生成就好了,但是记得保存,下一步需要用
DRONE_SERVER_HOST drone server的地址

修改端口

--publish=9091:80
--publish=10443:443
复制代码

推荐部署方式
DRONE_GITEA_SERVER 填写https地址
通过宿主机的nginx配置域名和证书,然后再通过nginx反向代理到容器的ip

安装 drone-runner

docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DRONE_RPC_PROTO=http \
  -e DRONE_RPC_HOST={{drone地址,不用加协议}} \
  -e DRONE_RPC_SECRET={{搭建drone server时,添加的DRONE_RPC_SECRET}} \
  -e DRONE_RUNNER_CAPACITY=2 \
  -e DRONE_RUNNER_NAME={{自定义drone_runner名称,比如:docker_runner}} \
  -e DOCKER_API_VERSION=1.38 \
  -p 9092:3000 \
  --restart always \
  --name runner \
  drone/drone-runner-docker:1
复制代码

DRONE_RPC_SECRET:安装 drone-server时,填写的DRONE_RPC_SECRET
DRONE_RPC_HOST:drone server 地址
DRONE_RUNNER_NAME:drone runner name,可以自定义

修改端口-p 9092:3000

目前安装的版本最新API版本为1.38
DOCKER_API_VERSION 需要指定版本 1.38

验证是否和drone-sever通信成功

docker logs runner
复制代码

返回结果

time="2021-09-27T04:39:27Z" level=info msg="starting the server" addr=":3000"
time="2021-09-27T04:39:27Z" level=info msg="successfully pinged the remote server"
time="2021-09-27T04:39:27Z" level=info msg="polling the remote server" arch=amd64 capacity=2 endpoint="http://192.168.205.210:9091" kind=pipeline os=linux type=docker
复制代码

测试访问drone

在浏览器输入drone-server的地址,会跳转到 gitea 的地址进行auth授权,授权成功后会跳转回drone-server

harbor

github地址 https://github.com/goharbor/harbor/releases

下载

wget https://github.com/goharbor/harbor/releases/download/v2.3.3/harbor-online-installer-v2.3.3.tgz
复制代码

解压

tar -zxvf harbor-online-installer-v2.3.3.tgz
复制代码

修改配置文件

修改配置文件值时注意yml文件格式,每一个key冒号后面需要空格

cd harbor
cp harbor.yml.tmpl harbor.yml
vi harbor.yml
复制代码

修改域名

hostname: reg.mydomain.com,把reg.mydomain.com修改为自己的域名
不要使用127.0.0.1localhost,因为Harbor需要在外部的客户端访问

修http端口

http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80
复制代码

修改80为自己想要暴露的端口

注释下面的内容

https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /your/certificate/path
  private_key: /your/private/key/path
复制代码

修改管理员密码

找到harbor_admin_password: Harbor12345,Harbor12345修改为自己的密码

修改数据卷目录

data_volume: /data,把/data修改为对应的路径,也可以保持默认

安装

运行./install.sh,进行安装

推荐部署方式
修改配置文件harbor.yml的http对应的端口,其他的配置根据需要进行修改
运行./install.sh,等待安装
修改宿主机的nginx,配置域名和https证书,然后反向代理到暴露的端口
注意防火墙需要开放该端口

项目配置持续集成示例

gitea 新建项目

根据实际情况进行项目的创建

  1. 创建仓库
  2. 迁移外部仓库

image.png

drone 同步项目

点击SYNC,同步项目

image.png

harbor 创建项目

添加运维账号
image.png

需要在harbor创建项目
image.png

设置项目的权限
image.png

编写 .drone.yml

kind: pipeline
type: docker
name: build

steps:
  - name: docker-${DRONE_BRANCH}
    image: plugins/docker:18.09
    settings:
      registry: {{DOMAIN}}
      username:
        from_secret: harbor_username
      password:
        from_secret: harbor_password
      tags: latest
      dockerfile: Dockerfile
      repo: {{DOMAIN}}/{{harbor项目名称}}/{{容器名称}}
  - name: deploy
    image: appleboy/drone-ssh
    settings:
      host:
       from_secret: ssh_host
      username:
       from_secret: ssh_username
      password:
       from_secret: ssh_password
      port:
       from_secret: ssh_port
      script:
        - echo ====暂停容器开始=======
        - docker stop {{容器名称}}`
        - docker rm -f {{容器名称}}`
        - docker rmi -f `docker images | grep {{容器名称}} | awk '{print $1}' `
        - echo ====开始部署=======
        - docker pull {{DOMAIN}}/{{harbor项目名称}}/{{容器名称}}:{{tag}}
        - docker run -d --name={{容器名称}} {{DOMAIN}}/{{harbor项目名称}}/{{容器名称}}:{{tag}}
        - echo ====部署成功======
trigger:
  branch:
    - master
  event:
    - push
复制代码
配置变量 说明
{{DOMAIN}} harbor域名 例如: harbor.localhost
{{容器名称}} 例如: web_application
{{harbor项目名称}} 例如: application
{{tag}} 例如: latest

注意:from_secret 后面的值需要再 drone 进行设置

image.png

把每个值都添加好
harbor_username harbor_password ssh_host ssh_username ssh_password ssh_port
image.png

配置 说明
harbor_username harbor 创的用户
harbor_password harbor 用户密码
ssh_host 需要运行项目的机器的ip
ssh_username 需要运行项目的机器的ssh用户
ssh_port 需要运行项目的机器的ssh端口

编写Dockerfile

根据自己的项目情况编写Dockerfile

构建和部署

提交代码,等待一会
image.png

点击进入后
image.png

若harbor没有使用https部署,调整配置

修改.drone.yml

需要在.drone.yml文件中添加insecure: true

kind: pipeline
type: docker
name: build

steps:
  - name: docker-${DRONE_BRANCH}
    image: plugins/docker:18.09
    settings:
      registry: {{DOMAIN}}
      username:
        from_secret: harbor_username
      password:
        from_secret: harbor_password
      tags: latest
      insecure: true
      dockerfile: Dockerfile
      repo: {{DOMAIN}}/{{harbor项目名称}}/{{容器名称}}
  - name: deploy
    image: appleboy/drone-ssh
    settings:
      host:
       from_secret: ssh_host
      username:
       from_secret: ssh_username
      password:
       from_secret: ssh_password
      port:
       from_secret: ssh_port
      script:
        - echo ====暂停容器开始=======
        - docker stop {{容器名称}}`
        - docker rm -f {{容器名称}}`
        - docker rmi -f `docker images | grep {{容器名称}} | awk '{print $1}' `
        - echo ====开始部署=======
        - docker pull {{DOMAIN}}/{{harbor项目名称}}/{{容器名称}}:{{tag}}
        - docker run -d --name={{容器名称}} {{DOMAIN}}/{{harbor项目名称}}/{{容器名称}}:{{tag}}
        - echo ====部署成功======
trigger:
  branch:
    - master
  event:
    - push
复制代码

修改docker配置文件

安装drone的机器、部署目标的机器,需要修改docker配置文件
vi /etc/docker/daemon.yml

{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
  "insecure-registries": ["{{IP或域名}}"]
}
复制代码