Dev Talks

Deploy Rails with Docker Swarm (4) - Gitlab Runner 自動化部署

簡巧恩, Rails 工程師 Sep 6, 2022

自動化部署 with Gitlab Runner


Registration

進入上一篇開好的 Manager EC2,並且此時的 EC2 應該已經安裝好 Gitlab Runner,這時候可以直接註冊我們的 Runner:sudo gitlab-runner register,下好指令後一共會問七個問題:

  • Gitlab instance URL
  • Registration Code
    • 前兩個問題可以進入到 Gitlab project > Settings > CI/CD > Runner 去查看設定細節,如附圖的左側
  • Description for runner: docker
    • 附圖右側白底黑字的部分
  • Tags for runner(comma seperated): prod
    • 附圖藍底部分,且這個 tag 是在後續指定 job 要哪個 runner 執行的依據
  • Optional maintenance note for runner: (optional)
  • Enter the executor: docker
  • Default Docker image: tiangolo/docker-with-compose
    • 後續的 job 需要 compose 幫我們 build image,因此需要指定這個 image

.gitlab-ci.yml

這邊主要也是參考 dockerswarm.rocks 的範例,以下簡單介紹一下他的設定內容:

  • Stage: 分為 build 與 deploy
    • Build: docker-compose build --build-arg RAILS_MASTER_KEY=$RAILS_MASTER_KEY
      單純只有 build image,但因為我的 Dockerfile 包含了 Asset Precompile,因此需要帶入 RAILS_MASTER_KEY 做為參數
    • Deploy: docker stack deploy -c docker-compose.yml [stack name]
  • Only: 指定發生於 main branch
  • Tags: 用於指定執行的 runner

EC2 Prerequisites

因為 Traefik 與 Rails App 為獨立的兩個 Stack,為了簡化開發流程,這邊選擇手動進入 EC2 部署 Traefik

原本是另外開一個 traefik 分支做 Traefik 部署(並且指定 Traefik 部署的 job 只發生在該分支、只會發生一次),但在演講時有人反映不確定 traefik 分支部署後要不要合到 main 分支上、git graph 有點不明確,因此改為以公司實際部署的流程做介紹。

  • 開啟一個 swarm:docker swarm init --default-addr-pool 10.20.0.0/16
    • 因為 Docker 預設的 subnet range 與 EC2 相同,都是 10.0.0.1,因此這邊要特別指定不一樣的範圍, Swarm 才連的到外網
  • 開啟 traefik network:docker network create --driver=overlay traefik-public
  • 取得現在的 swarm manager node id:export NODE_ID=$(docker info -f '{{.Swarm.NodeID}}')
  • 指定 traefik 每次都 deploy 在同一個 node & volume 上:docker node update --label-add traefik-public.traefik-public-certificates=true $NODE_ID
  • 部署 traefik:docker stack deploy -c traefik.yml traefik

最後就是把 App 推上 GitLab 進行部署ㄌ!!!


Worker Node 加入 Docker Swarm

到這邊設定完 Manager 節點後,我們可以回去開 Worker Template,把加入 Swarm 的指令加回去:

  1. 先在 Manager 找回加入 Swarm 的指令:docker swarm join-token worker
  2. 在 Worker Template 的 User Data 中加入剛剛找回的指令,於是最終的 User Data 會長下面這樣:
    #!/bin/bash
    # Start docker daemon
    sudo service docker start
    sudo chown ec2-user:docker /var/run/docker.sock
    
    # Join swarm
    docker swarm join --token [JOIN-TOKEN] [IP-ADDRESS]:2377

到這邊主要的技術設定都結束了……真的是超多內容要介紹:) 下一篇會補充一些相關的議題討論,還有這次 COSCUP 演講的心得,希望我不要隔太久才把文章生出來:)


想要閱讀更多來自五倍紅寶石軟體開發的技術分享?歡迎訂閱我們的月報,每月將自動幫你送上最新文章。


分享