簡體   English   中英

如何在 GitLab CI/CD 中集成構建項目的各種服務?

[英]How to integrate various services for building a project in GitLab CI/CD?

我有一個項目需要 npm 和 gradle 來構建,以及 docker 來構建和推送圖像。

起初我認為我應該使用 gradle 和 npm setup 創建自己的 ubuntu 映像,但我發現這不是 docker 映像的用途。

因此,我希望將官方 Gradle 和節點映像作為服務運行,以便我的腳本可以調用這些命令,但由於某種原因,這並沒有發生。

我的 .gitlab-ci.yml:

  variables:
  IMAGE_NAME: my.registry.production/project
  IMAGE_TAG: $CI_COMMIT_BRANCH
  GIT_SUBMODULE_STRATEGY: recursive

stages:
  - build
  - deploy

build_project:
  stage: build
  image: ubuntu:jammy
  services:
    - name: node:12.20
      alias: npm
    - name: gradle:6.3.0-jre8
      alias: gradle
  before_script:
    - git submodule init && git submodule update --remote --recursive
  script:
    - cd project-server && npm install && gradle clean build -Pprod -Pwar -x test -x integrationTest

deploy_image:
  stage: deploy
  image: docker:20.10.17
  services:
    - name: docker:20.10.17-dind
      alias: docker
  variables:
    DOCKER_HOST: tcp://docker:2375
    DOCKER_TLS_CERTDIR: ""
    DOCKER_DRIVER: overlay2
  script:
    - docker login -u $REGISTRY_USER -p $REGISTRY_PASSWORD my.registry.production
    - docker build -t $IMAGE_NAME:$IMAGE_TAG .
    - docker push $IMAGE_NAME:$IMAGE_TAG

如果有人有任何關於如何解決這個問題的信息,我將不勝感激,因為我是 DevOps 新手。

編輯 1:我的 Dockerfile 用於安裝了 Gradle 和 Node 的自定義圖像。

FROM ubuntu:jammy

LABEL key=DevOps

SHELL ["/bin/bash", "--login", "-i", "-c"]

RUN apt update && apt upgrade -y && apt install curl -y 

RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash

RUN source /root/.bashrc && nvm install 12.14.1

RUN nvm install 12.20.0

RUN apt install zip unzip

RUN curl -s "https://get.sdkman.io" | bash

RUN source "$HOME/.sdkman/bin/sdkman-init.sh"

RUN sdk install java 8.0.302-open

RUN sdk install gradle 3.4.1

SHELL ["/bin/bash", "--login", "-c"]

CMD [ "bin/bash" ]

運行它后,它說在 $PATH 中找不到 npm,我也嘗試了 Java、Gradle,但在路徑中也找不到它們。

我不知道為什么,因為我安裝了它們,你可以從 Dockerfile 中看出。

據我所知,一個 docker 鏡像等於一個構建。 因此,如果您有多個服務,您需要將每個服務構建到 docker 鏡像中,那么您可以將所有鏡像封裝到docker-compose.yml文件中。

我認為您可以執行以下操作:

  1. 將 npm 項目構建成 docker 鏡像
  2. 將 Gradle 項目構建為 docker 映像
  3. 編寫docker-compose.yml文件並放置兩個圖像。

完成后,管道將調用docker-compose.yml文件。

我希望這會有所幫助。

基於 CI/CD 管道中部署的基本概念,考慮一些建議:

  1. 刪除 services 關鍵字。 參考 GitLab 的官方文檔,了解gitlab-ci.yaml文件中的services關鍵字的用途。 該功能用於為您的作業運行時(如數據庫)提供網絡可訪問服務https ://docs.gitlab.com/ee/ci/services/index.html
  2. 你的項目使用npm作為依賴管理系統,Gradle 是一個構建工具。 這兩個軟件都非常適合在 GitLab 的 Pipeline 作業中容器運行時的主機操作系統上運行。 由於在 Runner 中下載代碼的同一主機上的作業,您需要這些工具來組裝一些構建工件。
  3. 考慮一下build_project作業中基礎映像的總體大小,並考慮通過網絡將映像下載到 Runner 的時間將如何影響您的作業和整個管道持續時間。 如果可以通過將構建依賴項烘焙到自定義Dockerfile中來提高性能,請執行此操作。 如果您的圖像太大,請使用script關鍵字塊內的 shell 命令在作業運行時下載它們。 兩者都有優點和缺點。
  4. 將 shell 腳本拆分為每行一個命令,以便更輕松地對腳本中的故障進行故障排除。 您將能夠在作業日志中看到返回非零退出代碼的命令的行號:
 ... script: - cd project-server - npm install - gradle clean build -Pprod -Pwar -x test -x integrationTest ...
  1. 建議大多數時候使用 Gradle 包裝器 ( gradlew ) 而不是直接使用gradle可執行文件。 在您的項目中配置它並將包裝器的配置文件檢查到您的版本控制系統中,這將簡化您的構建依賴關系: https ://docs.gradle.org/current/userguide/gradle_wrapper.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM