常用命令

sudo -i然后输入密码登录root账户(群晖默认只能使用admin账号登陆)

vim xxx编辑(编辑是进去之后按i,退出并保存是按esc,然后:wq!再回车)

mkdir xx创建文件夹

准备

1. 群晖一般默认安装docker

        我们不需要进行安装,如果没有安装,则去套件中心进行安装即可

2. 域名

        这个不做详细赘述 比如,此文中域名是www.mydomain.com

3. 文件夹权限

        在群晖的volume2的docker文件夹下创建/volume2/docker/gitea/data、/volume2/docker/gitea/data、/volume2/docker/harbor/common/config,并赋予Everyone权限







4. root权限

         drone的deploy步骤需要root权限来进行docker发布,所以需要群晖的root也开一下,但是群晖默认关闭root
ssh中sudo -i进入root权限
vim /etc/ssh/sshd_config
将#PermitRootLogin 这一行去掉注释,修改为PermitRootLogin yes
保存退出,然后执行synouser --setpw root xxxxxx (xxxxxx就是你的root密码)
reboot重启群晖即可

安装PostgreSQL

执行下面的语句,安装postgres数据库,安装成功之后,用户名是postgres,密码是postgrespw,端口号是14332,初始数据库是postgres
docker run --name postgres -e POSTGRES_PASSWORD=postgrespw -v /volume2/docker/postgres/data:/var/lib/postgresql/data -d -p 14332:5432 postgres
执行成功之后我们可以使用导航猫(navicat)连接试一下,连接成功之后添加一个gitea数据库

安装gitea

执行下面的语句,安装gitea
docker run -d --name=gitea -p 10022:22 -p 13000:3000 -v /volume2/docker/gitea/data:/data gitea/gitea

安装成功之后进入http://www.mydomain.com:13000,此时是一个gitea初始化的界面设置数据库连接是postgresql,数据库名称是gitea;修改站点名称,服务器域名www.mydomain.com,http端口3000,基础URL:http://www.mydomain.com:13000/ , 管理员账号密码填写gitea账号密码(比如账号是myusername),邮箱写一个然后点击安装

安装成功之后我们将进入http://www.mydomain.com:13000,输入账号密码进入,新建一个仓库,这个仓库可以是从其他网站仓库地址拉过来的,拉取过来的仓库只有只读权限,我们需要将仓库更改为普通仓库(在仓库设置=>危险操作区=>转移仓库所有权),否则会造成无法提交的问题(gitea mirror repository is read-only)

下一步,进行drone设置,此时我们的drone未安装,但是我们将14000端口分配给它使用,也就是http://www.mydomain.com:14000

点击头像(右上角)=>设置=>应用=>创建新的 OAuth2 应用程序,应用名称填写drone,重定向 URI填写http://www.mydomain.com:14000/login,点击创建应用,记录一下client-id、client-secret

安装drone

在安装之前,我们可以先执行一下

openssl rand -hex 16来获取一个共享的key,这个key值我们下面将使用到(当然也可以使用其他方法来随机获取一个加密程度更高的key)

安装drone server

docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_GITEA_SERVER=http://www.mydomain.com:13000 \
--env=DRONE_GITEA_CLIENT_ID=client-id \
--env=DRONE_GITEA_CLIENT_SECRET=client-secret \
--env=DRONE_RPC_SECRET=共享的key \
--env=DRONE_SERVER_HOST=www.mydomain.com:14000 \
--env=DRONE_DATABASE_DRIVER=postgres \
--env=DRONE_DATABASE_DATASOURCE=postgres://postgres:postgrespw@172.17.0.1:14332/postgres?sslmode=disable \
--env=DRONE_SERVER_PROTO=http \
--publish=14000:80 \
--publish=14443:443 \
--restart=always \
--detach=true \
--name=drone \
--env=DRONE_USER_CREATE=username:myusername,admin:true \
drone/drone:2

安装drone-runner

docker run --detach \
--volume=/var/run/docker.sock:/var/run/docker.sock \
--env=DRONE_RPC_PROTO=http \
--env=DRONE_RPC_HOST=www.mydomain.com:14000 \
--env=DRONE_RPC_SECRET=共享的key \
--env=DRONE_RUNNER_CAPACITY=2 \
--env=DRONE_RUNNER_NAME=test-runner \
--env=DRONE_AGENTS_ENABLED=true \
--publish=14300:3000 \
--restart=always \
--name=runner \
drone/drone-runner-docker:1

安装成功之后,进入http://www.mydomain.com:14000,应该可以看到刚才我们在gitea创建的仓库了

