配置drone+docker+gogs+nodejs項目自動發布


最近學習了一下自動化部署相關的技術,記錄一下自己的學習歷程。

去年的時候騰訊雲服務器搞活動,於是購買了一台雲服務器用於學習。自己畢業后在第一家公司工作時,一直感覺項目上線是一件很頭疼的事情,當時是采用pm2+nodejs的方式,項目上線就是登錄到服務器上,手動替換js文件,然后用pm2重啟進程。由於當時部門之間分工不明確,我作為開發有時候也要負責項目上線,經常每天晚上11點在家加班,那時候感覺還是挺痛苦的,於是感覺自動化部署是很有必要的。

自己學習的時候,也是鎖定了兩款自動化部署工具:jenkins、drone,然后選擇了drone先學習一下,根據好多前輩的反饋,drone比jenkins更加小巧一點吧,但是也夠用;然后git倉庫,選擇的是drone支持的gogs,功能可能沒有GitHub多但是也夠用了,個人感覺一些中小型公司完全是可以直接使用的。

大致安裝配置步驟如下:

1、安裝docker

  1、確保 yum 包更新到最新:
    sudo yum update
  2、卸載舊版本:
    sudo yum remove docker docker-common docker-selinux docker-engine
  3、安裝需要的軟件包
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  4、設置yum源
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  5、查看所有倉庫中所有docker版本,並選擇特定版本安裝
    yum list docker-ce --showduplicates | sort -r
  6、安裝docker
    sudo yum install docker-ce
  7、啟動並加入開機啟動
    sudo systemctl start docker
    sudo systemctl enable docker
  8、驗證安裝是否成功
    docker version

關於docker下載速度慢的問題,網上有很多解決辦法,可以自行百度,我推薦一種方法:

2、docker加速:
  1、登錄阿里雲,控制台里面找到“容器鏡像服務”,再找到“鏡像加速器”選項:
  2、編輯文件:
    vim /etc/docker/daemon.json
    加入花括號以及里面的內容:
    {
      "registry-mirrors": ["xxxxx"]
    }

3、安裝 docker-compose。

  1、執行以下命令下載:

    sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

  2、賦予文件可執行權限

    sudo chmod +x /usr/local/bin/docker-compose

  3、執行docker-compose命令查看安裝是否成功

    docker-compose version

4、准備 docker-compose.yml 文件,用於安裝 drone、gogs、mysql 等等。

version: '3'
services:
  drone-server:
    image: drone/drone:latest
    ports:
      - "8080:80"
      - "8843:443"
      - "9000"
    volumes:
      - ./drone:/var/lib/drone/
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    environment:
      - DRONE_OPEN=true
      - DRONE_SERVER_HOST=drone-server
      - DRONE_SERVER_PROTO=http
      - DRONE_LOGS_TRACE=true
      - DRONE_LOGS_DEBUG=true
      - DRONE_GOGS=true
      - DRONE_GOGS_SERVER=http://xxx:3000
      - DRONE_PROVIDER=gogs
      - DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite
      - DRONE_DATABASE_DRIVER=sqlite3
      - DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
      - DRONE_USER_CREATE=username:xxx,admin:true
  drone-agent:
    image: drone/agent:latest
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    environment:
      - DRONE_RPC_SERVER=http://drone-server
      - DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
      - DRONE_LOGS_TRACE=true
      - DRONE_LOGS_DEBUG=true
  gogs:
    image: gogs/gogs:latest
    ports:
      - "10022:22"
      - "3000:3000"
    volumes:
      - ./data/gogs:/data
    depends_on:
      - mysql
  mysql:
    image: mysql:5.7.16
    volumes:
      - ./gogs/mysql:/var/lib/mysql
    ports:
      - 3308:3306
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_DATABASE: gogs
      MYSQL_USER: gogs
      MYSQL_PASSWORD: pass
      TZ: Asia/Shanghai

   以上有些用x代表的地方換成自己的ip或者名稱就好。

5、將 docker-compose.yml 文件上傳到雲服務器,目錄自己定就好,然后執行:

    docker-compose up -d

  之后,docker就會自動安裝好:drone、gogs、mysql

6、然后就是配置gogs和drone,首先登錄 http://ip:3000/,第一次登錄需要配置,如下圖:

   

   之后點擊立即安裝,gogs就安裝好了。

