Chúng tôi tạo tác vụ triển khai trong GKE mà không cần plugin, SMS hoặc đăng ký. Chúng ta hãy nhìn qua chiếc áo khoác của Jenkins

Mọi chuyện bắt đầu khi trưởng nhóm của một trong các nhóm phát triển của chúng tôi yêu cầu chúng tôi thử nghiệm ứng dụng mới của họ, ứng dụng này đã được đưa vào container ngày hôm trước. Tôi đã đăng nó. Sau khoảng 20 phút, người ta nhận được yêu cầu cập nhật ứng dụng vì một thứ rất cần thiết đã được thêm vào đó. Tôi đã gia hạn. Sau vài giờ nữa... à, bạn có thể đoán được chuyện gì sẽ xảy ra tiếp theo...

Tôi phải thừa nhận, tôi khá lười biếng (không phải tôi đã thừa nhận điều này sớm hơn sao? Không?), và thực tế là các trưởng nhóm có quyền truy cập vào Jenkins, trong đó chúng tôi có tất cả CI/CD, tôi nghĩ: hãy để anh ấy triển khai như nhiều như anh ấy muốn! Tôi nhớ đến một câu nói đùa: cho một người một con cá và anh ta sẽ ăn trong một ngày; gọi một người là Fed và anh ta sẽ là Fed cả đời. Và đã đi giở trò đồi bại trong công việc, có thể triển khai một vùng chứa ứng dụng của bất kỳ phiên bản nào được xây dựng thành công vào Kuber và chuyển bất kỳ giá trị nào sang nó ENV (ông tôi ngày xưa là nhà ngữ văn, giáo viên tiếng Anh, bây giờ đọc xong câu này sẽ chỉ tay vào thái dương và nhìn tôi rất biểu cảm).

Vì vậy, trong ghi chú này tôi sẽ cho bạn biết tôi đã học được như thế nào:

  1. Tự động cập nhật các công việc trong Jenkins từ chính công việc đó hoặc từ các công việc khác;
  2. Kết nối với bảng điều khiển đám mây (Cloud shell) từ một nút đã cài đặt tác nhân Jenkins;
  3. Triển khai khối lượng công việc lên Google Kubernetes Engine.


Tất nhiên, trên thực tế, tôi có phần không thành thật. Giả định rằng bạn có ít nhất một phần cơ sở hạ tầng trên đám mây của Google và do đó, bạn là người dùng của nó và tất nhiên, bạn có tài khoản GCP. Nhưng đó không phải là nội dung của ghi chú này.

Đây là bảng cheat tiếp theo của tôi. Tôi chỉ muốn viết những ghi chú như vậy trong một trường hợp: Tôi gặp phải một vấn đề, ban đầu tôi không biết cách giải quyết, giải pháp không được tìm kiếm sẵn trên Google nên tôi đã tìm kiếm trên Google từng phần và cuối cùng đã giải quyết được vấn đề. Và để sau này, khi tôi quên mất mình đã làm như thế nào, tôi không cần phải google lại mọi thứ từng mảnh và biên soạn lại với nhau, tôi tự viết cho mình những tờ cheat như vậy.

Disclaimer: 1. Lời nhắn được viết “cho chính tôi”, cho vai diễn thực hành tốt nhất không áp dụng. Tôi rất vui khi đọc được tùy chọn “sẽ tốt hơn nếu làm theo cách này” trong phần bình luận.
2. Nếu phần áp dụng của ghi chú được coi là muối, thì giống như tất cả các ghi chú trước đây của tôi, phần ghi chú này là dung dịch muối yếu.

Tự động cập nhật cài đặt công việc trong Jenkins

Tôi thấy trước câu hỏi của bạn: cập nhật công việc động có liên quan gì đến nó? Nhập giá trị của tham số chuỗi theo cách thủ công và bạn có thể bắt đầu!

Tôi trả lời: Tôi thực sự lười biếng, tôi không thích khi họ phàn nàn: Misha, việc triển khai đang gặp trục trặc, mọi thứ đều biến mất! Bạn bắt đầu tìm kiếm và có lỗi đánh máy trong giá trị của một số tham số khởi chạy tác vụ. Vì vậy, tôi thích làm mọi thứ hiệu quả nhất có thể. Nếu có thể ngăn người dùng nhập dữ liệu trực tiếp bằng cách đưa ra danh sách các giá trị để chọn thì tôi sẽ tổ chức lựa chọn.

