1. <rp id="irfrr"></rp>
      <button id="irfrr"><acronym id="irfrr"><input id="irfrr"></input></acronym></button>

      1. <em id="irfrr"><acronym id="irfrr"><u id="irfrr"></u></acronym></em><dd id="irfrr"><track id="irfrr"></track></dd>
        1. 眾所周知,CI/CD 可以讓我們更快、更高質量、更簡單的交付軟件。

          而現實中,你是否經常面臨以下難點,導致 CI/CD 并沒有真正發揮其優勢:

          從網絡安裝項目依賴耗時長? 前后端項目未分離, 導致編譯、部署及測試效率低? 隨著項目增多,多任務 Pipeline 運行慢? 不必要 Job 運行占用了資源和時間?

          針對以上問題,我總結了六大招式,希望幫助大家在使用極狐GitLab 時候提升 CI/CD 效率,供參考。

          使用 cache

          在運行項目編譯時,可能會安裝項目依賴,如果每次都從網絡安裝,會浪費很多時間。這時候可以使用 cache 功能提供緩存,減少依賴安裝時間。

          runner 開啟 cache 功能 Advanced configuration。

          python cache

          示例:

          image: python:3.9.7
          
          stages:
            - test
          
          variables:
            PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
            
          cache:
            paths:
              - .cache/pip/
            # 已項目 id 區分 cache,如果不區分,就是全局 cache
            key: $CI_PROJECT_ID
          
          job1:
            stage: test
            script:
              - pip install ansible==2.9.2
          

          或者:

          image: python:3.9.7
          
          stages:
            - test
          
          cache:
            paths:
              - pip-cache
            # 已項目 id 區分 cache,如果不區分,就是全局 cache
            key: $CI_PROJECT_ID
          
          before_script:
            - export PIP_CACHE_DIR="pip-cache"
            - mkdir -p pip-cache
          
          job1:
            stage: test
            script:
              - pip install ansible==2.9.2
          

          nodejs cache

          示例:

          variables:
            NPM_CONFIG_CACHE: npm_cache
            NPM_CONFIG_REGISTRY: https://registry.npm.taobao.org
          
          default:
            cache:
              paths:
                - ${NPM_CONFIG_CACHE}
          
          build:
            stage: build
            image: node:14-alpine
            script:
              - node -v
              - npm -v
              - npm ci
              - npm run build
            artifacts:
              name: "build-package"
              paths:
                - dist
              expire_in: 1 day
          

          jave maven cache

          build:
            image: maven:3.8.5-jdk-11
            stage: build
            variables:
              MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
              MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
            cache:
              paths:
                - .m2/repository/
                - target/
              key: $CI_PROJECT_ID
            script:
              - mvn package
              - ls -l target/*
          

          使用 needs 改變多階段執行順序

          默認情況下,同一階段作業并行運行,不同階段按順序執行,存在排隊等待時間,致使編譯、測試時間被拉長。

          我們可以使用 needs 參數改變多階段執行順序:Pipeline 定義階段 Stages,如果全局未定 Stages,則按順序運行 Build,Test,Deplo。Job 如果未設置 Stage,默認是 Test 階段。

          示例:

          stages:
            - build
            - test
            - deploy
          
          build fontend:
            stage: build
            script:
              - echo 'build fontend job'
          
          build backend:
            stage: build
            script:
              - echo 'build backend job'
          
          test fontend:
            stage: test
            script:
              - echo 'test fontend job'
            needs: ["build fontend"]
          
          test backend:
            stage: test
            script:
              - echo 'test backend job'
            needs: ["build backend"]
              
          deploy fontend:
            stage: deploy
            script:
              - echo 'deploy fontend job'
            needs: ["test fontend"]
          
          deploy backend:
            stage: deploy
            script:
              - echo 'deploy backend job'
            needs: ["test backend"]
          

          使用 needs 參數后:對于前端任務,build fontend 完成后會立即執行下一個階段的 test fontend,不管 build backend 是否完成。后端的 build backend 任務一樣類似。

          Web 界面中還可以查看 needs 依賴關系:

          cicd-pipeline
          cicd-pipeline-needs

          使用 rules 減少不必要 Job 運行

          很多人會把前后端一起打包和部署,但其實只有前端代碼有變化,針對后端的 Job 測試是多余的。因此,可以使用 rules 規則跳過某些不必要 Job。

          示例:

          stages:
            - build
            - test
          
          build job:
            stage: build
            script:
              - echo 'build job'
          
          test job:
            stage: test
            script: 
              - echo 'test job'
            rules:
              - changes:
                  - backend/*
          

          安裝依賴使用國內源

          由于國內網絡的原因,如果使用默認源的話,安裝依賴可能會很慢甚至失敗,這時候可以設置國內或者代理解決。

          nodejs

          npm install --registry=https://registry.npm.taobao.org
          

          或者

          yarn config set registry 'https://registry.npm.taobao.org'
          

          python

          pip install --trusted-host mirrors.aliyun.com -i https://mirrors.aliyun.com/pypi/simple -r requirements.txt
          

          ruby

          gem sources --remove https://rubygems.org/
          gem sources -a https://gems.ruby-china.com
          gem sources –l
          

          golang

          go env -w GOPROXY=https://goproxy.cn,direct
          

          設置 GOPRIVATE 來跳過私有庫,比如常用的 GitLab,中間使用逗號分隔:

          go env -w GOPRIVATE=*.gitlab.com
          

          Docker 鏡像優化

          Docker 過大,會造成鏡像拉取時間過長,影響 CD 速度。

          Docker 鏡像體積優化

          盡量優化減小 Docker 鏡像大小。

          Alpine Linux 是一個基于 BusyBox 和 Musl Libc 的 Linux 發行版,其最大的優勢就是小。一個純的基礎 Alpine Docker 鏡像在壓縮后僅有 2.67MB。并且不少 Docker 官方鏡像都有 Alpine 版本,比如:python:3.9.12-alpine3.15、ruby:2.7.5-alpine3.15 等。

          如果不是必須,不要安裝 vi,wget,curl,ping 等工具。

          Dockerfile 中盡量合并多條指令:

          ...
          RUN echo 1 \
            && echo 2
          ...
          

          在 Docker 17.05 版本以后,新引入了 multi-stage builds 這一概念,這將會極大地減小鏡像大小。

          簡單來說,multi-stage builds 支持我們將 Docker 鏡像的編譯分成多個 “階段”。比如常見的軟件編譯的情況,我們可以將編譯階段單獨提出來,軟件編譯完成后直接將二進制文件拷貝到一個新的基礎鏡像中,這樣做最大的好處就是,第二個鏡像不再包含任何編譯階段使用的中間依賴,干干凈凈明明白白。

          使用自建 Docker Hub 鏡像倉庫

          默認情況下,Docker 使用 Docker Hub 的鏡像,網絡傳輸較慢??梢源罱ū镜?Hub 倉庫(諸如 harbor)加速鏡像的 pull 與 push。

          Pipeline 中使用本地倉庫:

          stages:
            - build
          
          variables:
            PROJECTNAME: "test"
            DOCKERHUB: "hub.leffss.com"
            DOCKERHUBPROJECT: "library"
          
          before_script:
            - docker login ${DOCKERHUB} -u "${DOCKERHUBUSER}" -p "${DOCKERHUBPASS}"
          
          after_script:
            - docker logout ${DOCKERHUB}
          
          job1:
            stage: build
            script:
              - docker build --cache-from ${DOCKERHUB}/${DOCKERHUBPROJECT}/${PROJECTNAME}:latest -t ${DOCKERHUB}/${DOCKERHUBPROJECT}/${PROJECTNAME}:${CI_COMMIT_TAG} -t ${DOCKERHUB}/${DOCKERHUBPROJECT}/${PROJECTNAME}:latest .
              - docker images
              - docker push ${DOCKERHUB}/${DOCKERHUBPROJECT}/${PROJECTNAME}:${CI_COMMIT_TAG}
              - docker push ${DOCKERHUB}/${DOCKERHUBPROJECT}/${PROJECTNAME}:latest
          

          在有了本地 Hub 倉庫的情況下,還可以根據本章節【Docker 鏡像體積優化】的原則自行打包一些項目編譯需要用到的基礎鏡像,把項目需要用到的基礎依賴包或者工具提前打包進去,這樣又可以減少 Pipeline 安裝依賴的時間。

          優化 runner

          當項目較多時,CI/CD 任務也會增多,這時候運行 Pipeline 效率會降低。極狐GitLab 提供共享 runner 給所有項目 CI/CD 任務使用,這里分享兩種優化方式:

          使用 Tag 標記 runner

          在 runner 編輯頁面設置 Tags,并且不勾選 Run untagged jobs,這時候此 runner 只運行使用 Tag 選擇器的 Job,這樣優化 runner 占用率。

          示例:

          stages:
            - test
          
          job1:
            stage: test
            script: 
              - echo 'job1'
            tag:
              - "docker"
          

          為項目注冊專用 runner

          點擊具體項目,然后在 settings -> CI/CD - Expand 中查看項目 runner 注冊用的地址和 token,然后再按照官方文檔注冊 runner:Registering runners GitLab ? 即可。

          注冊完成后,這個 runner 只會運行當前項目的 Job。

          安裝方式參考:使用 K3s 來安裝和運行極狐GitLab runner_嗶哩嗶哩_bilibili 或者 極狐GitLab Runner Helm Chart。

          監控 runner 資源占用

          通過集成的 gitlab runner prometheus metrics 監控 runner 狀態,確保 runner 的正常穩定運行。詳細配置使用可查看讓你的 Runner 可視化,使用 Prometheus + Grafana 實現極狐GitLab Runner 可視化。

          30天免費試用極狐GitLab旗艦版

          極狐GitLab不僅是源代碼管理或CI/CD工具,它是一個覆蓋完整軟件開發生命周期和DevOps的開放式一體化平臺。

          免費試用
          Git 為 Software Freedom Conservancy 的注冊商標,GitLab 為 GitLab B.V.的注冊商標,我們已獲授權使用“極狐GitLab”。
          Copyright ? 2022 極狐信息技術(湖北)有限公司   |  
          鄂ICP備2021008419號-1   |   鄂公網安備42018502006137號

          免費試用極狐GitLab 30天

          有疑問? 聯系我們

          Gitlab x icon svg
          激情文学亚洲综合激情
          1. <rp id="irfrr"></rp>
              <button id="irfrr"><acronym id="irfrr"><input id="irfrr"></input></acronym></button>

              1. <em id="irfrr"><acronym id="irfrr"><u id="irfrr"></u></acronym></em><dd id="irfrr"><track id="irfrr"></track></dd>