群暉下 gitea+drone+harbor實現CI/CD 發佈到雲伺服器

来源:https://www.cnblogs.com/wangpengzong/archive/2022/05/19/16284709.html
-Advertisement-
Play Games

常用命令 sudo -i然後輸入密碼登錄root賬戶(群暉預設只能使用admin賬號登陸) vim xxx編輯(編輯是進去之後按i,退出並保存是按esc,然後:wq!再回車) mkdir xx創建文件夾 準備 1. 群暉一般預設安裝docker 我們不需要進行安裝,如果沒有安裝,則去套件中心進行安裝 ...


常用命令

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:[email protected]: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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.按類匹配:匹配到的Java類中全部方法作為目標連接點,使用within關鍵字。 匹配到某個類 <aop:pointcut expression="within(com.jnvc.ssm.aop.Singer)" id="singerPnt"/> 匹配到當前包下的所有類 <aop:pointcut ...
  • 時間如白駒過隙,恍然間自己畢業已經第5個年頭了。自己沒有聰慧的天資,也沒有出眾的才能,有的只是一路走來的一個又一個腳印,可能有點晚,但是卻不會缺席。(此處應該來一首歌曲——《老男孩》) 2020年,公司因受疫情的影響,入不敷出倒閉了。比自己年長N歲的開發主管說跟著他一起乾,那時自己也正好處於迷茫階段 ...
  • 系列文章 p2p-tunnel 打洞內網穿透系列(一)客戶端配置及打洞 p2p-tunnel 打洞內網穿透系列(二)TCP轉發訪問遠程共用文件夾 p2p-tunnel 打洞內網穿透系列(三)TCP轉發訪問內網web服務,其它服務同理 p2p-tunnel 打洞內網穿透系列(四)socks5代理和ht ...
  • 系列文章 p2p-tunnel 打洞內網穿透系列(一)客戶端配置及打洞 p2p-tunnel 打洞內網穿透系列(二)TCP轉發訪問遠程共用文件夾 p2p-tunnel 打洞內網穿透系列(三)TCP轉發訪問內網web服務,其它服務同理 p2p-tunnel 打洞內網穿透系列(四)socks5代理和ht ...
  • 一、YUM安裝Apache服務的搭建與配置 1、關閉selinux ①修改selinux的配置文件 [[email protected] ~]# vim /etc/selinux/config SELINUX=disabled ②關閉selinux [[email protected] ~]# setenfor ...
  • Linux下的可執行程式在運行時經常需要傳一些參數,而這些參數是有規範的。包括我們自己寫的在Linux系統下運行的Shell腳本、Python腳本等可執行程式,最好也遵循相關規範。我們下麵以Linux命令為例來講解參數規範。 中括弧[]並不存在於實際的命令中,表示該參數是可選的,而加入選項設置時,通... ...
  • 認識並安裝WSL(基於Windows的Linux子系統) 什麼是WSL WSL(Windows Subsystem for Linux),這是在windows平臺運行的linux子系統。也就是說可是不用安裝虛擬機的情況下獲得相對完整的linux系統體驗。 WSL相比於虛擬機(eg:VMware、Vi ...
  • sed sed命令 sed全稱是:Stream EDitor(流編輯器。 Linux sed 命令是利用腳本來處理文本文件,sed 可依照腳本的指令來處理、編輯文本文件。Sed 主要用來自動編輯一個或多個文件、簡化對文件的反覆操作、編寫轉換程式等。 當處理數據時,sed 從輸入源一次讀入一行,並將它 ...
一周排行
    -Advertisement-
    Play Games
  • 什麼是工廠模式 工廠模式是最常用的設計模式之一,屬於創建型模式。 有點: 解耦,可以把對象的創建和過程分開 減少代碼量,易於維護 什麼時候用? 當一個抽象類有多個實現的時候,需要多次實例化的時候,就要考慮使用工廠模式。 比如:登錄的抽象類ILoginBusiness,它有2個實現,一個用用戶名密碼登 ...
  • 這次iNeuOS升級主要升級圖形渲染引擎和增加豐富的圖元信息,可以很快的方案應用。總共增加41個通用和行業領域的圖元應用,增加2154個圖元信息,現在iNeuOS視圖建模功能模塊總共包括5894個行業圖元信息。現在完全支持製作高保真的工藝流程和大屏展示效果。 ...
  • 效果圖先附上: 首先 這是我是參考 教程:使用 SignalR 2 和 MVC 5 實時聊天 | Microsoft Docs 先附上教程: 在“添加新項 - SignalRChat”中,選擇 InstalledVisual> C#>WebSignalR>,然後選擇 SignalR Hub 類 (v ...
  • 一、前言 項目中之前涉及到胎兒心率圖曲線的繪製,最近項目中還需要添加心電曲線和血樣曲線的繪製功能。今天就來分享一下心電曲線的繪製方式; 二、正文 1、胎兒心率曲線的繪製是通過DrawingVisual來實現的,這裡的心電曲線我也是採用差不多相同的方式來實現的,只是兩者曲線的數據有所區別。心電圖的數據 ...
  • 安裝 Redis # 首先安裝依賴gcc, 後面需要使用make編譯redis yum install gcc -y # 進入 /usr/local/src 目錄, 把源碼下載到這裡 cd /usr/local/src # 下載 redis 7.0.2 的源碼,github被牆,可以使用國內的地址 ...
  • Redis 的定義? 百度百科: Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。 中文官網: Redis是一個開源(BSD許可),記憶體存 ...
  • 事情的起因是收到了一位網友的請求,他的java課設需要設計實現迷宮相關的程式——如標題概括。 我這邊不方便透露相關信息,就只把任務要求寫出來。 演示視頻指路👉: 基於JavaFX圖形界面的迷宮程式演示_嗶哩嗶哩_bilibili 完整代碼鏈接🔎: 網盤:https://pan.baidu.com ...
  • Python中的字典 Python中的字典是另一種可變容器模型,且可存儲任意類型對象。鍵值使用冒號分割,你可以看成是一串json。 常用方法 獲取字典中的值 dict[key] 如果key不存在會報錯,建議使用dict.get(key),不存在返回None 修改和新建字典值 dict[key]=va ...
  • 迎面走來了你的面試官,身穿格子衫,挺著啤酒肚,髮際線嚴重後移的中年男子。 手拿泡著枸杞的保溫杯,胳膊夾著MacBook,MacBook上還貼著公司標語:“加班使我快樂”。 面試官: 看你簡歷上用過MySQL,問你幾個簡單的問題吧。什麼是聚簇索引和非聚簇索引? 這個問題難不住我啊。來之前我看一下一燈M ...
  • tunm二進位協議在python上的實現 tunm是一種對標JSON的二進位協議, 支持JSON的所有類型的動態組合 支持的數據類型 基本支持的類型 "u8", "i8", "u16", "i16", "u32", "i32", "u64", "i64", "varint", "float", "s ...