使用github actions配置你的第一個CI/CD

github Actions

TL;DR

本文將從0到1,利用Github Actions配置出一套CI/CD

大體思路為,構(gòu)建 docker image -> push docker image -> 訪問遠程主機 -> pull docker image -> run docker image

簡介

簡單來說,github Actions為github自己推出的一套 workflow夯辖,在repo首頁點擊該按鈕可以進入迅诬。

image.png

通過workflow箭养,你可以根據(jù)需要配置許多自定義的事件,例如每push完自動跑test偶宫,也例如本文要介紹的自動化CI/CD非迹。

并且Github workflow支持許多hooks,包括不限于push纯趋,pull request憎兽,fork,issue吵冒,定時任務(wù)唇兑。大家可以發(fā)揮自己的想象力做很多有意思提高生產(chǎn)力的事情。

前期準備

這里用create-react-app 作為項目demo

npx create-react-app my-app
cd my-app
touch Dockerfile

經(jīng)過上述3個命令桦锄,我們創(chuàng)建了一個React應(yīng)用扎附,并且建了一個Dockerfile文件

此時編輯Dockerfile

FROM node:12.16.1 
RUN yarn global add serve 
COPY yarn.lock package.json ./ 
RUN yarn COPY src src 
COPY public public 
RUN yarn build 
EXPOSE 4000 
CMD ["serve","build", "-p", "4000"]

Dockerfile命令很基礎(chǔ),大致意思就是

從node:12.16.1版本作為基礎(chǔ)鏡像

全局下載serve结耀,主要用來起靜態(tài)服務(wù)

執(zhí)行yarn和build命令

最后用serve起一個4000的端口

這里CMD和RUN都是用來執(zhí)行命令留夜,區(qū)別之一在于RUN是在build image階段執(zhí)行,而CMD是在run container階段執(zhí)行的图甜。

現(xiàn)在本地起run一下該image本地測試一下

docker build -t my-app .
docker run -p 4000:4000 -d my-app

此時瀏覽器打開localhost:4000應(yīng)該成功看到一個React頁面

github workflow編寫

接來下就是要創(chuàng)建github workflow

cd my-app
touch .github/workflows/firstWorkflow.yml

值得注意的是workflow的編寫是YAML語法碍粥,不熟悉的可以上網(wǎng)看一下文檔,這里推薦阮一峰的文章(https://www.ruanyifeng.com/blog/2016/07/yaml.html)可以有個基礎(chǔ)了解

name: Docker Image CI/ CD
env:
  DOCKER_REG: registry.cn-shanghai.aliyuncs.com/my-namespce/my-app
  REG: registry.cn-shanghai.aliyuncs.com
on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

name:workflow的名字
env: 環(huán)境變量黑毅,由于我這里用的是阿里云的Docker registory嚼摩,你也可以換成你需要的registory
on:表示了該workflow的觸發(fā)時機,這里為當對master分支執(zhí)行push或者pull request時觸發(fā)

build

build部分大體就是build一個image,然后push到Docker Registory

jobs:
  build:
    runs-on: ubuntu-latest     
    steps:
    - uses: actions/checkout@v2
    - name: Login Docker
      run:
        echo "${{ secrets.PASSWORD }}" | docker login $REG -u "${{ secrets.USERNAME }}" --password-stdin
    - name: Build the Docker image
      run:
        docker build . --file Dockerfile --tag image
    - name: Push Image
      run: |
        # Strip git ref prefix from version
        VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
        # Strip "v" prefix from tag name
        [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
        # Use Docker `latest` tag convention
        [ "$VERSION" == "master" ] && VERSION=latest
        echo IMAGE_ID=$DOCKER_REG
        echo VERSION=$VERSION
        docker tag image $DOCKER_REG:$VERSION
        docker push $DOCKER_REG:$VERSION

runs-on: 表示該job運行的虛擬環(huán)境枕面,目前內(nèi)置支持的環(huán)境有Linux愿卒,MacOS,Windows潮秘,當然你也可以自己搭建

對于job琼开,可以理解為一個workflow有若干個job組成,例如這里枕荞,會分成為build和接下來的deploy柜候,通常來說job是并行的,也可以配置成串行躏精。

steps: steps就是在job里執(zhí)行命令或者action的task渣刷,一個jobs可以有多個steps

這里重點說一下action,action是workflow里可移植和共享的邏輯矗烛,可以理解為npm的package辅柴。訪問action市場可以看到許多有意思有用的action<https://github.com/marketplace?type=actions>

image.png

回到step的編寫,這里使用的是最基礎(chǔ)的action高诺,即actions/checkout@v2碌识,它的作用就是讓我們的workflow可以訪問到我們的repo。后續(xù)的name虱而、run筏餐,就是給每一個執(zhí)行命令定義了一個名字,這樣我們在看job執(zhí)行的時候牡拇,可以很方便的檢出我們執(zhí)行的哪一步出了什么問題魁瞪。

${{ secrets.PASSWORD }} 這個語法需要注意一下,這是github workflow特有的語法惠呼,括號內(nèi)部是表達式导俘,其可以訪問到workflow的上下文,例如secrets剔蹋、github等旅薄。具體可以參考該鏈接<https://help.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions>

具體的執(zhí)行步驟就大致為: 登錄Docker -> build Docker -> tag Docker -> push Docker

deploy

deploy部分大體思路就是登連接到遠程服務(wù)器,pull并啟動剛剛build好的iamge

  deploy:
    runs-on: ubuntu-latest
    needs: build
    env:
      CONTAINER_NAME: my-app
    steps:
    - name: deploy docker image
      uses: appleboy/ssh-action@v0.0.7
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.HOST_USERNAME }}
        password: ${{ secrets.HOST_PASSWORD }}
        envs: CONTAINER_NAME, DOCKER_REG
        script: |
          if [ $(docker ps -a | grep -c $CONTAINER_NAME) -gt 0 ]; then docker stop $CONTAINER_NAME;docker rm $CONTAINER_NAME;fi
          docker run --name $CONTAINER_NAME -d -p 4000:4000 $DOCKER_REG

needs: 之前提到j(luò)ob的執(zhí)行默認是并行的泣崩,那么這里加上needs之后少梁,會將job的執(zhí)行變成串行,意思為當前該job的執(zhí)行依賴build job矫付。

我們這里使用了 appleboy/ssh-action action凯沪,主要用來幫助用ssh連接遠程服務(wù)器,執(zhí)行命令买优。

至此大致最簡單的workflow就編輯完成了妨马,提交該commit push之后挺举,點擊Action,就能看到當前workflow的執(zhí)行情況了烘跺。

PS:本篇文章所有的命令都是為了演示demo湘纵,并不能直接將其用于生產(chǎn)環(huán)境。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末液荸,一起剝皮案震驚了整個濱河市瞻佛,隨后出現(xiàn)的幾起案子脱篙,更是在濱河造成了極大的恐慌娇钱,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绊困,死亡現(xiàn)場離奇詭異文搂,居然都是意外死亡,警方通過查閱死者的電腦和手機秤朗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門煤蹭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人取视,你說我怎么就攤上這事硝皂。” “怎么了作谭?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵稽物,是天一觀的道長。 經(jīng)常有香客問我折欠,道長贝或,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任锐秦,我火速辦了婚禮咪奖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘酱床。我一直安慰自己羊赵,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布扇谣。 她就那樣靜靜地躺著昧捷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揍堕。 梳的紋絲不亂的頭發(fā)上料身,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音衩茸,去河邊找鬼芹血。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的幔烛。 我是一名探鬼主播啃擦,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饿悬!你這毒婦竟也來了令蛉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤狡恬,失蹤者是張志新(化名)和其女友劉穎珠叔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弟劲,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡祷安,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了兔乞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汇鞭。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖庸追,靈堂內(nèi)的尸體忽然破棺而出霍骄,到底是詐尸還是另有隱情,我是刑警寧澤淡溯,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布读整,位于F島的核電站,受9級特大地震影響血筑,放射性物質(zhì)發(fā)生泄漏绘沉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一豺总、第九天 我趴在偏房一處隱蔽的房頂上張望车伞。 院中可真熱鬧,春花似錦喻喳、人聲如沸另玖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谦去。三九已至,卻和暖如春蹦哼,著一層夾襖步出監(jiān)牢的瞬間鳄哭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工纲熏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妆丘,地道東北人锄俄。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像勺拣,于是被迫代替她去往敵國和親奶赠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容