在此时的gitea里面,我们在这个项目的设置=>Web 钩子里面能看到一个网址连接,这个网址连接就指向的是drone

点击仓库进去,在settings里面打开Trusted

然后在左下角的setting里面添加用户test-runner(对应drone-runner安装里面的DRONE_RUNNER_NAME)

此时,我们的gitea和drone已经OK了,我们来安装一下harbor

安装harbor

1. 安装过程

参考使用Harbor搭建Docker私有镜像仓库,去[goharbor/harbor/releases (https://github.com/goharbor/harbor/releases)下载一下最新版的harbor-offline-installer-vx.x.x.tgz,建议首先

cd /volume2/docker
wget https://github.com/goharbor/harbor/releases/download/v1.10.11/harbor-offline-installer-v1.10.11.tgz
tar -zxvf harbor-offline-installer-v1.10.11.tgz
cd harbor
mkdir common
cd common
mkdir config
cd /volume2/docker/harbor
vim harbor.yml //修改一下hostname和port,比如hostname:www.mydomain.com , port:19080, 然后保存退出
sudo ./install.sh //最后会输出`Harbor has been installed and started successfully`,说明安装成功

我们进入http://www.mydomain.com:19080,然后输入账号admin,密码Harbor12345,进入后去更改一下密码(!!!注意,此时的密码不能有特殊符号,否则不会保存,更改harbor.yml时,里面的所有密码最好不要随意更改)

然后去系统设置=>用户管理新增一个用户(用户名:myharborname,密码:myharborpw),便于一会儿进行docker的操作

同时点击项目=>library=>成员=>添加用户,将myharborname添加进来,权限设置成项目管理员(否则有可能出现publish阶段的denied: requested access to the resource is denied问题,该问题也可以通过docker login www.mydomain.com:19080登陆一下来尝试解决)

2. 问题

  1. 如果出现了harbor-db容器经常重启的问题,可以通过docker logs --tail="100" harbor-db //查看最近100行日志,如果日志是could not write lock file "postmaster.pid": No space left on device或者通过cat /var/log/harbor/postgresql.log | tail -20查出来的日志包含could not close temporary statistics file "pg_stat_tmp/db_12406.tmp": No space left on device,那说明docker提交太频繁导致内存不足,
cat /volume2/docker/harbor/docker-compose.yml --查看一下postgresql的映射路径,发现是/data/database
cd /data/database
rm -rf /data/database
cd /data
mkdir database
cd /volume2/docker/harbor
docker-compose down -v --关闭所有的harbor容器
cd /volume2/docker/harbor/common/config
rm -rf *
cd /volume2/docker/harbor
sudo ./install.sh --重新安装一下,密码、用户等需要重新添加一次
  1. 如果出现了http://www.mydomain.com:19080登陆报错500,那么一般去重启一下harbor的nginx容器即可

CI和CD

我们再去drone中刚才的仓库中setting=>Secret新增两个Secret

分别是:

docker_username 值:myharborname ; docker_password 值:myharborpw

之前的仓库我们拉取到本地,推荐使用Sourcetree,拉取之后在仓库的根目录下面创建两个文件.drone.yml和Dockerfile

我这里使用的是.net 6,所有Dockerfile内容:

FROM mcr.microsoft.com/dotnet/aspnet:6.0
COPY . .
WORKDIR /app
EXPOSE 29029/tcp
ENTRYPOINT ["dotnet", "k8s-netcore-demo.dll"]

.drone.yml的内容:

kind: pipeline
type: docker
name: deployment steps:
- name: ls
image: alpine
commands:
- ls -la
- ls -la Dockerfile --查看当前文件夹是否包含了Dockerfile
- name: build
image: mcr.microsoft.com/dotnet/sdk:6.0
commands:
- dotnet restore
- dotnet build -c Release -o /drone/src_temp/k8s-netcore-demo/ --no-restore --build之后的文件输出到/drone/src_temp/k8s-netcore-demo/目录中,因为项目文件默认在/drone/src/目录,而build默认输出也是/drone/src/,我们后面发布到docker里面只需要发布build的文件即可,所以先输出到临时目录
- mv /drone/src/Dockerfile /drone/src_temp/k8s-netcore-demo/ --将项目文件目录中的Dockerfile也移动到临时目录
- rm -rf * --删除项目文件/drone/src/下面的所有文件
- mv /drone/src_temp/k8s-netcore-demo/* /drone/src --将临时目录的文件移动到drone执行的默认目录中
- ls -la --查看最后的/drone/src/下文件,可以验证一下是不是build之后+Dockerfile文件
- pwd --输出当前文件夹路径
- echo 项目生成成功
- name: publish 2 harbor
image: plugins/docker
settings:
dockerfile: Dockerfile
tags: latest
insecure: true
registry: www.mydomain.com:19080
repo: www.mydomain.com:19080/library/k8s-netcore-demo
storage_driver: vfs
username:
from_secret: docker_username
password:
from_secret: docker_password
- name: deploy
image: appleboy/drone-ssh
pull: true
settings:
host: 云服务器IP
port: 22
username: root
password: root密码
command_timeout: 2m
script:
- source /etc/profile
- ls -la
- docker info
- echo $(docker ps -aqf "name=k8s-netcore-demo")
- docker stop $(docker ps -aqf "name=k8s-netcore-demo")
- docker container rm k8s-netcore-demo
- docker rmi k8s-netcore-demo
- echo 查看是否成功删除k8s-netcore-demo
- docker ps -a
- echo 从harbor拉取docker镜像
- sudo docker container rm xxxxxx/k8s-netcore-demo
- sudo docker pull www.mydomain.com:19080/library/k8s-netcore-demo:latest
- sudo docker tag www.mydomain.com:19080/library/k8s-netcore-demo:latest xxxxxx/k8s-netcore-demo:latest
- sudo docker run --name k8s-netcore-demo -p 29029:80 xxxxxx/k8s-netcore-demo
- /usr/local/bin/docker system prune -f
- echo docker容器启动成功

这里简单解释一下

  1. image: mcr.microsoft.com/dotnet/aspnet:6.0,原来的Gogs + Drone 实现CI/CD(CD)中image是microsoft/dotnet,但是实际会出现错误(Error response from daemon: pull access denied for microsoft/dotnet, repository does not exist or may require 'docker login': denied: requested access to the resource is denied),从Unable to build pipeline: pull access denied for microsoft/dotnet, repository does not exist or may require 'docker login': denied: requested access中找到问题,是因为微软把docker库迁走了,这个仓库没有对应的dotnet镜像了。。。所以我们要根据自己的项目版本自己去更改, 不要使用mcr.microsoft.com/dotnet/aspnet:6.0,要使用sdk
  2. dockerfile: Dockerfile这里我没有使用drone-ci-demo/Dockerfile,因为Dockerfile其实是在根目录下,可以查看name: ls的输出,查阅问题链接unable to evaluate symlinks in Dockerfile path: lstat /drone/src/Dockerfile: no such file or directory
  3. 增加storage_driver: vfs,解决链接Plugins/Docker on Synology DSM
  4. 因为群晖默认没有开root,所以要按照准备工作第三步进行操作,打开root,如果使用admin账号,则会出现权限问题,是因为admin不能在ssh中调用docker和其他script指令(第一次尝试我是按照部署到群晖执行的(群晖的dotnet SDK安装之后软连接好像有问题,无法执行),所以有上面的一句话,如果发布到云服务器,可以给其他账户开权限,这样就不必使用root账户了)

其他

1. 群晖与其他linux的不同

   #### 1. docker的daemon.json地址
不是`/etc/docker/daemon.json`,而是`/var/packages/Docker/etc/dockerd.json`
#### 2. 常用命令不是`systemctl`或者`service`
常用命令不是`systemctl`或者`service`,而是`synoservice`,前面加一个`syno`,可以通过`synoservicecfg --list`查看群晖下运行的所有服务,其中套件中心的服务前面需要加`pkgctl-`作为前缀,例如`synoservice –restart pkgctl-Docker`

2. 云服务器安装dotnet,自己可以去查阅微软的文档 在 Linux 发行版上安装 .NET

参考链接

https://discourse.drone.io/

https://plugins.drone.io/plugins/docker

https://65535.pub/2020/06/01/gitea-drone-群晖搭建/

https://www.cnblogs.com/fallTakeMan/p/11944042.html

https://www.cnblogs.com/fallTakeMan/p/11866584.html

https://www.cnblogs.com/fallTakeMan/p/11875846.html

https://www.hafuhafu.cn/267/

https://www.cnblogs.com/manastudent/p/15938616.html

https://www.msnao.com/2019/04/26/568.html

群晖下 gitea+drone+harbor实现CI/CD 发布到云服务器的更多相关文章

  1. 群晖下虚拟机编译部署WOW服务端TrinityCore

    前言 前几天突然想玩WOW了,但是我是一个特别轻度的玩家,以前点卡的时候,我就是上去一个人做做任务,跑跑地图,不怎么玩副本和PVP,现在让我花钱充月卡,不太现实,没那个时间玩,所以,就考虑玩个私服,但 ...

  2. 容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD

    什么是CI/CD 持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每 ...

  3. 超详细实操教程!在现有K8S集群上安装JenkinsX,极速提升CI/CD体验!

    在2018年年初,Jenkins X首次发布,它由Apache Groovy语言的创建者Jame Strachan创建.Jenkins X 是一个高度集成化的 CI/CD 平台,基于 Jenkins ...

  4. [转]gitlab ci/cd 发布

    转自 https://meigit.readthedocs.io/en/latest/configure_gitlab_i18n_and_create_gitlab_ci_with_gitlab_ru ...

  5. Go-Zero 短链项目 DevOps 实战,利用 Drone CI/CD 打通上云(Kubernetes)迭代流程

    Go-Zero 官方短链项目教程:快速构建高并发微服务 关于 go-zero,大家可以看文档.为少认为它是中国目前最好用的 golang 微服务框架. 完整的 Go-Zero ShortUrl Dev ...

  6. Ubuntu下使用终端ssh访问设置了密钥的云服务器

    首先先安装OpenSSH客户端,可以直接apt-get安装 sudo apt-get install openssh-server 然后将私钥权限修改为600 chmod 600 keyfile 最后 ...

  7. 在群晖NAS上运行URLOS之后竟然能安装Discuz! Q!!

    如果我们手头上有1台群晖NAS时,有没有考虑过把群晖NAS当成服务器来使用,这样会不会很有意思呢? 现在,我们终于可以尝试一番了,把群晖NAS变成一台实实在在的服务器,在上面跑各种运行环境!其实很简单 ...

  8. 群晖NAS网络存储服务器防盗防小偷

    群晖NAS网络存储服务器防盗防小偷 根据群晖NAS的实际测量外形尺寸到淘宝网邮购金属  配电箱(弱电箱). 把配电箱(弱电箱)用粗螺丝固定到机柜或墙壁上. 把群晖NAS用密码纯铜挂锁锁在配电箱(弱电箱 ...

  9. redis 与java的连接 和集群环境下Session管理

    redis 的安装与设置开机自启(https://www.cnblogs.com/zhulina-917/p/11746993.html)  第一步: a) 搭建环境 引入 jedis jar包 co ...

随机推荐

  1. ctfhub web信息泄露备份文件下载(vim缓存 Ds-Store)

    Vim缓存 进入环境由于不懂得vim是什么借鉴大佬的博客 网页提示flag在index.php中我们按着这个思路去找 将文件保存下来因为是swp文件我们用kail进行打开 使用vim -r index ...

  2. 决策树3:基尼指数--Gini index(CART)

    既能做分类,又能做回归.分类:基尼值作为节点分类依据.回归:最小方差作为节点的依据. 节点越不纯,基尼值越大,熵值越大 pi表示在信息熵部分中有介绍,如下图中介绍 方差越小越好. 选择最小的那个0.3 ...

  3. int 越界处理

    在程序运行中,如果运算结果太大超出了所定义的类型,那么可能会影响整个程序的运行结果,甚至是程序出错. 因此,在编写程序时,加入越界处理就显得一起重要了. 用整型 int 来举个例子吧,int型占四个字 ...

  4. 12 Web Development Trends That Will Dominate 2022

    12 Web Development Trends That Will Dominate 2022 (mindinventory.com) Progressive Web Apps (PWAs) An ...

  5. [翻译]Service workers:PWA背后的英雄

    原文地址:https://medium.freecodecamp.org/service-workers-the-little-heroes-behind-progressive-web-apps-4 ...

  6. JavaScript 中 append()、prepend()、after()、before() 的区别

    内容 append().prepend().after().before() 的区别 jQuery 操作 DOM 之添加节点 方法名 作用 $(selector).append() 指定元素内部添加, ...

  7. jq移动端图片预览 (fly-zomm-img.js)

    效果图: ===>==> 里面还与很多属性设置: index  关闭按钮等等 代码: //html-----------------------<div class="he ...

  8. springboot+maven实现模块化编程

    1.创建新项目repo-modele 2.右键Repo_modele -> New -> Module-->next 分别创建bs-web,bs-service,bs-entity, ...

  9. Spring的事务控制-基于xml方式

    介绍:该程序模拟了转账操作,即Jone减少500元,tom增加500元 1.导入坐标 <dependency> <groupId>junit</groupId> & ...

  10. LAN交换机自学习算法

    LAN交换机自学习算法 提示 第二层交完全忽略帧的数据部分协议,仅根据第二层以太网的MAC地址做出转发决策. MAC地址表有时又被称作内容可编址内存(CAM)表 检查源MAC地址 如果源MAC地址不存 ...