国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Docker 入門(三):持續集成、持續部署

newtrek / 1420人閱讀

摘要:為了看起來清晰,我寫了一個文件,將這個文件和之前的放在同一個目錄中,可以用以下命令快速啟動,啟動之后新構建的鏡像和容器都名為。

在軟件開發過程中,如果我們每一次提交的代碼都能夠進行一次完整的編譯、測試、打包、發布,就能及早發現問題、及早修復,在保證代碼質量的同時讓產品快速迭代。這就是持續集成(CI)、持續部署(CD)的好處。

目前 CI/CD 的方案有很多,本文將展示一個用 Docker + Jenkins 實現的完整過程。

本文的 CI/CD 流程

開發人員提交代碼到自己的分支并 push 到遠程倉庫 ==> 觸發遠程倉庫(GitHub/GitLab)的 Webhooks ==> Jenkins 接到通知自動執行之前準備好的一個流程(克隆代碼,對代碼進行編譯、測試、打包,沒有問題后會執行 docker 命令進行鏡像構建)==> 最終發布到測試服務器中。

環境說明

本文選用的測試環境是阿里云的服務器,所以全程也是在服務器上操作的,無需本地安裝 docker,當然在本地操作也是可以的。

本文選用的遠程代碼庫是 GitHub 公有倉庫,如果是私有倉庫或 GitLab,步驟會略有不同。

本文中所用的 Jenkins 也是用的 docker 版,并不是直接安裝在宿主機上的。

開始一個 docker 應用

要演示整個過程,就得有一個應用,這里我們用一個 create-react-app 為例,無需 IDE,一個 terminal 即可搞定。

首先創建 react-app 和 Dockerfile

4、5 行是增加了一個設置,是關掉 webpack 的 host 檢查,如果不加此項,訪問綁定域名的服務器就會被 webpack-dev-server 攔截。
$ npm install -g create-react-app
$ create-react-app my-app
$ cd my-app
$ touch .env
$ echo DANGEROUSLY_DISABLE_HOST_CHECK=true > .env
$ touch Dockerfile

將以下內容寫入 Dockerfile:

為了簡單,我們這里直接采用 npm start 的方式啟動它,就不 build 了,安裝 cnpm 是為了提高依賴的下載速度
FROM node:8.11.1-slim

WORKDIR /home/app

COPY . ${WORKDIR}

RUN npm install -g cnpm --registry=https://registry.npm.taobao.org 
    && cnpm install

EXPOSE 3000

ENTRYPOINT [ "npm", "start" ]

到這里就完全好了,單元測試什么的就暫且忽略。

為什么要使用 Jenkins

如果沒有 Jenkins,就上面那個例子,我們想要將自己的代碼集成并且部署到服務器,可能要經歷以下步驟:

1、將代碼 push 到倉庫

2、ssh 登錄服務器,克隆代碼到宿主機(宿主機還要安裝 git)

3、執行以下命令完成鏡像構建和部署

$ cd repository
$ docker build -t test .
$ docker run -d -p 80:3000 --name my-react test

可以看到上面那個過程需要人工操作,非常繁瑣,這還沒算上對代碼進行測試,如果每次提交了代碼都要來一個這樣的過程,那是真的沒法專心搞開發了。

如果用了 Jenkins,上面的整個過程都可以自動化完成。

初始化 Jenkins

Jenkins 的官網是 jenkins.io,它有很多種安裝方式,例如下載 war 包到宿主機上,然后用 java -jar jenkins.war 命令啟動。但是這種安裝方式非常不利于管理和服務器的遷移,完全是在給 docker 托后腿。所以我選擇用 docker 版的 jenkins。

使用 docker 版的 jenkins 是需要注意很多細節的

首先我們要重寫官方 jenkins 鏡像

$ vi Dockerfile
FROM jenkins/jenkins:lts

USER root

