使用 CircleCI 2.0 進行持續(xù)集成/持續(xù)部署

image.png

“從功能開發(fā)完成直到成功部署”這一階段被稱為軟件開發(fā)“最后一公里”甘有,很多開發(fā)團隊也越來越認識到版保,持續(xù)集成和持續(xù)部署可幫助開發(fā)團隊提高迭代效率和質量。

持續(xù)集成和持續(xù)部署工具層出不窮,CircleCI 就是這類工具中比較優(yōu)秀的一個茬贵。

什么是持續(xù)集成

持續(xù)集成(Continuous Integration)通辰荐縮寫為 CI沼头,
持續(xù)集成指的是,當代碼有變更時书劝,立即進行構建和測試瘫证,反饋運行結果,我們可以根據測試結果庄撮,確定新代碼是否可以和原有代碼正確的集成在一起背捌。
讓你能夠在開發(fā)中隨時發(fā)現(xiàn)問題,在快速的產品迭代中還可以保持很高的質量洞斯。因為修復問題的成本隨著時間的推移而增長毡庆,越早發(fā)現(xiàn),修復成本越低烙如。

什么是持續(xù)部署

持續(xù)部署(Continuous Deployment)通趁纯梗縮寫為 CD,
持續(xù)部署指的是亚铁,當代碼有變更時蝇刀,自動進行測試和構建,如果一切順利則自動部署到服務器上徘溢。

CircleCI 是什么

CircleCI 是一個持續(xù)集成/持續(xù)部署的服務吞琐,開源項目可以免費使用,他的價格取決于你需要并發(fā)構建實例的數(shù)量然爆,單個實例是免費的站粟。

CircleCI 能做什么

他可以綁定 GitHub/Bitbucket,只要你的代碼有變更曾雕,就會自動抓取奴烙,根據你的配置,提供運行環(huán)境,執(zhí)行測試切诀、構建和部署揩环。

CircleCI 的工作流程

image.png

PHP 項目 使用CircleCI 自動部署到 AWS ECS

一. 前期準備

  • GitHub/Bitbucket 帳號
  • 該帳號下面有一個項目

二. CircleCI 配置

1.添加配置文件

要使用 CircleCI,首先在你項目的根目錄創(chuàng)建一個名為.circleci的文件夾幅虑,并新建config.yml文件

2.在 CircleCI 設置你的構建環(huán)境

打開 CircleCI 控制臺 選擇左側的 Add Project , CircleCI 會列出你的 GitHub/Bitbucket 的所有項目丰滑,選擇項目并單擊 Set Up Project 按鈕

image.png

選擇合適的操作系統(tǒng)(Operating System)、合適的編程語言(Language) (本文使用的是 Linux/PHP)

復制下面的示例配置文件到你自己的配置文件中翘单,推送到 git 倉庫吨枉,然后就可以點擊 Start building 進行第一次構建了。

image.png

三. CircleCI 配置文件

CircleCI 配置文件一般由三部分組成

  • 版本 (version)

    • 你要使用的 CircleCI 版本
  • 工作 (jobs)

    • 你要執(zhí)行的 job 清單哄芜,集合中的鍵為 job 的名稱貌亭,值是具體執(zhí)行 job 的內容,如果你使用工作流(workflows)认臊,則 job 的名稱在配置文件中必須唯一圃庭,如果你不使用 工作流(workflows),則必須包含名稱為build的 job 來作為用戶提交代碼時的默認 job失晴。
  • 工作流(workflows)

工作 (jobs)

首先我們來先寫一個基礎的配置文件

# PHP CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-php/ for more details
#
version: 2
jobs:
  build:
    docker:
    - image: circleci/php:7.1-browsers
    # 必要時可以在這里指定依賴鏡像
    # - image: circleci/mysql:9.4

    working_directory: ~/repo

    steps:
    - checkout
    - run: composer install -n --prefer-dist

    # 運行單元測試
    - run: phpunit
  deploy:
    docker:
    - image: circleci/python:3.6.1

    working_directory: ~/repo

    steps:
    

