--- title: CI/CD 概念教學 tags: III, DevOps, CI/CD slideOptions: transition: 'fade' spotlight: enabled: true --- # Gitlab CI/CD 概念 ![](https://i.imgur.com/DSgyFiN.png) ---- ## pipeline & stage & job - push 最後的 commit 對應 1 pipeline - 1 pipeline 可以有 n stage - 1 stage 可以有 n job - job 在獨立的 container 跑 - 同 pipeline 下,stage 有先後順序 - 同 stage 下的 job,可以平行執行 ![](https://i.imgur.com/8CM1OVM.png) --- # 在我們的DevOps環境 ---- ## GitLab Runner幫我們做好的事 ![](https://i.imgur.com/RkOBnNu.png) ---- ## 如果只有改vMME,你只要 * ```git push ```之後,就會自動產生 pipeline,除非 ![](https://i.imgur.com/PLGtt7P.png) 就要看 FAQ ---- ## vMME 的 CI/CD * vMME .gitlab-ci.yml 目前有兩個 stage * Test stage - 有一個 make job 會做編譯 * Deploy stage - 有一個 push_image job 必須手動點三角形,就會把 vmme image 上傳至 http://docker5gc.nmsi.pri:8080/ ![](https://i.imgur.com/QY7iTKZ.png) ---- ## 上傳好的 image 長這樣 * 專案名稱:commit SHA前八碼 ![](https://i.imgur.com/HQFWVnd.png) --- # 如果要變動vMME的執行環境 ## 例如:新增 library、新增工具 ---- ## buildenv 的 CI/CD * http://gitvepc/5gc/buildenv * 這個專案是用來安裝 vMME 所需要的 library http://gitvepc/5gc/buildenv/-/blob/master/Dockerfile * git push 之後,自動上傳 docker image http://docker5gc.nmsi.pri:8080/repo/tags/buildenv * vMME 的 Dockerfile要對好 ```<buildenv>:<tag>``` http://gitvepc/nelson/vMME/-/blob/cicd/docker/Dockerfile_all ---- ## Part I 修改 buildenv 1. git clone buildenv 修改 Dockerfile,例如多一行 apt-get install abby-lib ![](https://i.imgur.com/XKSusoU.png) 2. git commit & push buildenv ---- ## Part II 確認 buildenv版本 記住 buildenv:c3f9b97e ![](https://i.imgur.com/R8XHZQZ.png) ---- ## Part III 修改 vMME 的 Dockerfile 1. git clone vMME 2. 修改 FROM ![](https://i.imgur.com/uhfVhAR.png) 3. git commit & push --- # Private Docker Registry ---- ## Prerequisite * 機器要先裝好 docker engine * docker設定 ``` { "live-restore": true, "group": "docker", "insecure-registries": ["docker5gc:5000"] } ``` * ```docker info``` ![](https://i.imgur.com/AWwWEPp.png) --- # FAQ ---- ## failed ![](https://i.imgur.com/PLGtt7P.png) * pipeline 如果 failed 就要進去看job * 跟 docker 有關,就找 Abby * library 裝不起來、少了library,去改 buildenv * vMME 裡面的問題,自己 debug ![](https://i.imgur.com/TAUrIk5.png) ---- ## pending ![](https://i.imgur.com/RiJP9tq.png) * pipeline 如果 pending 就要進去看job * job 如果 pending 太久,表示 gitlab-runner 不夠多,就找 Abby --- # 單元測試相關的 Stage ---- ## 解釋所有 Stage 的功能 * Prepare Stage - 編譯、建置暫時的 Docker image * Test Stage * check_executable - 確認執行檔是否存在 * unit_test - 以暫時的 image 起動 container,跑 unit test,複製 container 裡的單元測試報告與覆蓋率報告到 GitLab GUI,以供下載 * Post-test Stage * clean_test_env - 刪除測試用途暫時的 image 及 container * update_coverage_report_server (**only master**) - 上傳覆蓋率報告到 http://codecov5gc:8080/ * Package Stage & Deploy Stage - 手動觸發,跟單元測試無關 ![](https://i.imgur.com/Ws8nMG7.png) --- # Prepare stage ---- ## 如果要寫 unit test * 參考 unit-test/authTest * 會用到的所有 Makefile 要有 **必要變數**及**必要 g++ gcov flags** ![](https://i.imgur.com/3dIPSUF.png) ---- ## Makefile * 自己的 Makefile,要自己加變數 * 共用的 Makefile,已經加好 g++ gcov flags 了 * 如果要另外創造共用的 Makefile,就要自己加 g++ gcov flags ---- ## 哪些地方的 Makefile 要注意 * unit-test/Makefile ![](https://i.imgur.com/bwzqv8f.png) * unit-test/authTest/Makefile ![](https://i.imgur.com/CrPDJyc.png) * 因為有用到 ulibs/auth/Makefile,要找它的g++在哪個檔案? * 因為有用到 ulibs/ilog/Makefile,要找它的g++在哪個檔案? ...這樣會沒完沒了 ---- ## make-rules/* 已經全加 gcov flags 了 在 GitLab Prepare Stage 才會加上 ``GITLAB_GCOV_FLAGS`` 和 ``GITLAB_GCOV_LDFLAGS``,在其他環境編譯時不會有作用。 * make-rules/MakeRules.global.hostType ![](https://i.imgur.com/87s1RoX.png) 舉例 * make-rules/MakeRules.shared-lib ![](https://i.imgur.com/jDCDSrV.png) * make-rules/MakeRules.user-bin ![](https://i.imgur.com/Ho5kFg3.png) 所有 make-rules/*,全加好了。 如果要新建 **共用的 Makefile** 就要自己加。 --- # Test Stage unit_test job **failed** 時 ![](https://i.imgur.com/wgnr916.png) 1. 可以去下載報告(報告會保留七天) ![](https://i.imgur.com/Swb7jGC.png) 找``<failure>``或``<error>``的訊息。 ![](https://i.imgur.com/uvfRsXG.png) 2. Merge Request 時,也會被發現 ![](https://i.imgur.com/wwXVBsU.png) 點開來 ![](https://i.imgur.com/Qa5N4rJ.png) ---- ## Unit Test Report 有``<failure>``或``<error>``,代表那筆testcase有問題。 ![](https://i.imgur.com/dn4LcEM.png) ![](https://i.imgur.com/uvfRsXG.png) ---- ## Code Coverage Report 看到自己 branch 的 code coverage report ![](https://i.imgur.com/KpmcvQK.png) Code Coverage Rate 計算方式 ![](https://i.imgur.com/MnzYQkr.png) * Lines - 紅色行代表未執行;綠色行代表至少執行過一次;白色行代表註解不採計 * Branches - 打勾代表有執行過的case;打叉代表沒執行過的case ![](https://i.imgur.com/pLTX0TR.png) --- # Post-test Stage * update_coverage_report_server 在 master branch 會再把 coverage.html 上傳到 codecov5gc:8080 ![](https://i.imgur.com/LOXt9pH.png) * clean_test_env - 刪除測試用途暫時的 image 及 container