Gitlab ci/cd nodejs

CI/CD là gì? . Khoảng thời gian gần đây thường phát hành các dự án thuê ngoài nên cũng hay làm tài liệu cũng như  mở rộng các dự án mới nên việc thiết lập CI/CD thường xuyên hơn và chân tay hơn. Thấy các kiến ​​thức này hay nên hôm nay mình sẽ share cho mọi người quy trình CI/CD bên mình áp dụng cho “đại dự án” Teamcrop cũng như các dự án outsourcing mà Moout thực hiện

CI/CD là gì?

Bạn sẽ thấy có nhiều định nghĩa từ hai lúa cho đến hàn lâm để khái niệm CI/CD. Mình sẽ dùng cách định nghĩa của mình để mọi người dễ hiểu CI/CD là gì theo cách thông thường nhất. CI/CD là một bộ đôi công việc, bao gồm CI (Tích hợp liên tục) và CD (Phân phối liên tục), có thể nói là quá trình tích hợp (tích hợp) thường xuyên, nhanh chóng hơn khi mã cũng như thường xuyên cập nhật phiên bản

Tại sao phải quan tâm đến CI/CD?

Ngày nay, với xu hướng Agile/Lean dẫn đến việc phát triển tính năng là điều bình thường, quan trọng phải là thần thái, ý lộn, quan trọng là phải nhanh. Nếu một tính năng nào đó mà mất 2, 3 tháng mới ra mắt thì dẫn đến nhiều hệ lụy như làm không phù hợp nhu cầu khách hàng, hoặc đối thủ đã ra mắt trước đó, mất đi cái lợi thế dẫn đầu. Do đó, việc làm ra một sản phẩm, tính năng yêu cầu thần tốc là ưu tiên số một hiện nay

Bên cạnh đó, để nhanh chóng ra mắt một tính năng, phiên bản mới nếu theo cách cổ điển sẽ mất nhiều thời gian do công việc chân tay khá nhiều và mỗi lần phát hành huy động cũng là một cơ số người không nhỏ để cập nhật một . By vậy, xu hướng CI/CD giúp cung cấp các framework, workflow giúp tiết kiệm thời gian, nguồn lực của quá trình phát hành (delivery)

Gitlab ci/cd nodejs
Gitlab ci/cd nodejs

Gitlab ci/cd nodejs
Gitlab ci/cd nodejs

Quy trình CI/CD tham khảo