在上面的列子中剧腻,有兩個 job 叫 build/deploy,現(xiàn)在講解一下 job 里面的屬性

  • docker 鍵是用來指定 CircleCI 當前 job 使用 docker, 其值image是指 docker 所使用的鏡像涂屁,必要時你可以同時指定多個鏡像书在,比如你的項目需要依賴 mysql 或者 redis。 第一個列出的容器為主容器拆又,steps 都會在主容器中進行儒旬。

    • CircleCI 預先定義了很多鏡像,您可以在 此處 找到它們
    • 如果不想使用 docker 也可以使用 machine / macos 具體使用方法參考 這里
    • 關于 docker 鍵的其他屬性與用法 你可以在 此處 找到
  • working_directory 屬性是用來定義steps 在哪個目錄運行

  • steps 當前 job 要運行的 命令 (command) 列表

步驟 (steps)

steps 將負責對環(huán)境的初始化帖族,與項目的構建栈源、部署和測試:

一. 構建、測試

  1. 檢出代碼

    # 將分支中的代碼檢出到 working_directory 
    - checkout
    # 讓步驟中可以調用其他 docker
    - setup_remote_docker
    
  2. 從緩存中恢復 composer 依賴目錄

    - restore_cache:
        keys:
        - v1-dependencies-{{ checksum "composer.json" }}
        # 如果沒有匹配的緩存則使用最新的緩存
        - v1-dependencies-
    

    我們可以使用緩存功能來避免每次都重新 composer install竖般,可以節(jié)約大量時間

    {{ checksum "filename" }} 
    

    這部分指的是甚垦,給 filename 這個文件的文件內容 Base64 后取 SHA256 hash
    其他模版語法請查看 官方文檔

    • 我們使用了兩個緩存的 key 第一個是精確匹配設置的緩存 key,第二個是當用戶修改 composer.json 文件時涣雕,我們不能精確匹配緩存艰亮,這時候恢復最近的一次緩存
  3. 安裝依賴

    - run:
        name: Install local dependencies
        command: composer install -n --prefer-dist
    

    如果上一步恢復緩存的時候已經恢復了這些依賴項,則這步將非嘲罚快垃杖。

  4. 緩存依賴

    - save_cache:
        paths:
        - ./vendor
        key: v1-dependencies-{{ checksum "composer.json" }}
    

    經歷了上一步,我們就會有一份當前版本完整的依賴目錄,路徑為vendor,這時我們把它緩存起來方便下次使用

  5. 測試

    - run:
        name: Testing
        command: phpunit
    

    我們運行測試的命令丈屹,如果測試有任何不通過則本次構建將失敗。

  6. 打包 docker 鏡像

    - run:
        name: Build image
        command: |
            docker build -t $FULL_IMAGE_NAME .
            mkdir docker-image
            docker save -o docker-image/image.tar $FULL_IMAGE_NAME
    

    打包 docker 鏡像并命名為 $FULL_IMAGE_NAME,并將鏡像 保存成 tar 歸檔文件

  7. 運行并簡單測試鏡像

    - run:
        name: Test image
        command: |
          docker run -d -p 8080:80 --name built-image $FULL_IMAGE_NAME
          sleep 10
          docker run --network container:built-image byrnedo/alpine-curl -I --retry 10 --retry-connrefused http://localhost
    

    運行剛才打包好的鏡像旺垒,然后使用 curl 對打包好的鏡像進行簡單測試

  8. 保存鏡像到是臨時文件

    - persist_to_workspace:
        root: .
        paths:
        - docker-image
    

    保存剛才鏡像 tar 歸檔文件到 workspace彩库,以便 build job 使用

