常用命令

  1. sudo -i然后输入密码登录root账户(群晖默认只能使用admin账号登陆)
  2. vim xxx编辑(编辑是进去之后按i,退出并保存是按esc,然后:wq!再回车)
  3. mkdir xx创建文件夹

准备

1. 群晖一般默认安装docker

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

2. 域名

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

3. 文件夹权限

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







4. root权限

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

安装PostgreSQL

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

安装gitea

  1. 执行下面的语句,安装gitea
  2. 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

  1. docker run \
  2. --volume=/var/lib/drone:/data \
  3. --env=DRONE_GITEA_SERVER=http://www.mydomain.com:13000 \
  4. --env=DRONE_GITEA_CLIENT_ID=client-id \
  5. --env=DRONE_GITEA_CLIENT_SECRET=client-secret \
  6. --env=DRONE_RPC_SECRET=共享的key \
  7. --env=DRONE_SERVER_HOST=www.mydomain.com:14000 \
  8. --env=DRONE_DATABASE_DRIVER=postgres \
  9. --env=DRONE_DATABASE_DATASOURCE=postgres://postgres:postgrespw@172.17.0.1:14332/postgres?sslmode=disable \
  10. --env=DRONE_SERVER_PROTO=http \
  11. --publish=14000:80 \
  12. --publish=14443:443 \
  13. --restart=always \
  14. --detach=true \
  15. --name=drone \
  16. --env=DRONE_USER_CREATE=username:myusername,admin:true \
  17. drone/drone:2

安装drone-runner

  1. docker run --detach \
  2. --volume=/var/run/docker.sock:/var/run/docker.sock \
  3. --env=DRONE_RPC_PROTO=http \
  4. --env=DRONE_RPC_HOST=www.mydomain.com:14000 \
  5. --env=DRONE_RPC_SECRET=共享的key \
  6. --env=DRONE_RUNNER_CAPACITY=2 \
  7. --env=DRONE_RUNNER_NAME=test-runner \
  8. --env=DRONE_AGENTS_ENABLED=true \
  9. --publish=14300:3000 \
  10. --restart=always \
  11. --name=runner \
  12. 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,建议首先

  1. cd /volume2/docker
  2. wget https://github.com/goharbor/harbor/releases/download/v1.10.11/harbor-offline-installer-v1.10.11.tgz
  3. tar -zxvf harbor-offline-installer-v1.10.11.tgz
  4. cd harbor
  5. mkdir common
  6. cd common
  7. mkdir config
  8. cd /volume2/docker/harbor
  9. vim harbor.yml //修改一下hostname和port,比如hostname:www.mydomain.com , port:19080, 然后保存退出
  10. 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提交太频繁导致内存不足,
  1. cat /volume2/docker/harbor/docker-compose.yml --查看一下postgresql的映射路径,发现是/data/database
  2. cd /data/database
  3. rm -rf /data/database
  4. cd /data
  5. mkdir database
  6. cd /volume2/docker/harbor
  7. docker-compose down -v --关闭所有的harbor容器
  8. cd /volume2/docker/harbor/common/config
  9. rm -rf *
  10. cd /volume2/docker/harbor
  11. 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内容:

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