Kế hoạch là thế này: chúng tôi tạo một công việc trong Jenkins, trong đó, trước khi khởi chạy, chúng tôi có thể chọn một phiên bản từ danh sách, chỉ định giá trị cho các tham số được truyền đến vùng chứa thông qua ENV, sau đó nó thu thập vùng chứa và đẩy nó vào Sổ đăng ký vùng chứa. Sau đó, từ đó container được khởi chạy trong khối lập phương như khối lượng công việc với các thông số được chỉ định trong công việc.

Chúng tôi sẽ không xem xét quá trình tạo và thiết lập công việc ở Jenkins, điều này lạc đề. Chúng tôi sẽ cho rằng nhiệm vụ đã sẵn sàng. Để triển khai danh sách cập nhật với các phiên bản, chúng tôi cần hai thứ: danh sách nguồn hiện có với số phiên bản hợp lệ ưu tiên và một biến như Tham số lựa chọn trong nhiệm vụ. Trong ví dụ của chúng tôi, hãy đặt tên biến BUILD_VERSION, chúng tôi sẽ không nói chi tiết về nó. Nhưng chúng ta hãy xem xét kỹ hơn danh sách nguồn.

Không có nhiều lựa chọn. Hai điều ngay lập tức hiện lên trong đầu tôi:

  • Sử dụng API truy cập từ xa mà Jenkins cung cấp cho người dùng;
  • Yêu cầu nội dung của thư mục kho lưu trữ từ xa (trong trường hợp của chúng tôi đây là JFrog Artifactory, điều này không quan trọng).

API truy cập từ xa Jenkins

Theo truyền thống tốt đẹp đã được thiết lập, tôi muốn tránh những lời giải thích dài dòng.
Tôi sẽ chỉ cho phép mình dịch miễn phí một đoạn của đoạn đầu tiên trang đầu tiên của tài liệu API:

Jenkins cung cấp một API để máy có thể truy cập từ xa vào chức năng của nó. <…> Quyền truy cập từ xa được cung cấp theo kiểu giống REST. Điều này có nghĩa là không có một điểm truy cập duy nhất cho tất cả các tính năng mà thay vào đó là một URL như ".../api/", Ở đâu "..." nghĩa là đối tượng được áp dụng các khả năng của API.

Nói cách khác, nếu tác vụ triển khai mà chúng ta đang nói đến có sẵn tại http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, thì các còi API cho tác vụ này có sẵn tại http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

Tiếp theo, chúng ta có quyền lựa chọn hình thức nhận đầu ra. Hãy tập trung vào XML vì API chỉ cho phép lọc trong trường hợp này.

Hãy thử lấy danh sách tất cả các công việc. Chúng tôi chỉ quan tâm đến tên hội (tên hiển thị) và kết quả của nó (kết quả):

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]

Nó có hoạt động không?

Bây giờ, hãy chỉ lọc những lần chạy có kết quả SỰ THÀNH CÔNG. Hãy sử dụng lập luận &loại trừ và như một tham số, chúng ta sẽ chuyển cho nó đường dẫn đến một giá trị không bằng SỰ THÀNH CÔNG. Vâng vâng. Một phủ định kép là một tuyên bố. Chúng tôi loại trừ mọi thứ mà chúng tôi không quan tâm:

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result!='SUCCESS']

Ảnh chụp màn hình danh sách thành công
Chúng tôi tạo tác vụ triển khai trong GKE mà không cần plugin, SMS hoặc đăng ký. Chúng ta hãy nhìn qua chiếc áo khoác của Jenkins

Chà, để cho vui thôi, hãy đảm bảo rằng bộ lọc không lừa dối chúng ta (bộ lọc không bao giờ nói dối!) và hiển thị danh sách những bộ lọc “không thành công”:

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result='SUCCESS']

Ảnh chụp màn hình danh sách không thành công
Chúng tôi tạo tác vụ triển khai trong GKE mà không cần plugin, SMS hoặc đăng ký. Chúng ta hãy nhìn qua chiếc áo khoác của Jenkins

Danh sách các phiên bản từ một thư mục trên máy chủ từ xa

Có cách thứ hai để lấy danh sách các phiên bản. Tôi thích nó hơn cả việc truy cập API Jenkins. Chà, bởi vì nếu ứng dụng được xây dựng thành công, điều đó có nghĩa là nó đã được đóng gói và đặt vào kho lưu trữ trong thư mục thích hợp. Giống như kho lưu trữ là nơi lưu trữ mặc định của các phiên bản ứng dụng đang hoạt động. Giống. Chà, hãy hỏi anh ấy xem phiên bản nào đang được lưu trữ. Chúng ta sẽ cuộn tròn, grep và awk thư mục từ xa. Nếu ai quan tâm đến oneliner thì nó nằm ở phần spoiler.

Lệnh một dòng
Xin lưu ý hai điều: Tôi chuyển chi tiết kết nối vào tiêu đề và tôi không cần tất cả các phiên bản từ thư mục và tôi chỉ chọn những phiên bản được tạo trong vòng một tháng. Chỉnh sửa lệnh cho phù hợp với thực tế và nhu cầu của bạn:

curl -H "X-JFrog-Art-Api:VeryLongAPIKey" -s http://arts.myre.po/artifactory/awesomeapp/ | sed 's/a href=//' | grep "$(date +%b)-$(date +%Y)|$(date +%b --date='-1 month')-$(date +%Y)" | awk '{print $1}' | grep -oP '>K[^/]+' )

Thiết lập công việc và file cấu hình công việc trong Jenkins

Chúng tôi đã tìm ra nguồn gốc của danh sách các phiên bản. Bây giờ chúng ta hãy kết hợp danh sách kết quả vào nhiệm vụ. Đối với tôi, giải pháp hiển nhiên là thêm một bước vào nhiệm vụ xây dựng ứng dụng. Bước sẽ được thực hiện nếu kết quả là "thành công".

Mở cài đặt tác vụ lắp ráp và cuộn xuống phía dưới cùng. Bấm vào các nút: Thêm bước xây dựng -> Bước có điều kiện (đơn). Trong cài đặt bước, chọn điều kiện Tình trạng xây dựng hiện tại, đặt giá trị SỰ THÀNH CÔNG, hành động sẽ được thực hiện nếu thành công Chạy lệnh shell.

Và bây giờ là phần thú vị. Jenkins lưu trữ cấu hình công việc trong các tập tin. Ở định dạng XML. Dọc đường http://путь-до-задания/config.xml Theo đó, bạn có thể tải xuống tệp cấu hình, chỉnh sửa nó nếu cần thiết và đặt nó trở lại nơi bạn đã lấy.

Hãy nhớ rằng, chúng ta đã đồng ý ở trên rằng chúng ta sẽ tạo một tham số cho danh sách các phiên bản BUILD_VERSION?

Hãy tải xuống tập tin cấu hình và xem bên trong nó. Chỉ để đảm bảo rằng tham số được đặt đúng chỗ và thuộc loại mong muốn.

Ảnh chụp màn hình dưới spoiler.

Đoạn config.xml của bạn sẽ trông giống nhau. Ngoại trừ việc nội dung của phần tử lựa chọn vẫn bị thiếu
Chúng tôi tạo tác vụ triển khai trong GKE mà không cần plugin, SMS hoặc đăng ký. Chúng ta hãy nhìn qua chiếc áo khoác của Jenkins

Bạn có chắc không? Thế là xong, hãy viết một đoạn script sẽ được thực thi nếu quá trình xây dựng thành công.
Tập lệnh sẽ nhận danh sách các phiên bản, tải xuống tệp cấu hình, ghi danh sách các phiên bản vào nơi chúng ta cần, sau đó đặt lại. Đúng. Đúng rồi. Viết danh sách các phiên bản bằng XML ở nơi đã có danh sách các phiên bản (sẽ có trong tương lai, sau lần ra mắt tập lệnh đầu tiên). Tôi biết trên thế giới vẫn có những người hâm mộ cuồng nhiệt các biểu thức thông thường. Tôi không thuộc về họ. Xin vui lòng cài đặt xmlstarler đến máy nơi cấu hình sẽ được chỉnh sửa. Tôi không nghĩ rằng việc tránh chỉnh sửa XML bằng sed là một cái giá quá lớn.

Trong phần giới thiệu, tôi trình bày đoạn mã thực hiện toàn bộ trình tự trên.

Viết danh sách các phiên bản từ một thư mục trên máy chủ từ xa vào cấu hình

#!/bin/bash
############## Скачиваем конфиг
curl -X GET -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml -o appConfig.xml

############## Удаляем и заново создаем xml-элемент для списка версий
xmlstarlet ed --inplace -d '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' appConfig.xml

xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]' --type elem -n a appConfig.xml

xmlstarlet ed --inplace --insert '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a' --type attr -n class -v string-array appConfig.xml