Có rất nhiều quy trình, công cụ khác nhau để áp dụng CI/CD vào dự án. Nội dung của bài viết này dựa trên kinh nghiệm cho các dự án của mình phát triển khai cũng như đặc thù là các hệ thống web và viết bằng PHP (PHP hoặc Python hoặc abc…không quá quan trọng trong ngữ cảnh chia sẻ về CI

Dưới đây là các bước thông thường của quá trình phát hành tính năng trong một dự án thuộc hệ thống Teamcrop.
– Bước 1. [Manual] Khởi tạo kho lưu trữ và có nhánh mặc định là master và dev. Cài đặt trên Gitlab 9.
– Bước 2. [Manual] Trừ chủ ra, thì các coder sẽ đẩy code tính năng lên nhánh dev
– Bước 3. [Auto] Hệ thống tự động đang thực thi mã nguồn kiểm tra, nếu PASS thì triển khai mã tự động (rsync) lên server beta.
– Bước 4. [Thủ công] Người kiểm tra/QA sẽ vào hệ thống beta để thực hiện UAT (Kiểm tra mức độ chấp nhận của người dùng) và xác nhận mọi thứ đều ổn.
– Bước 5. [Thủ công] Lập trình viên hoặc chủ sở hữu sẽ tạo Yêu cầu hợp nhất và hợp nhất từ ​​nhánh dev sang nhánh chính.
– Bước 6. [Thủ công] Chủ sở hữu sẽ chấp nhận yêu cầu hợp nhất.
– Bước 7. [Auto] Hệ thống sẽ tự động thực thi mã nguồn kiểm tra, nếu PASS sẽ kích hoạt tính năng cho phép triển khai lên máy chủ sản xuất.
– Bước 8. [Thủ công] Đánh giá của chủ sở hữu là yêu cầu hợp nhất OK, kiểm tra OK. Tiến hành nhấn nút để triển khai các thay đổi trong môi trường sản xuất.
– Bước 9. [Manual] Tester/QA sẽ vào hệ thống sản xuất để thực hiện UAT và xác nhận mọi thứ OK. Nếu không OK, Chủ sở hữu có thể nhấn nút Triển khai phiên bản chính trước đó để khôi phục hệ thống về trạng thái ổn định trước đó.
– Bước 10. [Hướng dẫn sử dụng] Thắp nhang và hy vọng khách hàng không trả thù hoặc gửi email khiếu nại.

Áp dụng CI/CD với Gitlab 9

Trong khuôn khổ bài viết này, mình sẽ hướng dẫn mọi người cài đặt Gitlab 9 để quản lý mã nguồn và trên công nghệ Git. Câu hỏi của tất cả setup này là trên server đã cài Docker, nếu các bạn chưa có docker trên server thì có thể tham khảo các bài viết về docker trên bloghoctap cũng như tìm kiếm thêm trên google

CI/CD is what

Đây là câu hỏi hay, bởi vì trước đó bên mình sử dụng Gitlab 8, tuy nhiên, do các hạn chế về UI/UX cũng như không tích hợp ngon lành vụ CI/CD nên khi bản 9 ra mắt, mình đã thử sử dụng

CI/CD is what

You run the command after to create a container contains Gitlab 9

docker run --detach \
--hostname code.teamcrop.com \
--publish 8080:80 --publish 2222:22 \
--name gitlab9 \
--restart=always \
--volume /gitlab9/config:/etc/gitlab \
--volume /gitlab9/logs:/var/log/gitlab \
--volume /gitlab9/data:/var/opt/gitlab \
gitlab/gitlab-ce:9.0.3-ce.0

Nếu ai từng sử dụng docker sẽ hiểu ý nghĩa của câu lệnh trên. Đơn giản là mình sử dụng hình ảnh gitlab/gitlab-ce. 9. 0. 3-ce. 0. Có mount ra 3 thư mục bên ngoài máy ở thục mục /gitlab9 để lỡ có chuyện gì chỉ cần stop, remove container, khi chạy docker run lại thì không bị mất data, source code. Câu lệnh trên map 2 port là 8080 và 2222 tương ứng với 2 port 80 và 22 trong container. Mình map port vậy là do trên server dev này có rất nhiều service khác và đã chiếm port 80 và 22 (ssh ^^. )

Sau khi bạn bắt đầu vùng chứa, bạn có thể truy cập vào từ ip hoặc tên miền (mà bạn đã trỏ DNS), ví dụ:. http. //mã số. đồng đội. com. 8080 is could into gitlab 9, default account is `root`

Không có gì cao siêu khi cài đặt này, có thể tham khảo thêm tại trang chủ của Gitlab. com nhé

Quản lý mã nguồn bằng Gitlab

Về phần này thì mình không cần nói dài dòng, cũng như một hệ thống git thông thường (như github. ), bạn có thể tìm hiểu thêm về git và Gitlab để nhóm có thể cùng làm việc và quản lý mã nguồn trên Gitlab

CI/CD với Gitlab CI

Thông thường, các hệ thống quản lý mã nguồn không kèm theo cơ chế CI/CD. Nếu bạn muốn khai thác thì buộc phải liên kết đến kho lưu trữ, phân quyền đủ kiểu để hệ thống đó có thể lấy mã nguồn từ kho lưu trữ. Trước đây bên mình sử dụng Jenkins cho công việc này. Tuy nhiên, từ khi Gitlab ra mắt tính năng Gitlab CI, kèm theo sự chậm chạp, rắc rối và vấn đề của Jenkins, thì mình quyết định chia tay với Jenkins và đến với Gitlab CI luôn hoàn hảo, và kết quả là một bộ đôi hoàn hảo. Mã để ở Gitlab, rồi trong đó có cài đặt CI/CD để kiểm tra và triển khai mã tự động

Cũng như một số bạn mới lần đầu có cảm tình với Gitlab CI, mình đã từng thấy nó khó hiểu và cao siêu vì setup tùm lum. Sau đó thiết lập xong lại không biết nó chạy thế nào, cơ chế triển khai mã nguồn ra sao. Tuy nhiên, sau một vài lần “va chạm” đầy mồ hôi và nước mắt thì ôm cũng và hiểu được cách Gitlab CI vận hành, và nay chia sẻ cho mọi người vận dụng cho workflow của mình.

To used Gitlab CI, you need to have 2 thành phần sau. tệp

docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
3 nằm trong thư mục gốc của dự án và
docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
4

Tham khảo thêm việc lập trình GIT lương cao tại Topdev

Tập tin. gitlab-ci. yml là gì?

Mặc dù Gitlab không có cơ chế nào về CI cho dự án của bạn, nhưng khi dự án của bạn có tệp

docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
5 nằm trong thư mục gốc thì Gitlab mới nhận định dạng dự án của bạn muốn áp dụng Gitlab CI. Tệp này có định dạng và cần hợp lệ thì mới có thể hoạt động được, không thì khi bạn đẩy mã lên thì Gitlab sẽ báo lỗi tệp định dạng nội dung của tệp cấu hình không hợp lệ. Tham khảo cú pháp cấu hình này tại https. // tài liệu. gitlab. com/ce/ci/yaml/

Trong file này có gì? . ) with what command (vd. rsync. ). Tùy chọn ngôn ngữ lập trình đặc biệt, cách đóng gói của dự án mà sẽ có lệnh tương ứng thực hiện

