Hướng dẫn gitlab ci cd nodejs docker - docker gitlab ci cd nodejs

Xuất bản ngày 8 tháng 4 năm 2021

Một người bạn đề nghị tôi bắt đầu với Dockerize, các ứng dụng của tôi để quản lý dễ dàng. Anh ấy đã thuyết phục tôi rằng việc container hóa là con đường của tương lai, và sau một chút nghiên cứu, tôi nhận ra anh ấy đã đúng!

Cuối cùng tôi đã giải quyết được một quy trình để chứa các ứng dụng NodeJS và định cấu hình triển khai tự động thông qua Gitlab CI. Tôi nghĩ sẽ hữu ích để chia sẻ những gì tôi đã học được khi nó có thể giúp đỡ người khác.

Tổng quan

Bài đăng này đi qua mã trong một dự án mẫu mà tôi đã tạo bao gồm một số bước cơ bản:

  1. Tạo API REST NODEJS đơn giản và chứa nó thành hình ảnh docker.
  2. Chuẩn bị một máy chủ dàn (Ubuntu) để hỗ trợ triển khai hình ảnh Docker qua SSH.
  3. Định cấu hình một dự án Gitlab với đường ống CI tự động xây dựng và triển khai hình ảnh Docker mới mỗi khi cam kết mã được đẩy.

Sau khi được triển khai đến máy chủ sắp xếp, API RESTS NODEJS có thể truy cập thông qua proxy ngược của Apache Web.

Đường ống CI được bắt đầu bởi các cam kết mã được hiển thị trong đỉnh bên trái; Sau khi được triển khai, người dùng có thể truy cập ứng dụng Docker qua Apache (được hiển thị ở phía dưới bên phải)

Mã mẫu được đăng lên GitHub

Dự án tương tự được đề cập trong bài đăng này đã được đăng lên GitHub và có sẵn ở đây. Mã nên sẵn sàng để đi và có thể được sử dụng bằng cách làm theo các hướng dẫn trong README.md.

Giả định

Hướng dẫn này giả định quyền truy cập vào một phiên bản Gitlab đang hoạt động, với CI và người chạy được cấu hình, và cũng là một sổ đăng ký container docker để đẩy và kéo hình ảnh docker (đây có thể là một sổ đăng ký được lưu trữ riêng của Gitlab, Docker Hub hoặc bất kỳ sổ đăng ký nào khác). 2 bước đầu tiên trong hướng dẫn DigitalOcean này có thể giúp định cấu hình các thành phần Gitlab nếu cần. Tôi khuyên bạn nên kiểm tra hướng dẫn DigitalOcean nói chung, vì nó rất giống với những gì được đề cập trong bài đăng này.

1. dockerizing Ứng dụng NodeJS

Dự án mẫu chứa API NodeJS REST cơ bản được tạo với Trình tạo ứng dụng Express. Để chạy API cục bộ, hãy khởi chạy nó với npm start và thực hiện yêu cầu nhận đến http://localhost:3000/info. API sẽ tạo phản hồi JSON tương tự như:

{
    "name": "node-docker-gitlab-ci",
    "server": "express",
    "variableData": "NodeJS Code"
}

Bây giờ, API RESTS của NodeJS đang hoạt động, bước tiếp theo là tạo Dockerfile và xác định cách Docker sẽ đóng gói API thành một hình ảnh. Tôi đã sử dụng Dockerfile trong hướng dẫn DigitalOcean này làm điểm khởi đầu và điều chỉnh nó một chút:

FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]

Mặc dù thẳng, mọi thứ có thể trở nên phức tạp hơn nếu ứng dụng yêu cầu các khóa hoặc biến để truyền vào hình ảnh. Một ví dụ về các cách khác nhau để làm điều này được thảo luận ở cuối bài này.

2. Chuẩn bị máy chủ dàn

Tiếp theo, chúng tôi sẽ chuẩn bị máy chủ dàn để chấp nhận triển khai qua SSH. Trong ví dụ này, chúng tôi đang triển khai theo ví dụ Debian/Ubuntu. Chúng ta sẽ cần:

  • Tạo người dùng Linux mới và thêm nó vào nhóm
    FROM node:14-alpine
    
    # create dir
    RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
    WORKDIR /home/node/app
    
    # build dependencies
    COPY ./package*.json ./
    USER node
    RUN npm install
    
    # copy in source code
    COPY --chown=node:node ./ ./
    
    # start express server
    CMD [ "npm", "start" ]
    1 (để nó có quyền truy cập vào lệnh
    FROM node:14-alpine
    
    # create dir
    RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
    WORKDIR /home/node/app
    
    # build dependencies
    COPY ./package*.json ./
    USER node
    RUN npm install
    
    # copy in source code
    COPY --chown=node:node ./ ./
    
    # start express server
    CMD [ "npm", "start" ]
    1).
  • Tạo khóa SSH cho người dùng.
  • Định cấu hình Apache thành các yêu cầu Web proxy trở lại container Docker, sau khi được triển khai.

Như được mô tả trong Hướng dẫn DigitalOcean này, chúng tôi sẽ tạo một người dùng mới và nó cho nhóm

FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
1:

sudo adduser deployer
sudo usermod -aG docker deployer

Tiếp theo chúng tôi sẽ tạo một khóa SSH cho người dùng. Khóa này sau đó sẽ được thêm vào Gitlab để đường ống Gitlab CI có thể đăng nhập vào máy chủ dàn vì người dùng này để triển khai.

# recommended to su into the user to simplify housekeeping
su deployer
ssh-keygen -b 4096
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

Lưu ý: Chúng tôi sẽ cần khóa riêng được tạo ở đây trong Phần 4 dưới đây. Trừ khi có quy định khác, giá trị này được ghi lại trong

FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
4. we will need the private key generated here in section 4 below. Unless otherwise specified, this value is captured in
FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
4.

Khi người dùng Linux được thiết lập, chúng tôi sẽ định cấu hình máy chủ Web Apache thành các yêu cầu proxy trở lại container Docker. Tùy thuộc vào thiết lập hiện tại, tùy chọn đơn giản nhất có thể là xác định proxy ngược bên trong một vhost hiện có:

# define reverse proxy
ProxyPass /info http://127.0.0.1:8882/info 
ProxyPassReverse /info http://127.0.0.1:8882/info

# optional headers - can be omitted
<LocationMatch /info>
  # enable CORS
  Header set Access-Control-Allow-Origin "*"
  Header set Access-Control-Allow-Methods "GET"
  # do not cache
  Header set Cache-Control "no-store, must-revalidate"
  Header set Pragma "no-cache"
  Header set Expires "0"
</LocationMatch>

Các yêu cầu thông báo cho tuyến đường

FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
5 được ủy quyền cho container Docker, sẽ nghe trên cổng
FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
6. Cổng này sẽ được đặt trong lệnh
FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
7, được thực thi trong
FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
8 (được đề cập trong Phần 4 bên dưới). Các chỉ thị CORS và bộ đệm là tùy chọn, và chỉ bao gồm trong trường hợp.

Lưu ý: Đảm bảo các mô -đun Apache cần thiết được bật để hỗ trợ proxy ngược - xem bài đăng này để biết chi tiết. ensure the required Apache modules are enabled to support reverse proxying – see this post for details.

3. Cấu hình Gitlab

Tiếp theo, chúng tôi sẽ định cấu hình Gitlab để hỗ trợ các bản dựng và triển khai CI mỗi lần cam kết. Dưới đây là một vài điều bên trong Gitlab phải được cấu hình trước:

  • Chúng tôi sẽ cần một dự án Gitlab để chứa mã - trong ví dụ này, chúng tôi sử dụng một dự án có tên
    FROM node:14-alpine
    
    # create dir
    RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
    WORKDIR /home/node/app
    
    # build dependencies
    COPY ./package*.json ./
    USER node
    RUN npm install
    
    # copy in source code
    COPY --chown=node:node ./ ./
    
    # start express server
    CMD [ "npm", "start" ]
    9.
  • Gitlab phải có ít nhất một người chạy được cấu hình - thêm thông tin có sẵn ở đây.
  • Dự án Gitlab phải cho phép người chạy trong phần Cài đặt> CI/CD> Runners.

Khi các bước này được hoàn thành, các đường ống dự án sẽ có thể xem được từ trong menu đường ống CI/CD> dự án.

Hướng dẫn gitlab ci cd nodejs docker - docker gitlab ci cd nodejs
Có sẵn từ trang PIPELINES NODE-DOCKER-GITLAB-CI

Định cấu hình các biến Gitlab CI/CD

Phần tiếp theo của cấu hình Gitlab liên quan đến việc thiết lập các biến CI/CD cho dự án

FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
9. Sau khi được đặt, các biến này có thể được đọc từ trong tệp
FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
8 và tạo một nơi tuyệt vời để lưu trữ các khóa hoặc thông tin nhạy cảm khác.

Bên trong phần Cài đặt dự án> CI/CD> Biến, chúng ta cần tạo 3 biến:

  1. sudo adduser deployer
    sudo usermod -aG docker deployer
    2 - Chứa địa chỉ IP của máy chủ dàn được định cấu hình trong Phần 2. Đây là địa chỉ IP được sử dụng để tạo kết nối SSH từ người chạy Gitlab.
  2. sudo adduser deployer
    sudo usermod -aG docker deployer
    3 - Chứa tên người dùng trên máy chủ dàn, nếu làm theo hướng dẫn này là
    sudo adduser deployer
    sudo usermod -aG docker deployer
    4.
  3. sudo adduser deployer
    sudo usermod -aG docker deployer
    5 - Chứa khóa riêng của SSH cho người dùng
    sudo adduser deployer
    sudo usermod -aG docker deployer
    4 trong Phần 2. Khóa này có thể được tìm thấy trong
    FROM node:14-alpine
    
    # create dir
    RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
    WORKDIR /home/node/app
    
    # build dependencies
    COPY ./package*.json ./
    USER node
    RUN npm install
    
    # copy in source code
    COPY --chown=node:node ./ ./
    
    # start express server
    CMD [ "npm", "start" ]
    4. Khi nhập giá trị này vào gitlab, hãy đảm bảo loại được đặt thành tệp tệp và một dòng mới được tạo sau
    sudo adduser deployer
    sudo usermod -aG docker deployer
    8 ở phía dưới.

Hướng dẫn gitlab ci cd nodejs docker - docker gitlab ci cd nodejs
Có sẵn trong các cài đặt dự án Node-Docker-Gitlab-CI> CI/CD> Trang biến

4. Kích hoạt bản dựng CI

Phần chính cuối cùng của cấu hình này liên quan đến việc thiết lập Gitlab CI/CD. Điều này được thực hiện bằng cách thêm một tệp

FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
8 vào gốc của dự án
FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
9. Trong dự án mẫu, một dự án đã được cung cấp giống như:

stages:
  - build
  - deploy-stage

variables:
  VARIABLE_DATA: Gitlab-CI-YAML

build:
  stage: build
  image: docker:18-git
  services:
    - docker:18-dind
  script:
    # get node app version from package.json for use in tagging docker image
    - apk update && apk add jq
    - export VERSION=`jq -r ".version" < ./package.json`
    # login to docker
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    # build and tag docker image
    - docker build -t $CI_REGISTRY_IMAGE:$VERSION -t $CI_REGISTRY_IMAGE:latest .
    # publish finished image
    - docker push $CI_REGISTRY_IMAGE:$VERSION
    - docker push $CI_REGISTRY_IMAGE:latest

deploy-stage:
  stage: deploy-stage
  image: alpine:latest
  script:
    - chmod og= $STAGE_ID_RSA
    - apk update && apk add openssh-client
    # stop existing docker container & remove images
    - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker stop $CI_PROJECT_NAME || true"
    - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker rm $CI_PROJECT_NAME || true"
    - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker image rm $CI_REGISTRY_IMAGE:latest || true"
    # pull new container
    - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY"
    - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker pull $CI_REGISTRY_IMAGE:latest"
    # run new container
    - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker run -d --restart unless-stopped --name $CI_PROJECT_NAME -p 8882:3000 -e "variableData=Docker-Run-Command" $CI_REGISTRY_IMAGE:latest"

Có nhiều tài nguyên tuyệt vời mô tả cú pháp CI YAML của Gitlab. Như chúng ta có thể thấy, quy trình xây dựng CI này có 2 giai đoạn,

# recommended to su into the user to simplify housekeeping
su deployer
ssh-keygen -b 4096
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
1 và
# recommended to su into the user to simplify housekeeping
su deployer
ssh-keygen -b 4096
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
2. Giai đoạn
# recommended to su into the user to simplify housekeeping
su deployer
ssh-keygen -b 4096
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
1 chạy lệnh
# recommended to su into the user to simplify housekeeping
su deployer
ssh-keygen -b 4096
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
4, thực hiện các bước được xác định trong Dockerfile để xây dựng hình ảnh Docker và đẩy nó vào sổ đăng ký container docker được cấu hình (được lưu trữ bởi Gitlab trong ví dụ này).

Giai đoạn

# recommended to su into the user to simplify housekeeping
su deployer
ssh-keygen -b 4096
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
2 có liên quan nhiều hơn một chút và sử dụng tất cả các biến GITLAB CI/CD được xác định trong Phần 3 ở trên (lưu ý
sudo adduser deployer
sudo usermod -aG docker deployer
5,
sudo adduser deployer
sudo usermod -aG docker deployer
3 và
sudo adduser deployer
sudo usermod -aG docker deployer
2). Giai đoạn này sẽ tạo một phiên SSH vào máy chủ dàn, sử dụng khóa SSH của người dùng
sudo adduser deployer
sudo usermod -aG docker deployer
4. Trong khi trên máy chủ dàn, sau đó nó sẽ kéo xuống hình ảnh Docker mới được xây dựng và cài đặt nó vào thời gian chạy Docker địa phương.

Cuối cùng, dòng cuối cùng của tệp YAML phát hành lệnh

FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
7, sẽ bắt đầu container Docker, xác định các cổng mạng và truyền trong bất kỳ biến môi trường nào được sử dụng bên trong hình ảnh.

Khi tệp

FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
8 cam kết với repo, nó sẽ tắt các cuộc đua!

Hướng dẫn gitlab ci cd nodejs docker - docker gitlab ci cd nodejs
Có lẽ chỉ thú vị cho DevOps mọt sách ..

Lưu trữ các khóa và biến ở đâu

Một vấn đề có thể xuất hiện khi xác định các bản dựng CI/CD là nơi xác định các khóa, mật khẩu và thông tin nhạy cảm khác. Đặc biệt là khi đối phó với Docker, phải cẩn thận để đảm bảo các khóa truy cập không được nướng vào hình ảnh docker trong quá trình xây dựng.

Trong Phần 3 ở trên, chúng tôi đã xác định các khóa máy chủ của chúng tôi trong các biến CI/CD của Dự án Gitlab. Mặc dù điều này hoạt động tốt, chúng tôi cũng có thể lưu trữ thông tin này trong tệp

FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
8, Dockerfile hoặc thậm chí trong chính mã NodeJS. Mặc dù các biến "mã hóa cứng" hơn một chút khi được xác định trong các tệp này, nhưng nó có thể hữu ích cho các mục ít nhạy hơn và hiếm khi thay đổi (ví dụ: ID cặp khóa AWS).

Dưới đây là các ví dụ về việc xác định giá trị

# define reverse proxy
ProxyPass /info http://127.0.0.1:8882/info 
ProxyPassReverse /info http://127.0.0.1:8882/info

# optional headers - can be omitted
<LocationMatch /info>
  # enable CORS
  Header set Access-Control-Allow-Origin "*"
  Header set Access-Control-Allow-Methods "GET"
  # do not cache
  Header set Cache-Control "no-store, must-revalidate"
  Header set Pragma "no-cache"
  Header set Expires "0"
</LocationMatch>
5 từ phản hồi API NodeJS REST trong các tập lệnh xây dựng CI/CD khác nhau (và sau đó đọc nó từ tệp
FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
8):

  • Được xác định trong lệnh
    FROM node:14-alpine
    
    # create dir
    RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
    WORKDIR /home/node/app
    
    # build dependencies
    COPY ./package*.json ./
    USER node
    RUN npm install
    
    # copy in source code
    COPY --chown=node:node ./ ./
    
    # start express server
    CMD [ "npm", "start" ]
    7 trong giá trị
    FROM node:14-alpine
    
    # create dir
    RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
    WORKDIR /home/node/app
    
    # build dependencies
    COPY ./package*.json ./
    USER node
    RUN npm install
    
    # copy in source code
    COPY --chown=node:node ./ ./
    
    # start express server
    CMD [ "npm", "start" ]
    8 - cam kết - được mã hóa cứng và được chuyển vào thùng chứa Docker dưới dạng biến môi trường (sau đó được đọc bởi ứng dụng NodeJS).
  • Được xác định trong giá trị Dockerfile - cam kết được ghi vào tệp
    stages:
      - build
      - deploy-stage
    
    variables:
      VARIABLE_DATA: Gitlab-CI-YAML
    
    build:
      stage: build
      image: docker:18-git
      services:
        - docker:18-dind
      script:
        # get node app version from package.json for use in tagging docker image
        - apk update && apk add jq
        - export VERSION=`jq -r ".version" < ./package.json`
        # login to docker
        - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
        # build and tag docker image
        - docker build -t $CI_REGISTRY_IMAGE:$VERSION -t $CI_REGISTRY_IMAGE:latest .
        # publish finished image
        - docker push $CI_REGISTRY_IMAGE:$VERSION
        - docker push $CI_REGISTRY_IMAGE:latest
    
    deploy-stage:
      stage: deploy-stage
      image: alpine:latest
      script:
        - chmod og= $STAGE_ID_RSA
        - apk update && apk add openssh-client
        # stop existing docker container & remove images
        - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker stop $CI_PROJECT_NAME || true"
        - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker rm $CI_PROJECT_NAME || true"
        - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker image rm $CI_REGISTRY_IMAGE:latest || true"
        # pull new container
        - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY"
        - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker pull $CI_REGISTRY_IMAGE:latest"
        # run new container
        - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker run -d --restart unless-stopped --name $CI_PROJECT_NAME -p 8882:3000 -e "variableData=Docker-Run-Command" $CI_REGISTRY_IMAGE:latest"
    
    0 được tạo trong quá trình xây dựng hình ảnh Docker, sau đó được đọc bởi ứng dụng NodeJS.
  • Được xác định trong chính mã NodeJS - cam kết A và cam kết B - xóa định nghĩa
    # define reverse proxy
    ProxyPass /info http://127.0.0.1:8882/info 
    ProxyPassReverse /info http://127.0.0.1:8882/info
    
    # optional headers - can be omitted
    <LocationMatch /info>
      # enable CORS
      Header set Access-Control-Allow-Origin "*"
      Header set Access-Control-Allow-Methods "GET"
      # do not cache
      Header set Cache-Control "no-store, must-revalidate"
      Header set Pragma "no-cache"
      Header set Expires "0"
    </LocationMatch>
    5 khỏi cả lệnh
    FROM node:14-alpine
    
    # create dir
    RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
    WORKDIR /home/node/app
    
    # build dependencies
    COPY ./package*.json ./
    USER node
    RUN npm install
    
    # copy in source code
    COPY --chown=node:node ./ ./
    
    # start express server
    CMD [ "npm", "start" ]
    7 và Dockerfile có nghĩa là giá trị mặc định được đặt trong mã NodeJS sẽ được trả về.

Cải tiến

Mặc dù cách tiếp cận này đã hoạt động tốt cho một vài dự án khác nhau, cuối cùng tôi muốn tránh xa việc mở quyền truy cập SSH trên máy chủ của mình, đặc biệt là cho người dùng trong nhóm

FROM node:14-alpine

# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app

# build dependencies
COPY ./package*.json ./
USER node
RUN npm install

# copy in source code
COPY --chown=node:node ./ ./

# start express server
CMD [ "npm", "start" ]
1 (gần với quyền root). Tôi đã cố gắng giảm thiểu điều này bằng cách kết hợp một số thực tiễn tốt nhất SSH (ví dụ: thay đổi cổng mặc định, chỉ cho phép một số địa chỉ IP nhất định kết nối, các khóa xoay, v.v.). Tôi sẽ tiếp tục xem xét các triển khai từ xa với Docker với hy vọng tìm thấy thứ gì đó cảm thấy an toàn hơn!

Tôi có thể chạy Gitlab trong Docker không?

Cài đặt Gitlab làm bộ chứa Docker để Gitlab sẽ chạy bên trong thùng chứa Docker, nhưng nó sẽ sử dụng đĩa của máy chủ để lưu dữ liệu và tải cấu hình.Lộ các cổng 443, 80, 22 và ánh xạ chúng vào cùng một cổng vào máy chủ./srv/gitlab/dữ liệu sẽ giữ dữ liệu của git repo thực tế.GitLab will run inside a docker container, but it will use the host machine's disk to save data and load configurations. Expose the ports 443, 80, 22, and map them to the same ports to the host machine. /srv/gitlab/data will hold the actual git repo's data.

Gitlab có hỗ trợ CI CD không?

Gitlab có CI/CD được xây dựng ngay, không cần plugin., no plugins required.

Hình ảnh Docker trong Gitlab CI là gì?

Gitlab CI kết hợp với Gitlab Runner có thể sử dụng Công cụ Docker để kiểm tra và xây dựng bất kỳ ứng dụng nào.Docker là một dự án nguồn mở cho phép bạn sử dụng hình ảnh được xác định trước để chạy các ứng dụng trong các "container" độc lập được chạy trong một thể hiện Linux duy nhất.an open-source project that allows you to use predefined images to run applications in independent "containers" that are run within a single Linux instance.

CI CD có miễn phí trên gitlab không?

Nếu bạn có một dự án công khai, nguồn mở trên GitHub, giờ đây bạn có thể tận dụng CI/CD miễn phí trên gitlab.com.Là một phần trong cam kết của chúng tôi đối với nguồn mở, chúng tôi cung cấp tất cả các dự án công cộng các tính năng cấp cao nhất của chúng tôi (Gitlab SaaS Ultimate) miễn phí.. As part of our commitment to open source, we offer all public projects our highest tier features (GitLab SaaS Ultimate) for free.