############## Читаем в массив список версий из репозитория
readarray -t vers < <( curl -H "X-JFrog-Art-Api:Api:VeryLongAPIKey" -s http://arts.myre.po/artifactory/awesomeapp/ | sed 's/a href=//' | grep "$(date +%b)-$(date +%Y)|$(date +%b --date='-1 month')-$(date +%Y)" | awk '{print $1}' | grep -oP '>K[^/]+' )

############## Пишем массив элемент за элементом в конфиг
printf '%sn' "${vers[@]}" | sort -r | 
                while IFS= read -r line
                do
                    xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' --type elem -n string -v "$line" appConfig.xml
                done

############## Кладем конфиг взад
curl -X POST -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml --data-binary @appConfig.xml

############## Приводим рабочее место в порядок
rm -f appConfig.xml

Nếu bạn thích tùy chọn nhận phiên bản từ Jenkins và bạn cũng lười biếng như tôi, thì bên dưới phần giới thiệu cũng có mã tương tự, nhưng là danh sách từ Jenkins:

Viết danh sách các phiên bản từ Jenkins vào config
Chỉ cần ghi nhớ điều này: tên tập hợp của tôi bao gồm số thứ tự và số phiên bản, được phân tách bằng dấu hai chấm. Theo đó, awk cắt bỏ phần không cần thiết. Đối với chính bạn, hãy thay đổi dòng này cho phù hợp với nhu cầu của bạn.

#!/bin/bash
############## Скачиваем конфиг
curl -X GET -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml -o appConfig.xml

############## Удаляем и заново создаем xml-элемент для списка версий
xmlstarlet ed --inplace -d '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' appConfig.xml

xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]' --type elem -n a appConfig.xml

xmlstarlet ed --inplace --insert '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a' --type attr -n class -v string-array appConfig.xml

############## Пишем в файл список версий из Jenkins
curl -g -X GET -u username:apiKey 'http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result!=%22SUCCESS%22]&pretty=true' -o builds.xml

############## Читаем в массив список версий из XML
readarray vers < <(xmlstarlet sel -t -v "freeStyleProject/allBuild/displayName" builds.xml | awk -F":" '{print $2}')

############## Пишем массив элемент за элементом в конфиг
printf '%sn' "${vers[@]}" | sort -r | 
                while IFS= read -r line
                do
                    xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' --type elem -n string -v "$line" appConfig.xml
                done

############## Кладем конфиг взад
curl -X POST -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml --data-binary @appConfig.xml

############## Приводим рабочее место в порядок
rm -f appConfig.xml

Về lý thuyết, nếu bạn đã kiểm tra mã được viết dựa trên các ví dụ trên, thì trong tác vụ triển khai, bạn sẽ có sẵn danh sách thả xuống với các phiên bản. Nó giống như trong ảnh chụp màn hình bên dưới spoiler.

Danh sách các phiên bản được hoàn thành chính xác
Chúng tôi tạo tác vụ triển khai trong GKE mà không cần plugin, SMS hoặc đăng ký. Chúng ta hãy nhìn qua chiếc áo khoác của Jenkins

Nếu mọi thứ đều hoạt động, hãy sao chép-dán tập lệnh vào Chạy lệnh shell và lưu các thay đổi.

Kết nối với Cloud Shell

Chúng tôi có người thu gom trong container. Chúng tôi sử dụng Ansible làm công cụ phân phối ứng dụng và trình quản lý cấu hình. Theo đó, khi nói đến việc xây dựng các thùng chứa, bạn sẽ nghĩ đến ba tùy chọn: cài đặt Docker trong Docker, cài đặt Docker trên máy chạy Ansible hoặc xây dựng các thùng chứa trong bảng điều khiển đám mây. Chúng tôi đồng ý giữ im lặng về các plugin dành cho Jenkins trong ghi chú này. Nhớ?

Tôi quyết định: à, vì các thùng chứa “có thể dùng ngay” có thể được thu thập trong bảng điều khiển đám mây, vậy thì tại sao phải bận tâm? Giữ nó sạch sẽ, phải không? Tôi muốn thu thập các thùng chứa Jenkins trong bảng điều khiển đám mây rồi khởi chạy chúng vào khối lập phương từ đó. Hơn nữa, Google có các kênh rất phong phú trong cơ sở hạ tầng của mình, điều này sẽ có tác động có lợi đến tốc độ triển khai.

Để kết nối với bảng điều khiển đám mây, bạn cần hai thứ: gcloud và quyền truy cập vào Google Cloud API đối với phiên bản VM mà kết nối tương tự này sẽ được thực hiện.

