iT邦幫忙

0

CI/CD:使用Jenkins(Docker image)自動部署bitbucket專案

流程

  1. 開發本機將新的commit push到bitbucket
  2. bitbucket的指定專案變動,透過webhook觸發jenkins建置
  3. jenkins根據job的指令(shell script)啟動建置作業,包含pull程式碼等
  4. 將建置結果透過slack notification通知使用者

在遠端主機架設jenkins in docker

作業系統: Ubuntu 16.04.4 LTS

  1. 安裝 docker sudo apt install docker.io
  2. 讓主機上的docker能不必透過root身份來操作

If you are installing Docker on a Linux-based operating system, ensure you configure Docker so it can be managed as a non-root user

To create the docker group and add your user:

Create the docker group.

 $ sudo groupadd docker
 
Add your user to the docker group.

 $ sudo usermod -aG docker $USER
 
Log out and log back in so that your group membership is re-evaluated.

If testing on a virtual machine, it may be necessary to restart the virtual machine for changes to take effect.

On a desktop Linux environment such as X Windows, log out of your session completely and then log back in.

On Linux, you can also run the following command to activate the changes to groups:

 $ newgrp docker 
  1. 建立一個名為 jenkins 的 bridge network docker network create jenkins
  2. 執行 jenkins-docker
 docker run \
  --name jenkins-docker \
  --rm \
  --detach \
  --privileged \
  --network jenkins \ 
  --network-alias docker \
  --env DOCKER_TLS_CERTDIR=/certs \
  --volume jenkins-docker-certs:/certs/client \
  --volume jenkins-data:/var/jenkins_home \
  --publish 2376:2376 \ 
  docker:dind \
  --storage-driver overlay2

註:跑jenkins-docker需要dind這個image,可以事先下載,但如果沒下載的話執行完這個指令也會自動幫你裝上。
官網有詳細解釋每行作用:https://www.jenkins.io/doc/book/installing/docker/

  1. 建立一個directory,並在它的目錄下新增一個Dockerfile
FROM jenkins/jenkins:2.289.1-lts-jdk11
USER root
RUN apt-get update && apt-get install -y apt-transport-https \
       ca-certificates curl gnupg2 \
       software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN apt-key fingerprint 0EBFCD88
RUN add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/debian \
       $(lsb_release -cs) stable"
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean:1.24.6 docker-workflow:1.26"
  1. Build docker image docker build -t myjenkins-blueocean:1.1 .
  2. docker the image (這邊為了方便示範,主機開8000 port)
docker run \
  --name jenkins-blueocean \
  --rm \
  --detach \
  --network jenkins \
  --env DOCKER_HOST=tcp://docker:2376 \
  --env DOCKER_CERT_PATH=/certs/client \
  --env DOCKER_TLS_VERIFY=1 \
  --publish 8000:8080 \ #將8080 port發佈到主機的8000port,讓外界可以透過主機上的8000連到container的8080 port
  --publish 50000:50000 \ #這行用在當你的主機上有不只一個jenkins服務在跑
  --volume jenkins-data:/var/jenkins_home \
  --volume jenkins-docker-certs:/certs/client:ro \
  myjenkins-blueocean:1.1 
  1. 開啟主機防火牆:8000 port (這邊端看你上一步下的docker指令指定了哪個主機上的port)
  2. 瀏覽器開啟http://host:8000即可看到jenkins登入畫面docker logs containeriD可以看到secrets,輸入這串密碼就能進到jenkins dashboard了。

建立Slack app

我們希望無論建置成功與否,在建置完畢後都能被通知。這個部分透過slack notification來達成。

  1. 首先需要一個 Slack App 的 Oauth Token 去做認證
    請到 https://api.slack.com/apps 點選要使用的 Slack App 去取得 Oath Access Token。
  2. 點選右上的Create New App,並點選From sctrach
  3. 點選左邊side bar的 OAuth & Permissions。我們需要為這個app產生 Oauth Token。但在這之前必須先連結app到你的workspace。往下滑到Scopes這,我們要選chat:write這個選項

  4. 接著再回到上面,按下 install to workspace,之後就可以產生一組Oauth Token了。等等設定jenkins job時會用到這組token

建立jenkins建置作業

安裝plugin