二. 部署

  1. 檢出代碼

  2. 加載構建好的 docker 鏡像

    - attach_workspace:
        at: workspace
    - run:
        name: Load image
        command: |
          docker load --input workspace/docker-image/image.tar
    

    掛載 workspace 到當前 job, 掛載后 當前 job 的 workspace/docker-image/image.tar 為上一步打包出的 docker 鏡像

    使用 docker load 導入鏡像

  3. 安裝 aws cli

    - restore_cache:
        key: v1-{{ checksum "requirements.txt" }}
    - run:
        name: Get Aws-cli
        command: |
        python3 -m venv venv
        . venv/bin/activate
        pip install -r requirements.txt
    - save_cache:
        key: v1-{{ checksum "requirements.txt" }}
        paths:
        - "venv"    # Download and cache dependencies
    

    安裝 aws cli 到 python venv 環(huán)境

  4. 推送鏡像到 aws ecr

    - run:
        name: Push Docker Image
        command: |
          . venv/bin/activate
          $(aws ecr get-login --no-include-email)
          docker tag mobingi-api-cn $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com.cn/mobingi-api-dev:$CIRCLE_SHA1
          docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com.cn/mobingi-api-dev:$CIRCLE_SHA1
    

    推送 docker 鏡像到 aws ecr

    為了使 aws 能正常登陸,docker 鏡像能正確 push 到 ecr先蒋,你需要在 CircleCI 當前項目中設置環(huán)境變量(設置方法)

    變量名稱 變量值
    AWS_ACCOUNT_ID AWS_ACCOUNT_ID
    AWS_ACCESS_KEY_ID AWS_ACCESS_KEY_ID
    AWS_DEFAULT_REGION AWS CLI 默認使用的地區(qū)
    AWS_SECRET_ACCESS_KEY AWS_SECRET_ACCESS_KEY

更多 steps 信息請查看 官方文檔

工作流 (workflows)

用于編排所有 job骇钦。假設您需要在特定分支或特定時間運行job,或者您希望某些 job 并行運行竞漾,而某些 job 依次運行眯搭。

在工作流配置中,使用工作流名稱作為配置的鍵业岁。工作流名稱在當前配置文件中必須全局唯一鳞仙。

下面是工作流使用的例子

workflows:
  version: 2
  nightly:
    triggers:
    - schedule:
        cron: "0 0 * * *"
        filters:
          branches:
            only:
            - master
            - beta
    jobs:
    - test

nightly 為工作流名稱

schedule 可以指定工作流在指定時間工作

cron 使用POSIX定義crontab語法

filters->branches 過濾的分支

  • 任何符合only條件的分支都會運行該工作流
  • 任何符合ignore 條件的分支都不會運行該工作流
  • 如果未定義 onlyignore 則所有分支豆?jié){運行該工作流
  • 如果同時符合onlyignore 優(yōu)先考慮 ignore

根據上面的介紹我們可以將我們前面的兩個 job build 和 deploy 編排成一個工作流 (workflows) 并命名為:build-deploy

workflows:
  version: 2
  build-deploy:
    jobs:
    - build
    - deploy:
        requires:
        - build

更多信息請查看 官方文檔

設置項目環(huán)境變量

因為有很多值不方便出現(xiàn)在 CircleCI 的配置文件中,例如一些密匙笔时、服務 IP 等等棍好。這時候我們就可以在 CircleCI 的管理面板中設置環(huán)境變量,然后在 job 獲取這些變量允耿。

1.在項目的的左上角借笙,選擇這個??按鈕

image.png

2.選擇 Environment Variables -> Add Variable

在彈出的框中輸入環(huán)境變量的 name 和 value 即可

使用 ssh 調試

當出現(xiàn)問題時,我們可能需要對問題進行調試较锡,這時后我們可以 ssh 到 job 中對問題進行排查业稼。

在出現(xiàn)問題的 job 右上角,在 Rebuild 下拉菜單中選擇 Rebuild with SSH


image.png

稍等幾分鐘后

image.png

使用紅圈中的命令即可使用 SSH 登陸當前 job 環(huán)境

SSH 將保持可用狀態(tài)10分鐘,然后自動關閉蚂蕴。

更多信息請查看 官方文檔

本地測試 CircleCI 配置文件

  1. 創(chuàng)建個人API令牌 (dashboard->User Settings->Personal API Tokens->Create New Token)
  2. 設置環(huán)境變量 export CIRCLE_TOKEN=<你剛剛創(chuàng)建的 token>
  3. 收集以下信息:
  • 提交構建的哈希值
  • 用戶名
  • 項目來源
  • 項目名
  • 從哪個分支建立
  1. .circleci 目錄,創(chuàng)建 shell 腳本run-build-locally.sh 文件低散,文件內容為
#!/usr/bin/env bash
curl --user ${CIRCLE_TOKEN}: \
    --request POST \
    --form revision=<commit hash>\
    --form config=@config.yml \
    --form notify=false \
        https://circleci.com/api/v1.1/project/<source, eg. github>/<user name>/<project name>/tree/<branch name>

更多信息請查看 官方文檔

其他資料

最終配置

CircleCI 官方入門簡介

CircleCI 官方各種語言例子

CircleCI 官方配置說明

CircleCI官方例子 circleci-demo-aws-ecs-ecr

第三方參考例子 docker-circleci-ecr-ecs

參考文章

如何理解持續(xù)集成、持續(xù)交付掂墓、持續(xù)部署谦纱?

持續(xù)集成服務 Travis CI 教程

How CircleCI Works

How we used CircleCI 2.0 to build and deploy an Angular app to AWS S3

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市君编,隨后出現(xiàn)的幾起案子跨嘉,更是在濱河造成了極大的恐慌,老刑警劉巖吃嘿,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祠乃,死亡現(xiàn)場離奇詭異,居然都是意外死亡兑燥,警方通過查閱死者的電腦和手機亮瓷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來降瞳,“玉大人嘱支,你說我怎么就攤上這事蚓胸。” “怎么了除师?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵沛膳,是天一觀的道長。 經常有香客問我汛聚,道長锹安,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任倚舀,我火速辦了婚禮叹哭,結果婚禮上,老公的妹妹穿的比我還像新娘痕貌。我一直安慰自己风罩,他們只是感情好髓削,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布朴恳。 她就那樣靜靜地躺著莲兢,像睡著了一般震捣。 火紅的嫁衣襯著肌膚如雪笋颤。 梳的紋絲不亂的頭發(fā)上祸憋,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天虐急,我揣著相機與錄音比庄,去河邊找鬼唉工。 笑死研乒,一個胖子當著我的面吹牛,可吹牛的內容都是我干的淋硝。 我是一名探鬼主播雹熬,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谣膳!你這毒婦竟也來了竿报?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤继谚,失蹤者是張志新(化名)和其女友劉穎烈菌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體花履,經...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡芽世,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诡壁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片济瓢。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妹卿,靈堂內的尸體忽然破棺而出旺矾,到底是詐尸還是另有隱情蔑鹦,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布宠漩,位于F島的核電站举反,受9級特大地震影響懊直,放射性物質發(fā)生泄漏扒吁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一室囊、第九天 我趴在偏房一處隱蔽的房頂上張望雕崩。 院中可真熱鬧,春花似錦融撞、人聲如沸盼铁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饶火。三九已至,卻和暖如春致扯,著一層夾襖步出監(jiān)牢的瞬間肤寝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工抖僵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鲤看,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓耍群,卻偏偏與公主長得像义桂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蹈垢,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理慷吊,服務發(fā)現(xiàn),斷路器曹抬,智...
    卡卡羅2017閱讀 134,716評論 18 139
  • <<互聯(lián)網敏捷DevOps和自動化之5.持續(xù)集成>>持續(xù)集成的價值是什么溉瓶?對于開發(fā)和測試人員又意味著什么呢?1.1...
    燕京博士閱讀 2,792評論 0 5
  • 本章是成本概念總結 成本概念深不可測 因為它是靠想象出來的沐祷,所以深不可測嚷闭、千變萬化。成本概念可以從具體到抽象赖临、從個...
    爺有蔓草閱讀 400評論 0 0
  • 前兩天和媽媽處去遛彎兢榨,拍了很多照片嗅榕,媽媽挑了其中一張照片說顺饮,我最喜歡這張,這張顯得比較嫩凌那。我說兼雄,媽媽,你看你...
    聲聲曼man閱讀 1,131評論 7 6