Tới đây các bạn sẽ có câu hỏi là vậy cái gì sẽ chạy, thực thi các câu lệnh, chỉ dẫn trong file config trên? . Nếu là máy chủ Gitlab chạy thì nếu dự án mình thực hiện các lệnh không có thì sao, vì máy chủ gitlab thì cũng chỉ chứa gitlab và các chương trình cho nó chứ đâu có thể cài đặt sẵn các chương trình?

Nếu bạn đi đến đây thì bạn đã đoán là thực ra “cái thứ” thực thi các đường dẫn, câu lệnh trong tệp. gitlab-ci. yml không phải là Gitlab Server (là cái container đang chạy gitlab 9 mình start ở trên), mà chính là Gitlab Runner. Ồ. Chào mừng đến với ma trận

Gitlab Runner là gì?

Gitlab Runner là thành phần cực kỳ quan trọng trong quy trình làm việc Gitlab CI. Nếu không có Runner thì sẽ không có lệnh test, deploy nào được thực thi. Runner có nhiều loại, phân biệt dựa vào cái gọi là người thực thi. Khi khởi động trình chạy, bạn phải chọn nó là loại người thực thi nào và nó sẽ quyết định môi trường thực thi các câu lệnh trong tệp cấu hình ở trên. Bạn có thể tham khảo liên kết https. // tài liệu. gitlab. com/runner/executors/ để biết sự khác nhau của những người thực thi cũng như cách cài đặt, cấu hình chúng

Đặc thù hệ thống thù đã có docker, nên bên mình chỉ sử dụng executor loại Docker mà thôi. Và bên dưới là docker command command to start Gitlab Runner

docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest

Tại đây, bạn sẽ thấy vùng chứa này mount thư mục cấu hình ra bên ngoài, do mình muốn cấu hình của người chạy không bị mất khi dừng/xóa vùng chứa. Chỉ cần bắt đầu lại là cấu hình được giữ. Ngoài ra, nó còn mount docker. sock vào bên trong container, đây là cách để người thực thi loại docker có thể tận dụng lệnh docker bên ngoài máy chủ để thực thi lệnh tạo container phụ trong quá trình chạy trình chạy (kiểm tra, triển khai)

Start container up chỉ là bước đầu, bởi vì lưu ý là đến thời điểm này, Runner này không liên quan gì đến máy chủ Gitlab của chúng ta. Cần quay lại một bước liên kết (gọi là đăng ký) trình chạy này trong máy chủ Gitlab để mình có thể cho phép các dự án sử dụng trình chạy trong quá trình CI/CD

Xem liên kết này https. // tài liệu. gitlab. com/người chạy/đăng ký/chỉ mục. html để biết cách đăng ký người chạy này vào Máy chủ Gitlab

Dưới đây là hình ảnh tham khảo bạn có thể sử dụng trong quá trình đăng ký 1 người chạy. Có 2 thông tin quan trọng là 1 cái URL và một token ngẫu nhiên. Và cái URL đặc biệt lưu ý là thường xuyên thêm

docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
0 sau tên miền. Ví dụ ở trường hợp của mình setup là http. //mã số. đồng đội. com/ci

Gitlab ci/cd nodejs
Gitlab ci/cd nodejs

Sau khi Người chạy đã được chỉ định vào Máy chủ Gitlab, bạn có thể bật người chạy này cho một hoặc nhiều dự án trong Gitlab. Hình bên dưới minh họa việc chỉ định Người chạy vào dự án trong phần cài đặt Đường ống của Gitlab 9

Gitlab ci/cd nodejs
Gitlab ci/cd nodejs

Đến đây hầu như đã cấu hình xong. Dự án đã kích hoạt 1 người chạy và dự án đã có tệp

docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
5. Từ bây giờ, mỗi lần code được đưa lên thì runner sẽ thực thi test cũng như triển khai dựa trên các câu lệnh được khai báo trong file config