RUN echo deb http://mirrors.aliyun.com/debian wheezy main contrib non-free 
    deb-src http://mirrors.aliyun.com/debian wheezy main contrib non-free 
    deb http://mirrors.aliyun.com/debian wheezy-updates main contrib non-free 
    deb-src http://mirrors.aliyun.com/debian wheezy-updates main contrib non-free 
    deb http://mirrors.aliyun.com/debian-security wheezy/updates main contrib non-free 
    deb-src http://mirrors.aliyun.com/debian-security wheezy/updates main contrib non-free 
    > /etc/apt/sources.list 
    && apt-get update 
    && apt-get install -y libltdl-dev
這里用了 jenkins 最新穩定版最為基礎鏡像,主要干了兩件事:一、將賬戶改為 root,避免后面不必要的權限問題;二、安裝 libltdl-dev ,它是為了解決用 jenkins 調用容器外部 docker 命令時發生以下錯誤的問題。(第 4~10 行是為了換阿里源提高速度)
docker: error while loading shared libraries: libltdl.so.7: cannot open shared object file: No such file or directory

在啟動剛剛重寫好的 jenkins 鏡像的時候還需要掛載三個宿主機的目錄到容器內,第一個 jenkins_home 是為了對容器內 jenkins 的所有改動做數據持久化。最后兩個目錄是為了能讓容器內的 jenkins 調用并操作容器外的 docker

$ vi docker-compose.yml
version: "3"
services:
 jenkins:
  build: .
  image: my_jenkins
  ports:
    - "8090:8080"
    - "50000:50000"
  container_name: my_jenkins
  volumes:
    - "/home/jenkins_home:/var/jenkins_home"
    - "/var/run/docker.sock:/var/run/docker.sock"
    - "/usr/bin/docker:/usr/bin/docker"
為了看起來清晰,我寫了一個 docker-compose.yml 文件,將這個文件和之前的 Dockerfile 放在同一個目錄中,可以用以下命令快速啟動 jenkins,啟動之后新構建的鏡像和容器都名為 my_jenkins。
$ docker-compose up -d

啟動 jenkins 后瀏覽器訪問 ip:8090 可看到初始化頁面

這里要輸入密碼,它給出了密碼在容器內的位置,我們要將路徑改成宿主機上的,然后 cat 一下就能看到密碼。
$ cat /home/jenkins_home/secrets/initialAdminPassword 

將密碼粘貼進去然后點繼續,下一個頁面選擇插件,點默認推薦的就好了

接著按提示創建一個賬戶

之后就能夠使用 jenkins 了

配置 Webhooks

要讓 jenkins 操作本機上的 docker 的前提是它收到了我們 push 代碼的通知,而這個通知就是由 GitHub 上的 Webhooks 來完成的,所以要將這兩者關聯起來。

配置 Webhooks 之前首先要更改一下安全設置

打開全局安全配置,軟后進行如下操作,否則 Webhooks 連接不成功,設置好了別忘了點保存。

開始創建任務

點擊首頁的「開始創建一個新任務」,起個名字,選擇流水線。

生成身份令牌

點擊「構建觸發器」,選擇「觸發遠程構建」,然后隨便填寫一段字符,然后把 URL 復制下來,記得把「JENKINS_URL」和「TOKEN_NAME」替換為相應的值,例如下圖最終得到的 URL 就是 111.11.1.1:8090/job/test/build?token=123456,記下 URL 后點保存。

去 GitHub 創建 Webhooks

打開我們要 push 代碼的倉庫,點擊「Add webhook」

然后將剛才記下的回調 URL 填寫到這里即可

此時,可以嘗試一下 push 代碼到倉庫,正常情況下,jenkins 就會自動進行構建,雖然沒有配置要構建什么,但是它也會進行這個任務,如果構建歷史中自動出現了一個顏色是藍色的任務則代表整個自動觸發的過程是配置成功的。

編寫自動任務腳本進行 CI/CD

點擊上面那個任務的「配置」,切換到流水線這里。本文不介紹流水線語法,就用 shell 命令來編寫整個過程。但我們首先還是要點擊「流水線語法」

將示例步驟切換到「sh: Shell Script」,編寫好 shell 腳本,熟悉 linux 命令的話,這個過程也應該很容易。寫好之后點擊「生成流水線腳本」,之后把生成好的流水線腳本復制下來

將生成好的 流水線腳本復制到這里就好了,不過要把它復制到一個 node{} 里面才行。