7、配置drone,打開http://ip:8080/,初始登錄賬號密碼就是上面最后一張圖里面你配置的gogs的賬號密碼,之后就會進入到主界面。

8、創建node項目

  自己隨便在gogs創建一個nodejs項目,比如一個簡單的后端server就行,只要可以運行就可以,然后上傳到gogs

9、登錄drone,同步項目

10、同步結束之后,再次登錄gogs,打開項目倉庫,倉庫設置,管理web鈎子,會發現自動多出了一條鈎子,可以打開並測試它

11、之后在nodejs項目根目錄添加.drone.yml文件,我自己想的是,項目一共分為3個分支:devlopment, test, master,服務器也有3個,並對應這三個分支的運行環境

pipeline:
  # 加載緩存 node_modules
  restore-cache:
    image: drillster/drone-volume-cache
    restore: true
    mount:
      - ./node_modules
    volumes:
      - /tmp/cache:/cache
    when:
      # 觸發事件類型[push], [pull_request]
      event: [push, pull_request]
      # 觸發分支
      branch: [devlopment, test, master]

  # install
  install:
    image: node:12-alpine
    commands:
      # 刪除文件 npm install
      - rm -rf package-lock.json
      - npm --registry https://registry.npm.taobao.org install
    when:
      event: [push, pull_request]
      branch: [devlopment, test, master]

  # 更新node_modules緩存
  rebuild-cache:
    image: drillster/drone-volume-cache
    rebuild: true
    mount:
      - ./node_modules
    volumes:
      - /tmp/cache:/cache
    when:
      event: [push, pull_request]
      branch: [devlopment, test, master]

  # push
  dev-push:
    image: appleboy/drone-scp
    host: xxx     # 可以寫到secret中
    port: 22
    username: xxx
    password: xxx
    target: /app/vue-manage-server
    source: .
    rm: true
    when:
      event: [push, pull_request]
      branch: [devlopment]

  # push
  test-push:
    image: appleboy/drone-scp
    host: xxx     # 可以寫到secret中
    port: 22
    username: xxx
    password: xxx
    target: /app/vue-manage-server
    source: .
    rm: true
    when:
      event: [push, pull_request]
      branch: [test]

  # push
  master-push:
    image: appleboy/drone-scp
    host: xxx     # 實際應用中,可以寫到secret中
    port: 22
    username: xxx
    password: xxx
    target: /app/vue-manage-server
    source: .
    rm: true
    when:
      event: [push, pull_request]
      branch: [master]

  # run
  dev-run:
    image: appleboy/drone-ssh
    host: xxx
    username: xxx
    password: xxx
    port: 22
    command_timeout: 300s
    script:
      - cd /app/vue-manage-server
      - mkdir seresr
    when:
      event: [push, pull_request]
      branch: [devlopment]

  # run
  test-run:
    image: appleboy/drone-ssh
    host: xxx
    username: xxx
    password: xxx
    port: 22
    command_timeout: 300s
    script:
      - cd /app/vue-manage-server
      - mkdir seresr
    when:
      event: [push, pull_request]
      branch: [test]

  # run
  master-run:
    image: appleboy/drone-ssh
    host: xxx
    username: xxx
    password: xxx
    port: 22
    command_timeout: 300s
    script:
      - cd /app/vue-manage-server
      - docker build -t vue-manage-server .
      - docker run -d -p 4000:4000 vue-manage-server
    when:
      event: [push, pull_request]
      branch: [master]    

 上面的文件其實挺好理解,xxx替換成自己的,有些路徑也替換成自己的。

12、由於上面最后發布項目利用了docker,所以需要項目添加 Dockerfile 文件,根據你自己的項目自行編寫文件

FROM node:12-alpine

WORKDIR /usr/src/app

COPY package.json ./
COPY package-lock.json ./

# in workdir install
RUN npm --registry https://registry.npm.taobao.org install

# Bundle app source
COPY . ./

EXPOSE 4000
CMD ["node","server.js"]

13、把.drone.yml和Dockerfile文件推上去之后,可能會報錯:untrusted repositories cannot mount host volumes,在drone設置里改一下配置即可:

 

 14、執行結果如下,那么就算成功了,整個流程當然肯定有不太穩妥的地方,畢竟第一次學習。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM