<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          GitHub Actions,臥槽!牛批!

          共 8484字,需瀏覽 17分鐘

           ·

          2019-12-01 23:20

          閱讀本文大概需要 19?分鐘。


          前段時(shí)間我更新了我的分布式爬蟲管理框架—— Gerapy(話都說(shuō)到這兒了打個(gè)廣告,跟繁瑣的命令行說(shuō)拜拜!Gerapy分布式爬蟲管理框架來(lái)襲!,哇,哇,就是,哇?。?br />

          現(xiàn)在 DevOps 的理念可謂是相當(dāng)火,其中 CI/CD(持續(xù)集成、持續(xù)部署)是必不可少的環(huán)節(jié)。有了它們,我們開發(fā)完軟件之后,一些測(cè)試、構(gòu)建、部署的環(huán)節(jié)就可以自動(dòng)化完成了。

          我開發(fā)的的這款分布式爬蟲管理框架—— Gerapy,代碼也是放在了 GitHub 上面,但在之前 GitHub 上面是缺少原生的 CI/CD 功能支持的,可能需要根據(jù)第三工具或者 Webhook 等來(lái)配合實(shí)現(xiàn)項(xiàng)目的自動(dòng)測(cè)試、構(gòu)建和部署。

          比如我可能有這么一些需求:

          ?每次合并代碼到 master 分支時(shí),想測(cè)試這個(gè)項(xiàng)目能否在各個(gè)版本的 Python 環(huán)境下正常安裝和運(yùn)行。?我為 Gerapy 新建了一個(gè)獨(dú)立的 Repo,叫做 Gerapy/Gerapy,在 docs 文件夾下存放文檔說(shuō)明,但我還另外新建了一個(gè) Repo 專門用來(lái)存放文檔,叫做 Gerapy/Docs,希望能把 Gerapy/Gerapy 的 docs 子文件夾下的內(nèi)容整個(gè)自動(dòng)同步到 Gerapy/Docs 這個(gè) Repo 的根目錄。?每次 Gerapy 發(fā)布新版本的時(shí)候,自動(dòng)構(gòu)建 Docker 鏡像,并上傳到 Docker Hub,打上 latest 標(biāo)簽和版本號(hào)標(biāo)簽。?每次 master 分支提交代碼的時(shí)候,自動(dòng)構(gòu)建 Docker 鏡像,并上傳到 Docker Hub,打上 master 標(biāo)簽,代表當(dāng)前 master 分支版本。

          上面的功能之前有一部分工作是手工操作的,有一部分是借助于第三方工具來(lái)自動(dòng)操作的,感覺并不是一個(gè)很好的解決方案

          在最近一段時(shí)間,GitHub 上面上線了 Actions 功能,它就是為 CI/CD 而生的,和 GitHub 項(xiàng)目原生緊密結(jié)合。然而幾個(gè)月以來(lái)一直處于內(nèi)測(cè)階段。就在 11 月 13 日,GitHub Actions 功能正式上線了。

          上線之后,我就開始正式使用這個(gè)功能了,是真的香!

          上面的四個(gè)需求,我用 GitHub Actions 已經(jīng)完全實(shí)現(xiàn)了自動(dòng)化,非常簡(jiǎn)單方便。

          接下來(lái)簡(jiǎn)單介紹下我的一些實(shí)現(xiàn)方式。

          d6e8d09b79eaee86f6b56694036110e2.webp

          GitHub Actions

          首先簡(jiǎn)單介紹下 GitHub Actions,其官方介紹頁(yè)面為:https://github.com/features/actions,介紹語(yǔ)如下:

          Automate your workflow from idea to production. GitHub Actions makes it easy to automate all your software workflows, now with world-class CI/CD. Build, test, and deploy your code right from GitHub. Make code reviews, branch management, and issue triaging work the way you want.

          簡(jiǎn)而言之就是提供了一個(gè)高效易用的 CI/CD 工作流,幫助我們自動(dòng)構(gòu)建、測(cè)試、部署我們的代碼。

          9829a95a18f60a67aea5cf65ddacb375.webp另外它支持三大平臺(tái)—— Linux、MacOS、Windows,支持任何編程語(yǔ)言,而且官方提供了許許多多的 Actions 庫(kù)供我們直接使用,幫助我們更快地搭建工作流。

          GitHub Actions 的官方文檔可以見:https://help.github.com/en/actions/automating-your-workflow-with-github-actions,如果大家想好好研究下的話,一定要好好看看。

          下面我就介紹我使用 GitHub Actions 實(shí)現(xiàn)上文所述的四個(gè)需求的方法。

          自動(dòng)測(cè)試

          由于我開發(fā)的 Gerapy 是一個(gè) Python Package,因此我看重的是測(cè)試它是否可以在各個(gè) Python 平臺(tái)下安裝和正常使用,于是我新建了一個(gè) GitHub Action,它會(huì)自動(dòng)在項(xiàng)目目錄下生成一個(gè) .github/workflows/*.yml 文件,內(nèi)容如下:

          name: buildon:  push:    branches:- master- devjobs:  test:    runs-on:- ubuntu-latest    strategy:      max-parallel:3      matrix:        python-version:[3.5,3.6,3.7]    steps:- uses: actions/checkout@v1- name:Set up Python ${{ matrix.python-version }}      uses: actions/setup-python@v1with:        python-version: ${{ matrix.python-version }}- name:InstallDependencies      run:|        python -m pip install --upgrade pip        pip install .- name:RunGerapy      run:|        gerapy -v        gerapy init        cd gerapy        gerapy migrate        gerapy initadmin

          其實(shí)在這里一個(gè) Action 就是一個(gè) YAML 文件,其后綴為 yml,它規(guī)定了一系列語(yǔ)法規(guī)則,我們根據(jù)它的語(yǔ)法規(guī)則寫出一些工作流,在符合一定條件時(shí),這些工作流會(huì)被觸發(fā),自動(dòng)執(zhí)行。

          比如這里最開頭,on 就是監(jiān)聽某個(gè)事件,其內(nèi)容為 push,意思就是當(dāng) push 代碼的時(shí)候,就會(huì)觸發(fā)。再進(jìn)一步地,這里定義了兩個(gè)分支 master 和 dev。這什么意思呢?就是當(dāng)我往 master 或者 dev 分支 push 代碼的時(shí)候,我們定義的工作流就會(huì)執(zhí)行。

          下面的 jobs 就是工作流的定義了,包括在什么平臺(tái)運(yùn)行,具體執(zhí)行什么步驟。

          比如這里 runs-on 我就定義了在 ubuntu-latest 版本上運(yùn)行,另外定義了一些并行策略和參數(shù),比如這里就定義了 Python 的三個(gè)版本參數(shù),在 3.5、3.6、3.7 版本上運(yùn)行。

          eea1e14c438be0655a361fb668f8961e.webp

          下面的 steps 就是具體執(zhí)行哪些步驟了。第一步和第二步,我們可以看到它都有一個(gè) uses 參數(shù),內(nèi)容都為 actions 開頭,這就說(shuō)明我們使用了 GitHub 提供的寫好的 Action,我們只需要引用它的名字就能使用了。這兩步運(yùn)行完畢之后,Python 環(huán)境會(huì)被初始化,同時(shí)會(huì)從 GitHub Clone Gerapy 項(xiàng)目代碼到本地。

          在第三步和第四步,就是我自定義的 Task 了,這里自持直接寫入 Shell 腳本。在這里我分了兩步。

          第三步 Install Dependencies 就是安裝 pip 和 Gerapy 安裝包,其中一句?pip install .?就是安裝當(dāng)前 Gerapy 目錄下的內(nèi)容到系統(tǒng)中,安裝完成之后,就可以使用 gerapy 命令了。

          于是第四步 Run Gerapy 就是測(cè)試了 gerapy 命令的一些初始化使用,包括初始化工作環(huán)境、數(shù)據(jù)庫(kù)遷移、初始化賬號(hào)等等,當(dāng)然還有更多,比如運(yùn)行某些測(cè)試,運(yùn)行服務(wù)等等,這里我只把一些必要的內(nèi)容寫進(jìn)去了。

          好,基本內(nèi)容就是這樣。

          保存這個(gè) Action,命名為 build.yml,它會(huì)保存為 .github/workflows/build.yml 文件。同時(shí)在保存的時(shí)候,我們就相當(dāng)于執(zhí)行了一次 Push 任務(wù),這時(shí)候我們就可以看到這個(gè) Action 已經(jīng)啟動(dòng)了,頁(yè)面如下:

          f021bc3b3727289203a37bfdf6347f81.webp

          我們所定義的每一個(gè)步驟以及對(duì)應(yīng)的執(zhí)行結(jié)果都會(huì)顯示在控制臺(tái)中,一目了然。

          可以看到這里初始化了三個(gè)版本的 Python 環(huán)境,同時(shí)都運(yùn)行了其中的測(cè)試流程。如果測(cè)試成功,會(huì)打綠色的勾,如果失敗,會(huì)提示紅色的叉,并有郵件提示。

          這樣以來(lái),一些自動(dòng)化的測(cè)試就完成了!?。?/p>

          70f453b4be9f8eb9993a764422f0372c.webp

          同步文檔到新的 Repo

          接下來(lái)我這個(gè)需求可以說(shuō)稍微有點(diǎn)奇葩了。

          寫項(xiàng)目免不了的要寫文檔,這里文檔我是用 Sphinx 來(lái)寫的,可以借助于 ReadTheDocs 自動(dòng)構(gòu)建并分發(fā)到 readthedocs.io 上面,類似這樣子:

          901faa2620d4651ae55cb917bf57d8bd.webp

          但文檔的源代碼我是放在了 Gerapy/Gerapy 這個(gè) Repo 的 docs 文件夾,向 Scrapy 看齊,是這樣子的:

          7b7d0f7da3de9d971c5a3bbb1fc65e02.webp

          但我想著還新建一個(gè) Repo,來(lái)單獨(dú)存放文檔,比如我新建一個(gè) Gerapy/Docs 這個(gè) Repo,我在 Gerapy/Gerapy docs 子文件夾下的內(nèi)容可以被自動(dòng)同步到 Gerapy/Docs 根目錄下面,這樣我只需要往 Gerapy/Gerapy 上面提交代碼,docs 子文件夾下面的內(nèi)容變了,Gerapy/Docs 下面的內(nèi)容也會(huì)跟著變。

          那這個(gè)能不能做到呢?能!我問(wèn)你答,快樂神仙;自問(wèn)自答,法力無(wú)邊~~

          這個(gè)流程可以分為四步:

          ?下載 Gerapy/Gerapy Repo 的源代碼。?利用 git 的 subtree 命令將 docs 文件夾下的內(nèi)容分離到新的分支。?將新分離的分支推送到 Docs 這個(gè) Repo 下面。?推送 Docs 這個(gè) Repo 到遠(yuǎn)程 Gerapy/Docs Repo。

          這里面就有一個(gè)關(guān)鍵地方,那就是怎樣無(wú)需密碼將內(nèi)容推送到遠(yuǎn)程 Gerapy/Docs 這個(gè) Repo 下面,當(dāng)然就是 SSH 了。(啊,超爽der)

          那 SSH 的話應(yīng)該怎么設(shè)置呢?我們首先要有一對(duì)公鑰和私鑰,這個(gè)我們用 ssh-keygen 命令自己生成就好了。

          那接下來(lái) Gerapy/Docs 里面需要存有公鑰,怎么辦呢?我們可以借助于 GitHub 提供的 Deploy Key 配置好公鑰即可:

          690113468d2668cc07f321c12cd9fd13.webp然后我們需要將私鑰上傳到 Action 所運(yùn)行的虛擬機(jī)里面,但我們又不能明文將其放在 yml 文件里面,那這個(gè)怎么做到呢?只需要將其配置到 Secrets 里面即可,Action 是有權(quán)限訪問(wèn)到的:5dfd381b22760aee9bdf6d9791ceca9a.webp

          嗯,做好這兩部分工作之后,接下來(lái)完善一下 yml 文件就好了,內(nèi)容如下:

          name: sync docson:  push:    branches:- masterjobs:  sync:    runs-on: ubuntu-latest    steps:- name:Set SSH Environment      env:        DOCS_DEPLOY_KEY: ${{ secrets.DOCS_DEPLOY_KEY }}      run:|        mkdir -p ~/.ssh/        echo "$DOCS_DEPLOY_KEY">~/.ssh/id_rsa        chmod 600~/.ssh/id_rsa        ssh-keyscan github.com >~/.ssh/known_hosts        chmod 700~/.ssh && chmod 600 ~/.ssh/*        git config --global user.email "[email protected]"        git config --global user.name "Germey"- name:SyncDocs of Gerapy      run:|        cd /tmp        git clone git@github.com:Gerapy/Docs.git docs        cd docs        git branch -D docs ||true        git push origin --delete docs ||true        git clone https://github.com/Gerapy/Gerapy.git gerapy        cd gerapy        git subtree split --prefix=docs --squash -b docs        git checkout docs        git push /tmp/docs docs:docs        cd /tmp/docs        git checkout docs        git checkout -b master || git checkout master ||true        git reset --hard docs        git push origin master --force

          可以看到,這里主要就分了兩步。

          第一部分就是設(shè)置虛擬機(jī)的 SSH 環(huán)境,這里 secrets.DOCS_DEPLOY_KEY 就是我們剛才在 Secrets 里面定義的私鑰,對(duì)應(yīng)的運(yùn)行命令就是將私鑰添加到 ~/.ssh/id_rsa 里面。

          第二部分就是分離 docs 文件夾到新的分支,然后將其上傳到新的 Repo 下了。

          49049ba83681d1309f9b57131ce9fb70.webp

          那么這里有兩條比較關(guān)鍵的命令:

          git subtree split --prefix=docs --squash -b docs

          這條命令就是將 docs 文件夾的內(nèi)容分離到一個(gè)新的分支的根目錄下,新的分支的名稱為 docs。

          git push /tmp/docs docs:docs

          這條命令就是將本地的分支推送到另外一個(gè)本地 Repo 下,注意這里 push 的目標(biāo)不一定是遠(yuǎn)端的 Repo 地址,也可以是本地的 Repo 地址。

          最后,將新的 Repo 內(nèi)容強(qiáng)制推送到遠(yuǎn)程即可。

          這樣我們就可以實(shí)現(xiàn),Gerapy/Gerapy Repo docs 文件夾下內(nèi)容的變動(dòng),會(huì)自動(dòng)更新到 Gerapy/Docs Repo 了。

          例如 docs 下是這樣的:

          643b89463f3e78ed39d964582a0bb722.webp

          Gerapy/Docs Repo 下和子文件的內(nèi)容會(huì)一直維持同步,并在 master 分支上面:

          241a49878e2124b487fe63e4ed918cef.webp

          自動(dòng)構(gòu)建 Docker 鏡像

          由于 Gerapy 是一個(gè) Web 工程,所以它非常適合于打包一個(gè) Docker 鏡像。對(duì)于 Docker 的鏡像,我期望有三個(gè)版本:

          ?當(dāng)前 master 分支的版本,比較穩(wěn)定,但未發(fā)布版本。?最新版本,latest,代表最新的發(fā)布版本。?每個(gè)歷史版本,每次發(fā)布版本的版本號(hào),都標(biāo)記一個(gè) tag。

          最后我們自動(dòng)構(gòu)建的鏡像都自動(dòng) Push 到 Docker Hub 上面,這樣大家都可以使用了。

          那這個(gè)怎么做到呢,同樣借助于 GitHub Action 也可以輕松做到。

          首先 master 版本,由于沒有發(fā)版,所以前端需要自行 build,然后 Python Package 需要安裝本地代碼。廢話不多說(shuō)了,上代碼:

          name: build docker image masteron:  push:    branches:- master    paths:-.github/workflows/**- gerapy/**jobs:  build:    runs-on: ubuntu-latest    steps:- name:CheckoutSource      uses: actions/checkout@v1- name:DockerLogin      run: docker login -u germey -p ${{ secrets.DOCKERHUB_LOGIN_PASSWORD }}- name:SetupNode.js      uses: actions/setup-node@v1.1.0with:        version:10.x- name:BuildFrontendSource      run:|        cd gerapy/client        npm install        npm run build- name:Build the DockerImage      run:|        docker build -t germey/gerapy:master -f ./docker/Dockerfile.- name:Push the DockerImage      run: docker push germey/gerapy:master

          可以看到這里,監(jiān)聽了 master 分支的變動(dòng),同時(shí)限定了路徑 workflows 文件夾和 gerapy 文件夾下變動(dòng)。

          流程包括了前端的構(gòu)建和 Docker 的打包,Docker 打包的時(shí)候使用了 -f 命令指定了 Dockerfile 的路徑,并將打包完成之后的鏡像標(biāo)記為 gerapy:master,推送到 Docker Hub 即可。

          對(duì)于發(fā)布新版本的時(shí)候,則直接監(jiān)聽 tag 的變動(dòng)即可:

          name: build docker image releaseon:  push:    tags:-'v*.*.*'jobs:  build:    runs-on: ubuntu-latest    steps:- name:CheckoutSource      uses: actions/checkout@v1- name:DockerLogin      run: docker login -u germey -p ${{ secrets.DOCKERHUB_LOGIN_PASSWORD }}- name:SetupNode.js      uses: actions/setup-node@v1.1.0with:        version:10.x- name:BuildFrontendSource      run:|        cd gerapy/client        npm install        npm run build- name:BuildandPush the DockerImage      run:|        tag=${GITHUB_REF:11}        echo "Build Tag '$tag'"        docker build -t germey/gerapy:$tag -f ./docker/Dockerfile.        docker push germey/gerapy:$tag        regex='^([0-9]+\.){0,2}(\*|[0-9]+)$'if[[ $tag =~ $regex ]];then          echo "Build Stable Version '$tag'"          docker tag germey/gerapy:$tag germey/gerapy:latest          docker push germey/gerapy:latestfi

          可以看到這里監(jiān)聽的配置改成了 tags,tag 也變成了一個(gè)變量,可以通過(guò) ${GITHUB_REF:11} 獲取到。

          同時(shí)這里還加了一個(gè)正則判斷是不是正式的發(fā)版,如果是 beta、rc 版本,則不構(gòu)建正式 latest 的 Docker 鏡像。

          最后我們看看我再一次發(fā)版之后,構(gòu)建完成之后,Docker Hub 的效果:

          38b79a289e00510bd3c9be4422853128.webp

          可以看到,我發(fā)布了 0.9.2 版本之后,它就自動(dòng)構(gòu)建了 0.9.2 版本的鏡像,同時(shí)將 latest 鏡像指向 0.9.2 版本。另外對(duì)應(yīng) maser 版本也構(gòu)建了一個(gè)版本。

          這樣,以后媽媽再也不用擔(dān)心我忘記打 Docker 鏡像啦。

          以上便是我將 GitHub Actions 應(yīng)用到我的開源項(xiàng)目上的記錄。

          e4270c9163bbc639a385d19e560a02d1.webp

          最后,如果大家對(duì) Scrapy 爬蟲感興趣的話,也(非常)歡迎大家(高高興興的)了解一下我寫的 Gerapy 框架,利用它我們可以(無(wú)敵)更方便地管理(呀)、監(jiān)控(呀)、(或者是)部署 Scrapy 爬蟲項(xiàng)目(什么的)。

          其 GitHub 地址為:https://github.com/Gerapy/Gerapy,文檔:https://docs.gerapy.com/。

          掰掰!

          395e267c0354fba33b3deece808e3530.webp

          推薦閱讀

          1

          Python 中更優(yōu)雅的日志記錄方案

          2

          別再造假數(shù)據(jù)了,來(lái)試試 Faker 這個(gè)庫(kù)吧!

          3

          200 行代碼實(shí)現(xiàn)一個(gè)滑動(dòng)驗(yàn)證碼

          4??

          如何用一條命令將網(wǎng)頁(yè)轉(zhuǎn)成電腦 App


          好文和朋友一起看~
          瀏覽 27
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文一区在线观看 | 亚洲男女内射 | 另类视频网站 | 欧美爆操 | 色就是色欧美 |