.drone.yml的内容:

  1. kind: pipeline
  2. type: docker
  3. name: deployment
  4. steps:
  5. - name: ls
  6. image: alpine
  7. commands:
  8. - ls -la
  9. - ls -la Dockerfile --查看当前文件夹是否包含了Dockerfile
  10. - name: build
  11. image: mcr.microsoft.com/dotnet/sdk:6.0
  12. commands:
  13. - dotnet restore
  14. - 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的文件即可,所以先输出到临时目录
  15. - mv /drone/src/Dockerfile /drone/src_temp/k8s-netcore-demo/ --将项目文件目录中的Dockerfile也移动到临时目录
  16. - rm -rf * --删除项目文件/drone/src/下面的所有文件
  17. - mv /drone/src_temp/k8s-netcore-demo/* /drone/src --将临时目录的文件移动到drone执行的默认目录中
  18. - ls -la --查看最后的/drone/src/下文件,可以验证一下是不是build之后+Dockerfile文件
  19. - pwd --输出当前文件夹路径
  20. - echo 项目生成成功
  21. - name: publish 2 harbor
  22. image: plugins/docker
  23. settings:
  24. dockerfile: Dockerfile
  25. tags: latest
  26. insecure: true
  27. registry: www.mydomain.com:19080
  28. repo: www.mydomain.com:19080/library/k8s-netcore-demo
  29. storage_driver: vfs
  30. username:
  31. from_secret: docker_username
  32. password:
  33. from_secret: docker_password
  34. - name: deploy
  35. image: appleboy/drone-ssh
  36. pull: true
  37. settings:
  38. host: 云服务器IP
  39. port: 22
  40. username: root
  41. password: root密码
  42. command_timeout: 2m
  43. script:
  44. - source /etc/profile
  45. - ls -la
  46. - docker info
  47. - echo $(docker ps -aqf "name=k8s-netcore-demo")
  48. - docker stop $(docker ps -aqf "name=k8s-netcore-demo")
  49. - docker container rm k8s-netcore-demo
  50. - docker rmi k8s-netcore-demo
  51. - echo 查看是否成功删除k8s-netcore-demo
  52. - docker ps -a
  53. - echo 从harbor拉取docker镜像
  54. - sudo docker container rm xxxxxx/k8s-netcore-demo
  55. - sudo docker pull www.mydomain.com:19080/library/k8s-netcore-demo:latest
  56. - sudo docker tag www.mydomain.com:19080/library/k8s-netcore-demo:latest xxxxxx/k8s-netcore-demo:latest
  57. - sudo docker run --name k8s-netcore-demo -p 29029:80 xxxxxx/k8s-netcore-demo
  58. - /usr/local/bin/docker system prune -f
  59. - 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. #### 1. docker的daemon.json地址
  2. 不是`/etc/docker/daemon.json`,而是`/var/packages/Docker/etc/dockerd.json`
  3. #### 2. 常用命令不是`systemctl`或者`service`
  4. 常用命令不是`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. Netty学习摘记 —— 预置SSL / HTTP / WebSocket编解码器

    本文参考 本篇文章是对<Netty In Action>一书第十一章"预置的ChannelHandler和编解码器"的学习摘记,主要内容为通过 SSL/TLS 保护 N ...

  2. div 底部固定方法(不用position定位)

    方法一:全局增加一个负值下边距等于底部高度 <style> html, body { height: 100%; margin: 0; } .content { padding: 20px ...

  3. CSS简单样式练习(三)

    运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...

  4. vue简单的父子组件之间传值

     todo-list为例子: 代码: 父传子--------------属性  v-bind 子传父--------------$emit <!DOCTYPE html> <html ...

  5. flex布局控制最后一个元素右浮动

    可以在最后一个元素添加css属性 margin-left: auto; 例如我一排排列的元素 ,子元素并没有完全排列撑开父元素的宽度,这时候要使最后一个元素想最右 可以让最后一个元素的 margin- ...

  6. WebSocket学习笔记

    参考文章链接:http://www.ruanyifeng.com/blog/2017/05/websocket.html 简单示例:https://www.yiibai.com/websocket/p ...

  7. Windows 10搭建FTP服务器

    1 开启FTP服务 控制面板 -> 程序和功能 -> 启用或关闭Windows功能 找到下面选项的勾选 2 添加FTP站点 在开始菜单里面输入 IIS 搜索并打开 IIS管理器 展开左侧菜 ...

  8. DFS与N皇后问题

    DFS与N皇后问题 DFS 什么是DFS DFS是指深度优先遍历也叫深度优先搜索. 它是一种用来遍历或搜索树和图数据结构的算法 注:关于树的一些知识可以去看<树的概念及基本术语>这篇文章 ...

  9. Blazor 生命周期

    执行周期 1. SetParametersAsync 2. OnInitializedAsync(调用两次) 和 OnInitialized: 3. OnParametersSetAsync 或 On ...

  10. 【面试普通人VS高手系列】HashMap是怎么解决哈希冲突的?

    常用数据结构基本上是面试必问的问题,比如HashMap.LinkList.ConcurrentHashMap等. 关于HashMap,有个学员私信了我一个面试题说: "HashMap是怎么解 ...