進入Jenkins的管理頁面
要完成基本的自動部署,我們需要先安裝以下幾個plugin:

  1. bitbucket
  2. publish over SSH
  3. slack notification
    可以在[管理 Jenkins] > [管理外掛程式]這邊下載,裝好之後重啟。
    ,新增一個free style作業。

建立free style作業

  1. 新增作業,選free style
  2. 在原始碼管理的部分選擇git,貼上repo的URL,此時會出現紅字錯誤訊息:

    這是因為我們並沒有提供jenkins進入這個repo的權限。在credentials那新增已放到bitbucket repo下的SSH public key(kind選secret text),或bitbucket的帳密(kind選username with password),看你是用https或SSH。

    新增完之後應該要看到錯誤訊息消失。
  3. 接著在[建置觸發程序],勾選[Build when a change is pushed to BitBucket]和[輪詢 SCM]

設定bitbucket webhook

先來解釋一下webhook的作用。

  • bitbucket的Webhooks:提供在特定事件發生時能讓bitbucket向server發出請求的config。webhook作用的三要素包含:resource(git repo),啟動webhook的事件和url(事件發生時請求發送的edpoint)。
  1. 設定webhook時要先準備jenkins api token。從 [人員] 那點選我的帳號admin,在設定那邊可以看到API Token,點選Add new Token > Generate就可以看到api token了。
  2. 依照以下格式組成你的bitbucket webhook,到bitbucket專案目錄下,[Webhooks]那貼上你的webhook URL。
    格式:http://[jenkins 帳號]:[jenkins api token]@[jenkins url]:[jenkins port]/git/notifyCommit?url=[bitbucket branch]
    例如:
    http://admin:12345678910@54.169.118.4:8080/git/notifyCommit?url=git@bitbucket.org:eunomics/atempo_kid.git
  3. 測試webhook:push看看,在bitbucket [Webhooks] > [剛剛新增的那串webhook] > [View Request]應該可以看到push成功的紀錄。

設定slack notification

  1. 再往下看到 [建置後動作] > [ 新增建置後動作 ],點選 [slack notification]
  2. 在[slack notification]的區塊,先選取你想要被通知的事件,例如建置成功、建置失敗、建置不穩定等...
  3. 接著點選[進階],填入以下欄位:Workspace, Username(app發送通知時顯示的名稱), Credential和Channel / member id。其中credentail就是剛剛準備的slack app oauth token,新增一個secret text,將slack app oauth token貼上即可。
  4. 以上設定完後,點選右下角[Test Connection],看能不能收到slack通知。

設定Publish over SSH

  1. 移至[管理Jenkins > 設定系統 > Publish over SSH] 的部份,並如圖所示新增 SSH server,然後分別輸入 VPS 的:
    • hostname:可下hostname查看
    • username:terminal@前面的部分
    • remote directory:專案路徑
  • 點選進階,勾選 Use password authentication, or use a different key 然後將遠端主機的 SSH private key 貼在 Key 上

  • 點選 Test Configuration,然而會出現以下錯誤

  • 因為在此 jenkins 攜帶主機的 private key 然後 ssh 進入 VPS 中,因此在主機中,我們必須要為自己的 private key 提供一個 public key 接口。
    將 VPS 的 public key 複製並貼在 authorized_keys 檔案裡頭

    cat ~/.ssh/id_rsa.pub
    sudo vim ~/.ssh/authorized_keys

    再試一次 Test Configuration,應該就會成功了。

這邊的行為, Jenkins 會使用 ssh 通道登入遠端主機來進行 CD 操作, 而要建立 ssh 連線, 會需要將我們的 public key 給目標主機, 因此目標主機可以使用 Jenkins 主機提供的 public key 來加密資訊
主機加密後傳給 Jenkins, Jenkins 再用 private key 來解密, 同理, Jenkins 也會從主機獲取主機 public key, blablabla... 所以一台機器上會有自己的 private key 以及目標主機的 public key, 這種行為就是傳說中的, 非對稱加密

  • 回到剛剛建立的作業,點選組態以便繼續編輯

    • 在[建置]中選取 Send files or execute commands over SSH
    • 在 execute commands 中,將必須額外在主機輸入的指令放進去

這樣應該就完成了,可以去專案主機專案目錄底下git log看看是不是有把最新commit拉下來。


尚未有邦友留言

立即登入留言