Khai báo biến để sử dụng trong các câu lệnh

Trong một số trường hợp, bạn có thể khai báo biến để có thể sử dụng trong lệnh của người chạy. Có 3 nơi có thể cấu hình biến

1. Configure ngay bên trong file

docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
5
2. Configure in project. Vào
docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
3, phần Biến bí mật (xem hình)

Gitlab ci/cd nodejs
Gitlab ci/cd nodejs

3. Configure bên trong file config của runner

Bạn có nhớ lúc mình khởi tạo runner, chỉ có một thư mục chứa config not, đây chính là nơi cấu hình chung cho runner này. Trong thư mục này sẽ có tệp là

docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
4. Và bạn có thể gán biến trong cấu hình của từng người chạy. Cấu hình ở đây có một lợi thế là cứ chạy này sẽ nhận được biến đã cấu hình. Bạn không cần phải cấu hình nhiều lần trong từng dự án

Gitlab ci/cd nodejs
Gitlab ci/cd nodejs

Ví dụ về một tập tin. gitlab-ci. yml

Bên dưới là tệp cấu hình của một dự án trong hệ thống Microservices thuộc Teamcrop

before_script

- export "PATH=$PATH:/vendor/bin"
# Install ssh-agent if not already installed, it is required by Docker.
# (change apt-get to yum if you use a CentOS-based image)
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'

# Run ssh-agent (inside the build environment)
- eval $(ssh-agent -s)

# For Docker builds disable host key checking. Be aware that by adding that
# you are suspectible to man-in-the-middle attacks.
# WARNING: Use this only with the Docker executor, if you use it with shell
# you will overwrite your user's SSH config.
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'

biến

# Change this base on project name
DEPLOYMENT_FOLDER_NAME: "tc-file"

kiểm tra

image: voduytuan/gitlab-php-ci
script:
- bash ./ci/phplint.sh ./src/
- phpcs --config-set ignore_errors_on_exit 1
- phpcs --config-set ignore_warnings_on_exit 1
- phpcs --standard=PSR2 --ignore=./src/index.php --error-severity=1 --warning-severity=8 -w --colors ./src/
- phpunit --configuration ci/phpunit.xml

nhà phát triển

________số 8

sản lượng

image: voduytuan/gitlab-php-ci
stage: deploy
script:
- ssh-add <(echo "$DEPLOYER_PRODUCTION_KEY")
- echo "Deploy to $DEPLOYMENT_FOLDER_NAME"
- rsync -avuz -e "ssh -p 22" --exclude-from="ci/deploy_exclude.txt" $CI_PROJECT_DIR/src/ $DEPLOYER_PRODUCTION_USER@$DEPLOYER_PRODUCTION_IP:/teamcrop/services/$DEPLOYMENT_FOLDER_NAME/src
only:
- master
when: manual

Trong ví dụ trên, phần kiểm tra bên mình làm 3 việc.
– Chạy kẻ nói dối để đảm bảo mã nguồn không bị lỗi cú pháp (phplint)
– Kiểm tra mã nguồn có theo tiêu chuẩn PSR2 hay không.
– Chạy PHPUnit

Còn về phần triển khai thì có cấu hình 2 task là dev và production. At task dev, auto and get code from branch dev. Còn nhiệm vụ triển khai sản xuất từ ​​nhánh chính, tuy nhiên, có chế độ triển khai thủ công, tức thì được nhấn thì triển khai mới

Gitlab ci/cd nodejs
Gitlab ci/cd nodejs

Về phần triển khai mã nguồn thì sử dụng rsync để trích xuất mã từ máy chủ repo sang. Bạn sẽ thấy các cú pháp giống nhau, chỉ khác là cấu hình dẫn đến đâu, với user nào và private key nào

Đặc thù của dòng lệnh nên sử dụng privatekey để đồng bộ mã thông qua rsync. Do đó, trong project mình đã cấu hình privatekey của user. Và bên máy chủ nhận (beta, production) mình đã đưa khóa công khai vào tệp ủy quyền. Bạn có thể tìm hiểu thêm về thiết lập và tạo cặp khóa công khai/riêng tư cho người dùng triển khai để hỗ trợ quá trình này tại liên kết https. //www. kỹ thuật số. com/community/tutorials/how-to-set-up-ssh-keys–2. Hay rút gọn là thực hiện câu lệnh

docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
5, nhập vài thông tin là bạn đã có khóa chung (
docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
6) để bỏ lên máy chủ (beta, sản xuất) và khóa riêng (
docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
7) bỏ vào cài đặt biến môi trường