Dành cho những người dự định kết nối hoàn toàn không phải từ Google Cloud
Google cho phép khả năng vô hiệu hóa ủy quyền tương tác trong các dịch vụ của mình. Điều này sẽ cho phép bạn kết nối với bảng điều khiển ngay cả từ máy pha cà phê, nếu nó đang chạy *nix và có bảng điều khiển.

Nếu tôi cần trình bày vấn đề này chi tiết hơn trong khuôn khổ ghi chú này, hãy viết bình luận. Nếu chúng tôi nhận được đủ phiếu bầu, tôi sẽ viết bài cập nhật về chủ đề này.

Cách dễ nhất để cấp quyền là thông qua giao diện web.

  1. Dừng phiên bản VM mà sau đó bạn sẽ kết nối với bảng điều khiển đám mây.
  2. Mở Chi tiết phiên bản và nhấp vào Thay đổi.
  3. Ở cuối trang, chọn phạm vi truy cập phiên bản Toàn quyền truy cập vào tất cả các API đám mây.

    Ảnh chụp màn hình
    Chúng tôi tạo tác vụ triển khai trong GKE mà không cần plugin, SMS hoặc đăng ký. Chúng ta hãy nhìn qua chiếc áo khoác của Jenkins

  4. Lưu các thay đổi của bạn và khởi chạy phiên bản.

Sau khi VM tải xong, hãy kết nối với nó qua SSH và đảm bảo rằng kết nối diễn ra không có lỗi. Sử dụng lệnh:

gcloud alpha cloud-shell ssh

Kết nối thành công trông giống như thế này
Chúng tôi tạo tác vụ triển khai trong GKE mà không cần plugin, SMS hoặc đăng ký. Chúng ta hãy nhìn qua chiếc áo khoác của Jenkins

Triển khai tới GKE

Vì chúng tôi đang cố gắng bằng mọi cách có thể để chuyển hoàn toàn sang IaC (Cơ sở hạ tầng dưới dạng Mã), các tệp docker của chúng tôi được lưu trữ trong Git. Đây là một mặt. Và việc triển khai trong kubernetes được mô tả bằng tệp yaml, tệp này chỉ được sử dụng bởi tác vụ này, bản thân tệp này cũng giống như mã. Đây là từ phía bên kia. Nói chung, ý tôi là, kế hoạch là thế này:

  1. Chúng tôi lấy giá trị của các biến BUILD_VERSION và, tùy chọn, giá trị của các biến sẽ được chuyển qua ENV.
  2. Tải xuống dockerfile từ Git.
  3. Tạo yaml để triển khai.
  4. Chúng tôi tải cả hai tệp này lên bảng điều khiển đám mây qua scp.
  5. Chúng tôi xây dựng một vùng chứa ở đó và đẩy nó vào sổ đăng ký Vùng chứa
  6. Chúng tôi áp dụng tệp triển khai tải cho Cuber.

Hãy cụ thể hơn. Một khi chúng tôi bắt đầu nói về ENV, thì giả sử chúng ta cần truyền giá trị của hai tham số: THÔNG SỐ1 и THÔNG SỐ2. Chúng tôi thêm nhiệm vụ triển khai của họ, gõ - Tham số chuỗi.

Ảnh chụp màn hình
Chúng tôi tạo tác vụ triển khai trong GKE mà không cần plugin, SMS hoặc đăng ký. Chúng ta hãy nhìn qua chiếc áo khoác của Jenkins

Chúng tôi sẽ tạo yaml bằng một chuyển hướng đơn giản bỏ lỡ nộp. Tất nhiên, người ta cho rằng bạn có trong dockerfile của mình THÔNG SỐ1 и THÔNG SỐ2tên tải sẽ là ứng dụng tuyệt vời, và thùng chứa đã lắp ráp với ứng dụng của phiên bản được chỉ định nằm trong Đăng ký vùng chứa dọc đường gcr.io/awesomeapp/awesomeapp-$BUILD_VERSIONĐâu $BUILD_VERSION vừa được chọn từ danh sách thả xuống.

Danh sách đội