以下是我寫的生成好的流水線腳本,記得把定義的四個變量替換一下。
node {
    sh """#!/bin/sh

    REPOSITORY_NAME="你的倉庫名"
    REPOSITORY_URL="你的倉庫地址"
    IMAGE_NAME="給你要構建的鏡像起個名字"
    CONTAINER_NAME="給你要構建的容器起個名字"
       
    echo "清除倉庫目錄"
    rm ${REPOSITORY_NAME} -r
       
    echo "克隆遠程倉庫"
    git clone ${REPOSITORY_URL}

    echo "刪除之前的鏡像和容器"
    docker stop ${CONTAINER_NAME}
    docker rm ${CONTAINER_NAME}
    docker rmi ${IMAGE_NAME}
    
    echo "構建鏡像"
    cd ${REPOSITORY_NAME}
    docker build -t ${IMAGE_NAME} .
    
    echo "發布應用"
    docker run -d -p 80:3000 --name ${CONTAINER_NAME} ${IMAGE_NAME}"""

}

最后可以提交一次代碼或者點擊「立即構建」,就會自動完成整個過程,在「控制臺輸出」那里可以看到構建過程。

此時,瀏覽器訪問 ip 就能看到更新過的應用了,這就是一個 CI/CD 過程,整個過程省略的測試環節,可自行加上。

后記

用一個測試服務器來做 CI/CD,能夠更及時的發現問題、解決問題,提高代碼質量。

但是本文所展示的過程缺陷也很明顯,在更新應用時,是會先停掉容器,再啟動新容器的,不能做到無宕機更新。而且整個過程也沒有服務監控什么的,不能很好地了解無服務的運行狀態。

總之,到目前為止,我們已經能夠很好地將 docker 用在日常的開發中了。

點擊查看博客原文

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/27309.html

相關文章

  • CI Weekly #4 | 不同規模的團隊,如何做好持續集成?

    摘要:王者榮耀項目組高級測試工程師工程師文化團隊中的實踐本文不是一篇入門教程,而是從結合實際場景,闡述在團隊協作中如何去好好地應用。 CI Weekly 圍繞『 軟件工程效率提升』 進行一系列技術內容分享,包括國內外持續集成、持續交付,持續部署、自動化測試、 DevOps 等實踐教程、工具與資源,以及一些工程師文化相關的程序員 Tips 。同步于 flow.ci Blog、微信公眾號、官方微...

    jeffrey_up 評論0 收藏0
  • Docker入門

    摘要:隔離的進程獨立于宿主和其它的隔離的進程。容器可以被創建啟動停止刪除暫停等。添加內核參數使用看到下面的這些警告信息解決方法內核配置參數以啟用這些功能。然后重新加載 Docker簡介 Docker 是使用 Go 語言 進行開發實現,基于 Linux 內核的 cgroup,namespace,以及 AUFS 類的 Union FS 等技術,對進程進行封裝隔離,屬于 操作系統層面的虛擬化技...

    netScorpion 評論0 收藏0
  • Docker入門

    摘要:隔離的進程獨立于宿主和其它的隔離的進程。容器可以被創建啟動停止刪除暫停等。添加內核參數使用看到下面的這些警告信息解決方法內核配置參數以啟用這些功能。然后重新加載 Docker簡介 Docker 是使用 Go 語言 進行開發實現,基于 Linux 內核的 cgroup,namespace,以及 AUFS 類的 Union FS 等技術,對進程進行封裝隔離,屬于 操作系統層面的虛擬化技...

    Benedict Evans 評論0 收藏0
  • PHP新手開發者的路線建議

    摘要:年開發者應該熟練使用,并且知道版本更新內容。對開發和運維人員來說,最希望的就是一次性創建或配置,可以在任意地方正常運行。是標準規范,是開發的實踐標準。對開發者來說語言推薦和,全棧的選擇非常多,推薦熱門的 前言 在前天(2018-08-02)已經發布了PHP 7.3.0.beta1 Released 如果你還沒有使用 PHP7 ,那真的很遺憾。2018年PHP開發者應該熟練使用 PHP7...

    klinson 評論0 收藏0

發表評論

0條評論

newtrek

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<