18/09/2018, 16:44

Làm thế nào để tự lưu trữ ReviewNinja trên DigitalOcean Sử dụng Docker và CoreOS

Giới thiệu Việc xem xét mã đã trở thành một phần không thể tách rời của quá trình phát triển phần mềm hiện đại. Với sự ra đời của các hệ thống kiểm soát phiên bản phân tán, và đặc biệt là kể từ khi GitHub ra đời, mô hình yêu cầu-xem xét-hợp nhất đã được phổ biến rộng rãi trong cộng đồng phát ...

Giới thiệu

Việc xem xét mã đã trở thành một phần không thể tách rời của quá trình phát triển phần mềm hiện đại. Với sự ra đời của các hệ thống kiểm soát phiên bản phân tán, và đặc biệt là kể từ khi GitHub ra đời, mô hình yêu cầu-xem xét-hợp nhất đã được phổ biến rộng rãi trong cộng đồng phát triển phần mềm. Tuy nhiên, hệ thống xem xét yêu cầu kéo xây dựng của GitHub để lại rất nhiều điều mong muốn. Kết quả là, nhiều công cụ đánh giá mã của bên thứ ba tích hợp với GitHub tồn tại để cải thiện quy trình. ReviewNinja là một công cụ như vậy.

Đánh giáNinja bổ sung thêm một số tính năng trên đỉnh của trải nghiệm xem xét yêu cầu kéo vani GitHub. Nó cho chúng ta khả năng ký một cách rõ ràng về yêu cầu kéo bằng cách đưa ra "ngôi sao ninja", vì vậy không cần thêm ý kiến ​​như :shipit:, LGTMhoặc các công ước phổ biến khác. Và bạn có thể đặt các chính sách để chặn hợp nhất nếu yêu cầu kéo không được ký bởi ít nhất 2 thành viên trong nhóm hoặc nếu ai đó thêm nhận xét như !fix trên yêu cầu kéo.

ReviewNinja được phát triển và mở nguồn bởi SAP. Nó có một phiên bản được lưu trữnhưng chúng tôi có thể triển khai nó trên các máy chủ của riêng mình và sử dụng nó cho kho lưu trữ GitHub riêng của chúng tôi.

Trong hướng dẫn này, bạn sẽ triển khai một cá thể ReviewNinja trên DigitalOcean bằng cách sử dụng Docker và CoreOS. Một cá thể ReviewNinja sản xuất có một vài bộ phận chuyển động, vì vậy chúng tôi sẽ sử dụng docker-machine để tạo và điều khiển máy chủ Docker từ xa và docker-compose để mô tả, xây dựng và triển khai ngăn xếp của chúng tôi. Chúng tôi sẽ sử dụng CoreOS cho máy chủ Docker, đây là bản phân phối Linux tối thiểu được thiết kế riêng cho triển khai trên đám mây. Một bản cài đặt mới của CoreOS chỉ có systemd và trình chạy Docker chạy, vì vậy chúng tôi có nhiều tài nguyên hơn cho các ứng dụng của mình.

Điều kiện tiên quyết

Để hoàn thành hướng dẫn này, bạn sẽ cần:

  • Docker, docker-machinevà docker-compose được cài đặt trên máy cục bộ của bạn, vì vậy bạn có thể xây dựng hình ảnh ứng dụng mà chúng tôi sẽ triển khai. Bạn có thể đi theo tui tài liệu cài đặt chính thức cho Docker để có được những công cụ này được cấu hình. Cả hai docker-machine và docker-compose được cài đặt tự động với ứng dụng Docker trên OSX và Windows hoặc bạn có thể cài đặt chúng theo cách thủ công bằng cách sử dụng các liên kết sau:
    • Hướng dẫn cài đặt Soạn thảo Docker
    • Hướng dẫn cài đặt Docker Machine
  • Git được cài đặt trên máy cục bộ của bạn, vì vậy bạn có thể sao chép kho lưu trữ ReviewNinja để tạo vùng chứa. Theo tài liệu cài đặt Git chính thức nếu bạn cần thực hiện điều kiện tiên quyết này.
  • Mã truy cập DigitalOcean có cả quyền truy cập Đọc và ghi, bạn có thể tạo bằng cách truy cập Ứng dụng & API trang. Sao chép mã thông báo này, vì bạn sẽ cần sử dụng nó với docker-machine để tạo máy chủ.
  • Một giọt CoreOS 1 GB, chúng tôi sẽ định cấu hình bằng docker-machine trong hướng dẫn này.
  • A GitHub tài khoản.

Bước 1 - Tạo và kích hoạt một máy chủ lưu trữ dựa trên CoreOS

Hãy thiết lập cơ sở hạ tầng cho việc triển khai của chúng tôi. Các docker-machine công cụ cho phép bạn cung cấp các máy từ xa như các máy chủ Docker và điều khiển chúng từ máy cục bộ của bạn. Nó cung cấp trình điều khiển cho nhiều nhà cung cấp đám mây phổ biến, bao gồm DigitalOcean. Chúng tôi sẽ sử dụng docker-machine để tạo ra một CoreOS Droplet cho máy chủ Docker của chúng ta.

Chuyển sang thiết bị đầu cuối của bạn và đưa ra lệnh sau, sử dụng Mã thông báo truy cập kỹ thuật số của bạn:

docker-machine create --driver=digitalocean 
--digitalocean-access-token=DIGITAL_OCEAN_ACCESS_TOKEN 
--digitalocean-image=coreos-stable 
--digitalocean-region=nyc3 
--digitalocean-size=1GB 
--digitalocean-ssh-user=core 
reviewninja

Chúng tôi đang nói docker-machine để tạo ra một giọt nhỏ được gọi là reviewninja bên trong NYC3 trung tâm dữ liệu bằng cách sử dụng coreos-stable hình ảnh với 1GB bộ nhớ. Lưu ý rằng chúng tôi chỉ định --ssh-user=core vì người dùng mặc định trong cài đặt CoreOS core.

Khi bạn chạy lệnh này, bạn sẽ thấy kết quả sau:

OutputRunning pre-create checks...
Creating machine...
(reviewninja) Creating SSH key...
(reviewninja) Creating Digital Ocean droplet...
(reviewninja) Waiting for IP address to be assigned to the Droplet...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with coreOS...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env reviewninja

Hãy xem liệu Droplet mới này có được nhận ra hay không docker-machine. Chạy lệnh:

docker-machine ls

Bạn sẽ thấy đầu ra sau, cho biết rằng máy chủ Docker reviewminja đang chạy trên một địa chỉ IP từ xa bằng cách sử dụng digitalocean người lái xe:

OutputNAME          ACTIVE   DRIVER         STATE     URL                          SWARM   DOCKER    ERRORS
reviewninja            digitalocean   Running   tcp://your_ip_address:2376            v1.10.3

Khi chúng ta tạo ra máy chủ Docker, dòng cuối cùng của đầu ra cho chúng ta biết phải làm gì tiếp theo. Nó nói rằng:

OutputTo see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env reviewninja

Vì vậy, hãy chạy lệnh đó:

docker-machine env reviewninja

Bạn sẽ thấy thông báo này:

Outputexport DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://your_server_ip:2376"
export DOCKER_CERT_PATH="/home/kevin/.docker/machine/machines/reviewninja"
export DOCKER_MACHINE_NAME="reviewninja"
# Run this command to configure your shell:
# eval $(docker-machine env reviewninja)

Vì vậy, những gì đang xảy ra ở đây? Cấu trúc Docker sử dụng mô hình client-server. Một khách hàng Docker có thể giao tiếp thông qua một ổ cắm Unix hoặc qua TCP. Thông thường, trình khách Docker của chúng ta nói chuyện với công cụ Docker được cài đặt cục bộ thông qua một ổ cắm Unix. Tuy nhiên, có các biến môi trường mà bạn có thể thiết lập để báo cho trình khách Docker giao tiếp với một máy chủ Docker qua TCP. Đầu ra bạn thấy là một loạt các lệnh shell để thiết lập các biến môi trường làm việc đó.

Phần cuối nói:

Output# Run this command to configure your shell:
# eval $(docker-machine env reviewninja)

Khi bạn chạy lệnh đó, bạn yêu cầu trình bao thực thi các lệnh này để thiết lập các biến môi trường sẽ được sử dụng cho docker lệnh.

Vì vậy, hãy tiếp tục và thực hiện lệnh đó trong trình bao của bạn:

eval $(docker-machine env reviewninja)

Bây giờ, nếu bạn thực thi docker info, bạn sẽ thấy thông tin về daemon Docker từ xa, không phải trình nền Docker cục bộ của bạn:

docker info

Đầu ra từ lệnh đó sẽ trông như sau:

OutputContainers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.10.3
 [...]
Labels:
 provider=digitalocean

chú thích: Bạn có thể gặp lỗi sau trong khi chạy docker lệnh:

Error response from daemon: client is newer than server (client API version: 1.24, server API version: 1.22)

Điều này có nghĩa là phiên bản máy khách Docker bạn đang sử dụng không tương thích với phiên bản của máy chủ. Để khắc phục điều này, hãy đặt biến môi trường DOCKER_API_VERSION với cùng phiên bản với máy chủ. Ví dụ: nếu máy chủ muốn phiên bản 1.22, hãy thực thi lệnh sau:

export DOCKER_API_VERSION=1.22

Sau đó thử chạy lại lệnh Docker.

Máy chủ Docker từ xa của chúng tôi hiện được định cấu hình và có thể truy cập qua Docker. Trước khi chúng ta có thể tạo một thùng chứa ReviewNinja, chúng ta cần làm một số việc với GitHub.

Bước 2 - Đăng ký ứng dụng GitHub OAuth

ReviewNinja cần sử dụng API của GitHub để truy cập vào kho lưu trữ của bạn, vì vậy chúng tôi sẽ đăng ký cài đặt ReviewNinja của chúng tôi dưới dạng ứng dụng GitHub OAuth.

Trước tiên, chúng ta cần phải tìm ra địa chỉ IP của máy chủ của chúng tôi. Chúng ta có thể sử dụng docker-machine lệnh để làm điều đó:

docker-machine ip reviewninja

Ghi lại địa chỉ IP mà lệnh này hiển thị. Sau đó đăng nhập vào tài khoản GitHub của bạn và truy cập Cài đặt -> Ứng dụng OAuth -> Ứng dụng dành cho nhà phát triển và nhấn nút Đăng ký một ứng dụng mới nút.

New GitHub OAuth application form

Khi bạn đã trình bày biểu mẫu cho ứng dụng mới, hãy nhập thông tin sau:

  1. Bộ Tên đến review-ninja.
  2. Bộ URL trang chủ đến http://your_ip_address.
  3. Bộ URL gọi lại ủy quyền đến http://your_ip_address/auth/GitHub/callback.

Sau đó nhấn nút Đăng ký ứng dụng để lưu các thay đổi và tạo ứng dụng. Thao tác này sẽ hiển thị ứng dụng mới được tạo trên màn hình.

Lưu các giá trị cho ID ứng dụng kháchBí mật ứng dụng khách một nơi nào đó an toàn; bạn sẽ thêm chúng vào cấu hình ứng dụng ReviewNinja ngay.

GitHub app client id and secret

Bây giờ bạn đã có chìa khóa, hãy bắt đầu xây dựng ví dụ ReviewNinja của chúng tôi.

Bước 3 - Tạo Vùng chứa Docker ReviewNinja

ReviewNinja là một ứng dụng Node.js dựa trên một tầng lưu trữ được hỗ trợ bởi MongoDB. Và kể từ khi chúng tôi đang đặt điều này trong một môi trường sản xuất, chúng tôi sẽ đặt ứng dụng Node.js đằng sau một máy chủ proxy để máy chủ ứng dụng không được tiếp xúc trực tiếp với Internet. Chúng tôi sẽ sử dụng Nginx cho mục đích này. Đó là rất nhiều để cấu hình, vì vậy chúng tôi sẽ sử dụng docker-compose triển khai nhiều vùng chứa có liên quan theo cách khai báo. Chúng tôi xác định cấu hình chúng tôi muốn và sau đó sử dụng docker-compose công cụ để tạo vùng chứa với tất cả môi trường thời gian chạy được chỉ định.

Đầu tiên, chúng ta cần lấy mã nguồn của ReviewNinja. Sao chép mã nguồn trên máy cục bộ của bạn bằng Git:

git clone https://github.com/reviewninja/review.ninja.git

Sau đó điều hướng đến thư mục của dự án:

cd review.ninja

Kho lưu trữ này chứa Dockerfile, cho Docker biết cách xây dựng hình ảnh ứng dụng ReviewNinja. Nếu bạn mở tệp này trong trình chỉnh sửa văn bản yêu thích của mình, bạn sẽ thấy nội dung sau:

Dockerfile

FROM node:0.12.2

COPY . /app

RUN npm install -g bower
RUN cd /app; npm install; bower install --allow-root;

WORKDIR /app

VOLUME ["/certs"]

EXPOSE 5000

CMD ["node", "/app/app.js"]

Tệp này chỉ định phiên bản của Node.js mà ứng dụng này sẽ sử dụng. Sau đó, nó sao chép tất cả các tệp từ thư mục hiện tại vào app và cài đặt tất cả các ứng dụng phụ thuộc. Sau đó nó cho thấy cổng 5000 và khởi chạy ứng dụng. Để biết giới thiệu chi tiết hơn về Dockerfiles, hãy xem hướng dẫn này.

Dockerfile mô tả thùng chứa ứng dụng ReviewNinja, nhưng chúng ta có thể mô tả các thành phần của ngăn xếp của chúng ta, bao gồm MongoDB và proxy Nginx, bằng cách sử dụng một tệp gọi là docker-compose.yml, mà là một YAML tệp, định dạng phổ biến cho tệp cấu hình.

Kho lưu trữ mà bạn nhân bản có một tệp gọi là docker-compose-example.ymlnhưng chúng tôi sẽ viết tệp của riêng mình từ đầu vì ví dụ không đáp ứng được nhu cầu của chúng tôi.

Trước tiên, hãy định nghĩa bộ nhớ cho ngăn xếp của chúng ta. Tạo tệp docker-compose.yml và nhập cấu hình sau:

docker-compose.yml

version: "2"
services:
    db:
        image: mongo
        volumes:
            - /data:/data/db

Các db dịch vụ sử dụng chính thức Hình ảnh MongoDB trên Docker Hub, kho lưu trữ trung tâm của hình ảnh Docker. Theo thiết kế, các vùng chứa Docker mất trạng thái thời gian chạy khi chúng bị dừng và bị loại bỏ. Điều đó tốt cho web dịch vụ, vì nó không có quốc tịch. Cho chúng ta db dịch vụ, chúng tôi cần lưu dữ liệu vào đĩa để chúng tôi sẽ không mất tất cả dữ liệu đánh giá mã nếu chúng tôi ngừng hoặc khởi động lại dịch vụ. Đây là đâu volumes Vào thời gian chạy, daemon Docker có thể chạy một thùng chứa bản đồ khối lượng trong container đến thư mục trên máy chủ.

Trong cấu hình của chúng tôi, chúng tôi đã chỉ định những điều sau:

docker-compose.yml

        volumes:
            - /data:/data/db

Đây là bản đồ của máy chủ /data thư mục để /data/db trong vùng chứa, đó là thư mục MongoDB được cấu hình để ghi vào bên trong vùng chứa. Bằng cách tạo ánh xạ này, các thay đổi được thực hiện bởi ứng dụng sẽ được lưu trên máy chủ trong /data thay vì trong vùng chứa.

Tiếp theo chúng ta định nghĩa thùng chứa ứng dụng ReviewNinja. Thêm mục này vào docker-compose.yml tệp, sau cấu hình hiện có:

docker-compose.yml

services:
    db:
    [...]

    web:
        build: .
        working_dir: /app/
        links:
            - db
        environment:
            MONGODB: mongodb://db/reviewninja
            GITHUB_CLIENT: YOUR_GITHUB_APP_ID
            GITHUB_SECRET: YOUR_GITHUB_APP_SECRET

chú thích: Đảm bảo rằng web xếp hàng theo chiều dọc với db định nghĩa dịch vụ mà bạn đã định nghĩa trước đó là các tệp YAML khó hiểu về thụt đầu dòng.

Chúng tôi sử dụng build . câu nói nào docker-compose hình ảnh phải được xây dựng từ Dockerfile mà chúng ta vừa khám phá trong thư mục hiện tại. Sau đó, chúng tôi khai báo một liên kết đến db hình ảnh, vì vậy bên trong web container, tên db sẽ giải quyết thành địa chỉ IP của db thùng đựng hàng. Điều này cung cấp một cơ chế khám phá dịch vụ thô sơ; chúng tôi không phải biết địa chỉ IP của db container trước thời hạn và mã cứng nó hoặc vượt qua nó thông qua một biến môi trường. Sau đó, chúng tôi sử dụng liên kết đó để xác định MONGODB biến môi trường, sử dụng mongodb://db/reviewninja làm giá trị.

Điền vào GITHUB_CLIENT và GITHUB_SECRET với ID khách hàng và bí mật cho ứng dụng GitHub bạn đã tạo. Ứng dụng ReviewNinja sẽ đọc các biến môi trường này khi chạy.

Cuối cùng, hãy định nghĩa dịch vụ cân bằng tải sẽ chuyển tiếp các yêu cầu từ cổng 80 đến cổng mà ứng dụng Node.js của chúng tôi sử dụng. Thêm cấu hình này vào tệp, xếp nó theo chiều dọc với web khai báo dịch vụ bạn vừa tạo:

docker-compose.yml

services:
    web:
    [...]
    nginx:
        image: nginx
        ports:
            - "80:80"
        volumes:
            - ./reviewninja.conf:/etc/nginx/conf.d/default
        command: /bin/bash -c "echo -e 'upstream backend { server web:5000; }
server { listen 80; location / { proxy_pass http://backend; }}' > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
        links:
            - web

Chúng tôi sử dụng hình ảnh Nginx chính thức từ Docker Hub và khai báo ánh xạ cổng 80:80, liên kết cổng 80 trên máy chủ đến cổng 80 trong thùng chứa. Sau đó chúng ta tạo một ánh xạ khối lượng lưu trữ tệp cấu hình Nginx bên ngoài vùng chứa và chúng tôi khai báo một liên kết vùng chứa với app để chúng tôi có thể định vị nó theo tên và yêu cầu proxy.

Các command tuyên bố là khá dài, vì vậy hãy phá vỡ nó xuống. Nó thực sự chạy hai lệnh trên một dòng. Lệnh đầu tiên là echo -e ... > /etc/nginx/conf.d/default.conf, tạo tệp cấu hình Nginx cho ReviewNinja, trông giống như sau:

default.conf

upstream backend {
    server web:5000;
}

server {
    listen       80;

    location / {
        proxy_pass http://backend;
    }
}

Điều này xác định backend ngược dòng và chỉ nó vào web:5000. Giá trị web đến từ docker-compose.yml tập tin trong links phần và cổng 5000 là cổng mà máy chủ Node.js sử dụng trong web thùng đựng hàng. Sau đó, chúng tôi tuyên bố rằng máy chủ Nginx của chúng tôi sẽ chạy trên cổng 80 trong vùng chứa và phải ủy quyền tất cả các yêu cầu backend, máy chủ ứng dụng của chúng tôi.

Phần thứ hai của lệnh, nginx -g 'daemon off', là lệnh chạy quy trình máy chủ Nginx trong vùng chứa. Chúng ta cần xác định daemon off bởi vì Nginx chạy trong chế độ daemon theo mặc định, tách nó ra khỏi tiến trình đang chạy. Docker xem xét bất kỳ chương trình nào được tách ra khỏi điểm nhập container như là “đã được xác nhận” và chấm dứt container, gặt hái tất cả các quy trình. Theo quy tắc chung, mọi quá trình chạy bên trong vùng chứa Docker phải chạy ở nền trước.

Đây là toàn bộ docker-compose.yml tệp, chỉ trong trường hợp bạn muốn kiểm tra lại cấu hình của mình trước khi tiếp tục:

docker-compose.yml

version: "2"
services:
    db:
        image: mongo
        volumes:
            - /data:/data/db
    web:
        build: .
        working_dir: /app/
        links:
            - db
        environment:
            MONGODB: mongodb://db/reviewninja
            GITHUB_CLIENT: YOUR_GITHUB_APP_ID
            GITHUB_SECRET: YOUR_GITHUB_APP_SECRET
    nginx:
        image: nginx
        ports:
            - "80:80"
        volumes:
            - ./reviewninja.conf:/etc/nginx/conf.d/default
        command: /bin/bash -c "echo -e 'upstream backend { server web:5000; }
server { listen 80; location / { proxy_pass http://backend; }}' > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
        links:
            - web

Hãy nhìn vào tài liệu docker-compose nếu bạn muốn khám phá thêm về cú pháp và tùy chọn cho docker-compose.yml.

Điều đó sẽ chăm sóc cấu hình của chúng tôi cho ứng dụng này. Lưu docker-compose.yml tập tin; đã đến lúc triển khai ứng dụng này.

Bước 4 - Xây dựng và triển khai các vùng chứa

Chúng tôi đã định cấu hình docker-compose để triển khai ứng dụng ReviewNinja của chúng tôi, một cá thể MongoDB giữ dữ liệu và một proxy Nginx. Trước khi chúng tôi triển khai các vùng chứa này, hãy xác minh rằng reviewninja Máy Docker vẫn hoạt động:

docker-machine active

Bạn nên thấy:

Outputreviewninja

Nếu bạn không thấy đầu ra đó, hãy chắc chắn để chạy

eval $(docker-machine env reviewninja)

một lần nữa để đảm bảo cài đặt môi trường của bạn là chính xác. Sau đó thử lại.

Một khi bạn chắc chắn rằng bạn có một máy hoạt động, sử dụng docker-compose để xây dựng ngăn xếp của bạn:

docker-compose build

Quá trình này có thể mất một thời gian rất dài vì nó tải xuống và cấu hình tất cả các phụ thuộc cho ứng dụng ReviewNinja trên máy chủ Docker. Bạn sẽ thấy kết quả sau:

Outputdb uses an image, skipping
Building web
Step 1 : FROM node:0.12.2
0.12.2: Pulling from library/node
[...]
Successfully built 106a1992d538

Khi quá trình xây dựng hoàn tất, hãy xác minh rằng bạn có hình ảnh thành công:

docker images

Bạn sẽ thấy đầu ra sau cho biết hình ảnh reviewninja_web đã được tạo thành công:

OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
reviewninja_web     latest              106a1992d538        3 minutes ago       946.6 MB

Bây giờ chúng ta có thể khởi chạy cơ sở dữ liệu của chúng ta, ứng dụng ReviewNinja của chúng ta và proxy Nginx của chúng ta trên máy chủ từ xa của chúng ta bằng một lệnh duy nhất:

docker-compose up -d

Điều này sẽ trả về tất cả các vùng chứa mà chúng tôi đã xác định trong docker-compose tập tin. Chúng tôi sử dụng -d (cho "tách") để tất cả các thùng chứa chạy trong nền và chúng tôi có thiết bị đầu cuối của chúng tôi trở lại trong kiểm soát của chúng tôi.

OutputCreating network "reviewninja_default" with the default driver
Pulling db (mongo:latest)...
latest: Pulling from library/mongo
[...]
Digest: sha256:d3f19457c816bb91c5639e3b1b50f67370e3b3a58b812d73446d7b966469c65e
Status: Downloaded newer image for mongo:latest
Creating reviewninja_db_1
Creating reviewninja_web_1
Creating reviewninja_nginx_1

Hãy kiểm tra xem các thùng chứa có đang hoạt động hay không. Thực hiện lệnh sau:

docker ps

Bạn sẽ thấy đầu ra trông giống như sau:

OutputCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
29f8e6f770d3        nginx               "nginx -g 'daemon off"   43 seconds ago      Up 41 seconds       0.0.0.0:80->80/tcp, 443/tcp   reviewninja_nginx_1
164564dd450a        reviewninja_web     "node /app/app.js"       45 seconds ago      Up 43 seconds       5000/tcp                      reviewninja_web_1
7cd9d03eb3b9        mongo               "/entrypoint.sh mongo"   46 seconds ago      Up 44 seconds       27017/tcp                     reviewninja_db_1

Chúng tôi cũng muốn đảm bảo các dịch vụ đang chạy đúng cách. Để làm điều đó, chúng tôi sử dụng docker logs lệnh để xem đầu ra của vùng chứa. Hãy kiểm tra các bản ghi cho ứng dụng web ReviewNinja. Chúng tôi có thể tham chiếu vùng chứa bằng ID của nó, được liệt kê trong CONTAINER ID trong đầu ra trước đó, hoặc theo tên của nó. Trong trường hợp của chúng tôi, tên là reviewninja_web_1, hãy xem nhật ký cho vùng chứa đó:

docker logs reviewninja_web_1

Bạn sẽ thấy đầu ra từ ứng dụng ReviewNinja cho biết rằng nó đang lắng nghe các kết nối:

OutputIn server/app.js
checking configs
✓ configs seem ok
Host:        http://localhost:5000
GitHub:      https://GitHub.com
GitHub-Api:  https://api.GitHub.com
bootstrap certificates
bootstrap static files
apply migrations
[...]
bootstrap mongoose
[...]
bootstrap passport
[...]
bootstrap controller
[...]
bootstrap api
[...]
bootstrap webhooks
[...]
bootstrap monkey patch

✓ bootstrapped, app listening on localhost:5000

Đầu ra cho biết rằng ReviewNinja đang nghe trên cổng 5000.

Để truy cập nó từ trang web, chúng tôi sẽ cần sử dụng IP của máy chủ Docker của chúng tôi, đó là máy chủ CoreOS của chúng tôi. Nếu bạn quên địa chỉ IP của máy chủ, hãy sử dụng docker-machine tim ra.

docker-machine ip reviewninja

Trỏ trình duyệt của bạn tới http://your_server_ip và bạn sẽ được chào đón bởi ninja:

ReviewNinja home page

Cuối cùng, chúng tôi đã sẵn sàng để sử dụng ứng dụng với mã riêng của chúng tôi.

Bước 5 - Sử dụng ReviewNinja với một kho lưu trữ

Hãy thử ví dụ mới của chúng ta về ReviewNinja trên một kho lưu trữ thử nghiệm. Chúng tôi sẽ cung cấp phản hồi về yêu cầu kéo, giải quyết vấn đề, chấp nhận thay đổi và hợp nhất yêu cầu kéo vào.

Trước tiên, chúng ta cần cho phép ứng dụng ReviewNinja truy cập tài khoản GitHub của chúng tôi. Bấm vào Đăng nhậpvà bạn sẽ được chuyển hướng đến GitHub để đăng nhập. Bạn sẽ được hỏi liệu bạn có cho phép ReviewNinja truy cập tài khoản GitHub của bạn hay không:

Grant app permissions through GitHub

Khi bạn cho phép ứng dụng, bạn sẽ được đưa đến giao diện chính của ReviewNinja. Nếu bạn có kho lưu trữ riêng tư mà bạn muốn ReviewNinja sử dụng, bạn có thể nhấp vào Bật repos riêng tư link:

Enabling access to private repositories

Sau đó, bạn sẽ được chuyển hướng đến GitHub để sửa đổi ủy quyền của bạn đối với ứng dụng ReviewNinja để bao gồm quyền truy cập vào bản repos riêng tư của bạn:

Authorizing private repositories

Một khi bạn đã cấp cho ReviewNinja quyền truy cập mà bạn muốn nó có, bạn có thể thêm một kho lưu trữ để bạn có thể sử dụng ReviewNinja cho quy trình yêu cầu kéo của bạn. Khi đó là lần đầu tiên bạn sử dụng ReviewNinja, bạn có cơ hội thêm mẫu ReviewNinja-Welcome kho:

Adding a sample repository

Tạo kho lưu trữ mẫu đó để chúng ta có thể đi qua một số tính năng cơ bản của ReviewNinja. Điều này tạo ra kho lưu trữ trên Github trong tài khoản của bạn và thêm nó vào ReviewNinja.

Kho chứa mẫu chứa ReadMe.md tệp được cho là phác thảo một số tính năng của luồng xem xét mã của ReviewNinja. Các ReviewNinja-Welcome kho lưu trữ đã có yêu cầu kéo mở từ một chi nhánh your_github_username-patch-1 có bản sao cập nhật của ReadMe.md tập tin. Tên của chi nhánh sẽ thay đổi dựa trên tên người dùng của bạn.

Pull Requests View

Nhấp vào nhánh đó và bạn sẽ thấy giao diện xem lại mã chính nơi bạn có thể duyệt các khác biệt và thêm nhận xét. Bạn cũng sẽ thấy hộp trạng thái yêu cầu kéo, trong đó phác thảo trạng thái của yêu cầu kéo và các vấn đề nổi bật.

Pull Request status box

Các Yêu cầu kéo hợp nhất bây giờ là nút màu hổ phách vì trạng thái của yêu cầu kéo là "đang chờ xử lý". Trạng thái sẽ thay đổi dựa trên điều kiện mà bạn có thể tinh chỉnh bằng cách nhấp vào nút bánh răng. Theo mặc định, nó yêu cầu ít nhất 1 ngôi sao ninja cho nút chuyển sang màu xanh lục.

Chúng ta sẽ thấy rằng trong hành động sau này, nhưng bây giờ, chúng ta hãy thêm một bình luận dòng. Nhấp vào dòng mã nói

+ convenience we also have a dropdown menu to add these comments

Add a line comment

Hãy là một người nhỏ bé ở đây và gợi ý rằng từ đó dropdown nên được thay đổi thành drop-down. Thêm nhận xét bằng cách sử dụng hộp nhận xét ở bên phải màn hình và gắn cờ này là sự cố chặn bằng cách thêm !fix để bình luận của bạn, như thể hiện trong hình dưới đây:

Flag a line

Một bình luận được gắn cờ sẽ được coi là một "vấn đề" về yêu cầu kéo mà tác giả của yêu cầu kéo cần phải giải quyết trước khi ReviewNinja cho phép nó được hợp nhất.

Làm mới trang và bây giờ bạn sẽ thấy vấn đề mới được liệt kê ở trên Yêu cầu kéo hợp nhất nút:

Our problem

Hãy sửa vấn đề đó. Trên máy cục bộ của bạn, hãy sử dụng Git để sao chép kho lưu trữ:

git clone git@GitHub.com:your_github_username/ReviewNinja-Welcome.git

cd ReviewNinja-Welcome

Sau đó xem chi nhánh cần làm việc:

git checkout your_github_username-patch-1

Mở ReadMe.md trong trình soạn thảo văn bản yêu thích của bạn và thay đổi dòng để nói drop-down thay vì dropdown:

label ReadMe.md
To add a flag simply leave a comment with your desired flag. For
convenience we also have a drop-down menu to add these comments
automatically.

Lưu tệp trong trình chỉnh sửa của bạn, sau đó thêm và cam kết thay đổi của bạn:

git add ReadMe.md

git commit -m "Address code review feedback"

Tiếp theo, đẩy các thay đổi vào nhánh tới Github:

git push origin your_github_username-patch-1

Bây giờ, làm mới giao diện ReviewNinja trong trình duyệt của bạn. Bạn sẽ thấy rằng mã được cập nhật và nếu bạn nhấp lại vào dòng, bạn có thể trả lời nhận xét hiện tại bằng !fixed hoặc là !resolved, như trong hình dưới đây:

Mark a problem as resolved

Cuối cùng, bây giờ chúng tôi đã hài lòng với yêu cầu kéo, chúng ta hãy cho nó một ngôi sao ninja như một dấu hiệu chính thức. Nhấn vào Thêm ngôi sao ninja nút:

ninja star

Sau đó làm mới trình duyệt và quan sát rằng trạng thái yêu cầu kéo được cập nhật thành "đã thành công" và Yêu cầu kéo hợp nhất nút có màu xanh lá cây:

Ready for merge

Bạn có thể tùy chỉnh điều kiện thành công của yêu cầu kéo bằng cách nhấp vào nút bánh răng:

Customize

Tiếp tục và nhấp vào "Hợp nhất yêu cầu kéo". Sau khi trang được tải lại (bạn có thể phải làm mới nó theo cách thủ công), bạn sẽ thấy trạng thái của yêu cầu kéo được thay đổi thành "Hợp nhất".

Merged

Một điều cần ghi nhớ: ReviewNinja kéo yêu cầu Yêu cầu kéo GitHub và ngược lại. Các bình luận được thực hiện trên ReviewNinja sẽ tự động được phản ánh trên trang yêu cầu kéo GitHub và ngược lại. Các yêu cầu kéo được hợp nhất thông qua ReviewNinja cũng sẽ được phản ánh trên GitHub:

GitHub pull requests are synced

Việc đồng bộ hóa hai hướng này sẽ thực sự thuận tiện cho các nhóm muốn dần dần chuyển sang ReviewNinja để xem xét mã.

Phần kết luận

Trong hướng dẫn này, bạn đã sử dụng Docker, docker-machinevà docker-compose triển khai ReviewNinja, một ứng dụng web nhiều tầng. Bạn đã học cách tạo một hình ảnh Docker từ một ứng dụng hiện có, và cách xác định và triển khai toàn bộ cơ sở hạ tầng của bạn từ sự thoải mái của thiết bị đầu cuối cục bộ của bạn.

Bạn cũng đã tìm hiểu về một số tính năng mạnh mẽ của ReviewNinja và cách sử dụng các tính năng đó để thêm một số điều khiển luồng công việc vào quy trình yêu cầu kéo GitHub.

Happy code reviewing!

0