touch deploy.yaml
echo "apiVersion: apps/v1" >> deploy.yaml
echo "kind: Deployment" >> deploy.yaml
echo "metadata:" >> deploy.yaml
echo "  name: awesomeapp" >> deploy.yaml
echo "spec:" >> deploy.yaml
echo "  replicas: 1" >> deploy.yaml
echo "  selector:" >> deploy.yaml
echo "    matchLabels:" >> deploy.yaml
echo "      run: awesomeapp" >> deploy.yaml
echo "  template:" >> deploy.yaml
echo "    metadata:" >> deploy.yaml
echo "      labels:" >> deploy.yaml
echo "        run: awesomeapp" >> deploy.yaml
echo "    spec:" >> deploy.yaml
echo "      containers:" >> deploy.yaml
echo "      - name: awesomeapp" >> deploy.yaml
echo "        image: gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION:latest" >> deploy.yaml
echo "        env:" >> deploy.yaml
echo "        - name: PARAM1" >> deploy.yaml
echo "          value: $PARAM1" >> deploy.yaml
echo "        - name: PARAM2" >> deploy.yaml
echo "          value: $PARAM2" >> deploy.yaml

Đại lý Jenkins sau khi kết nối sử dụng gcloud alpha cloud-shell ssh chế độ tương tác không khả dụng, vì vậy chúng tôi gửi lệnh tới bảng điều khiển đám mây bằng tham số --yêu cầu.

Chúng tôi xóa thư mục chính trong bảng điều khiển đám mây khỏi dockerfile cũ:

gcloud alpha cloud-shell ssh --command="rm -f Dockerfile"

Đặt dockerfile mới tải xuống vào thư mục chính của bảng điều khiển đám mây bằng scp:

gcloud alpha cloud-shell scp localhost:./Dockerfile cloudshell:~

Chúng tôi thu thập, gắn thẻ và đẩy vùng chứa vào sổ đăng ký Vùng chứa:

gcloud alpha cloud-shell ssh --command="docker build -t awesomeapp-$BUILD_VERSION ./ --build-arg BUILD_VERSION=$BUILD_VERSION --no-cache"
gcloud alpha cloud-shell ssh --command="docker tag awesomeapp-$BUILD_VERSION gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION"
gcloud alpha cloud-shell ssh --command="docker push gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION"

Chúng ta làm tương tự với file triển khai. Xin lưu ý rằng các lệnh bên dưới sử dụng tên hư cấu của cụm nơi triển khai diễn ra (cụm awsm) và tên dự án (dự án tuyệt vời), nơi đặt cụm.

gcloud alpha cloud-shell ssh --command="rm -f deploy.yaml"
gcloud alpha cloud-shell scp localhost:./deploy.yaml cloudshell:~
gcloud alpha cloud-shell ssh --command="gcloud container clusters get-credentials awsm-cluster --zone us-central1-c --project awesome-project && 
kubectl apply -f deploy.yaml"

Chúng tôi chạy tác vụ, mở đầu ra của bàn điều khiển và hy vọng thấy quá trình lắp ráp container thành công.

Ảnh chụp màn hình
Chúng tôi tạo tác vụ triển khai trong GKE mà không cần plugin, SMS hoặc đăng ký. Chúng ta hãy nhìn qua chiếc áo khoác của Jenkins

Và sau đó là việc triển khai thành công container đã lắp ráp

Ảnh chụp màn hình
Chúng tôi tạo tác vụ triển khai trong GKE mà không cần plugin, SMS hoặc đăng ký. Chúng ta hãy nhìn qua chiếc áo khoác của Jenkins

Tôi cố tình bỏ qua cài đặt Sự đi vào. Vì một lý do đơn giản: một khi bạn thiết lập nó khối lượng công việc với một tên nhất định, nó sẽ vẫn hoạt động, bất kể bạn thực hiện bao nhiêu lần triển khai với tên này. Chà, nói chung, điều này hơi vượt quá phạm vi lịch sử một chút.

Thay vì kết luận

Tất cả các bước trên có lẽ không thể thực hiện được mà chỉ cần cài đặt một số plugin cho Jenkins, muuulion của họ. Nhưng vì lý do nào đó tôi không thích plugin. Chà, chính xác hơn, tôi dùng đến chúng chỉ vì tuyệt vọng.

Và tôi chỉ muốn chọn một số chủ đề mới cho tôi. Đoạn văn trên cũng là một cách để chia sẻ những phát hiện mà tôi đã đạt được khi giải quyết vấn đề được mô tả ở phần đầu. Hãy chia sẻ với những người, giống như anh ấy, hoàn toàn không phải là một con sói tàn ác trong giới sùng đạo. Nếu những phát hiện của tôi giúp ích được ít nhất cho ai đó, tôi sẽ rất vui.

Nguồn: www.habr.com

Thêm một lời nhận xét