プラグむン、SMS、登録なしでGKEに展開するタスクをマスタヌしたす。ゞェンキンスのゞャケットの䞋を片目で芗く

それはすべお、開発チヌムの1぀のチヌムリヌダヌがテストモヌドで、前日にコンテナ化された新しいアプリケヌションを公開するように䟝頌したずいう事実から始たりたした。我慢したした。玄20分埌、非垞に必芁な郚分が完成したため、アプリケヌションの曎新芁求を受け取りたした。曎新したした。さらに数時間埌...たあ、あなたは



すでに次に䜕が起こり始めたかを掚枬したす...私は認めなければなりたせん、私はかなり怠惰です私はこれを以前に認めたしたかいいえそしお、チヌムリヌダヌがゞェンキンスにアクセスできるずいう事実を考えるず、私たちはすべおのCI / CDを持っおいるず思いたした圌に奜きなだけ自分自身を展開させおください私は逞話を思い出したした男に魚を䞎えるず、圌はその日は満腹になりたす。満腹の人を呌ぶず、圌は䞀生満腹になりたす。そしお圌は仕事で遊びに行きたした、正垞に組み立おられたバヌゞョンを適甚しおコンテナを展開し、ENV倀を転送するこずができたす私の祖父、哲孊者、過去の英語の教垫は、これを読んだ埌、圌の寺院で指をひねり、私を非垞に衚珟力豊かに芋たす文。



それで、投皿で私がどのように孊んだかに぀いお話したす



  1. Jenkinsのゞョブを、ゞョブ自䜓たたは他のゞョブから動的に曎新したす。
  2. Jenkins゚ヌゞェントがむンストヌルされおいるノヌドからクラりドコン゜ヌルクラりドシェルに接続したす。
  3. ワヌクロヌドをGoogleKubernetesEngineにデプロむしたす。


実際、私はもちろん少し狡猟です。所有しおいるむンフラストラクチャの少なくずも䞀郚がGoogleクラりドにあるず想定されおいるため、ナヌザヌはそのナヌザヌであり、もちろんGCPアカりントを持っおいたす。しかし、メモはそれに぀いおではありたせん。



これは私の次のチヌトシヌトです。そのようなメモを曞きたいのは1぀の堎合だけです。以前に問題が発生し、最初は解決方法がわからず、解決策が完成した圢でグヌグルされおいなかったため、郚分的にグヌグルで怜玢し、最終的に問題を解決したした。そしお、将来、自分のやり方を忘れたずきに、すべおをもう䞀床グヌグルで怜玢しおたずめる必芁がないように、自分でそのようなチヌトシヌトを䜜成したす。

Disclaimer: 1. « », best practice . « » .

2. , , , — .

Jenkins



私はあなたの質問を予芋したす動的な仕事の曎新はそれず䜕の関係がありたすか文字列パラメヌタの倀をハンドルで入力しお先に進みたす



答えは私は本圓に怠け者です、圌らが䞍平を蚀うずき、私はそれが奜きではありたせんミヌシャ、展開はクラッシュしおいたす、すべおがなくなっおいたすあなたは探し始めたす、そしおいく぀かのタスク起動パラメヌタの倀にタむプミスがありたす。したがっお、私は可胜な限り完党にすべおを行うこずを奜みたす。代わりに遞択する倀のリストを指定するこずで、ナヌザヌがデヌタを盎接入力できないようにするこずが可胜な堎合は、遞択を敎理したす。



蚈画は次のずおりですJenkinsでゞョブを䜜成したす。このゞョブでは、起動する前に、リストからバヌゞョンを遞択し、ENVを介しおコンテナに枡されるパラメヌタの倀を指定し、コンテナを収集しおコンテナレゞストリにプッシュするこずができたす。さらにそこから、コンテナはクベラで次のように発売されたすゞョブで指定されたパラメヌタヌを持぀ワヌクロヌド。



Jenkinsでゞョブを䜜成および構成するプロセスに぀いおは考慮したせん。これは、トピックから倖れおいたす。タスクの準備ができおいるず想定したす。曎新可胜なバヌゞョンリストを実装するには、2぀のものが必芁です。事前に有効なバヌゞョン番号を持぀既存の゜ヌスリストず、タスク内のChoiceパラメヌタタむプの倉数です。この䟋では、倉数の名前をBUILD_VERSIONずしたす。これに぀いおは、詳しく説明したせん。しかし、゜ヌスリストを詳しく芋おみたしょう。



それほど倚くのオプションはありたせん。2぀はすぐに私に起こりたした



  • Jenkinsがナヌザヌに提䟛するリモヌトアクセスAPIを䜿甚したす。
  • リモヌトリポゞトリフォルダの内容をク゚リしたすこの堎合、これはJFrog Artifactoryであり、重芁ではありたせん。


JenkinsリモヌトアクセスAPI



確立された玠晎らしい䌝統によれば、私は長い説明を避けたいず思いたす。APIドキュメントの最初のペヌゞの

最初の段萜の䞀郚のみを自由に翻蚳するこずを蚱可したす。

Jenkinsは、その機胜ぞのリモヌトマシン読み取り可胜アクセス甚のAPIを提䟛したす。<...>リモヌトアクセスはRESTのようなスタむルで提䟛されたす。これは、すべおの機胜ぞの単䞀の゚ントリポむントがなく、代わりに「... / api /」のようなURLが䜿甚されるこずを意味したす。ここで、「...」はAPI機胜が適甚されるオブゞェクトです。
぀たり、珟圚話しおいる展開タスクがアドレスhttp://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_buildで利甚できる堎合、このタスクのAPIホむッスルは 次で利甚できたす。出力を受信する圢匏を遞択できたす。この堎合、APIはフィルタリングのみを蚱可するため、XMLに぀いお詳しく芋おいきたしょう。 すべおのゞョブ実行のリストを取埗しおみたしょう。アセンブリ名displayNameずその結果resultのみに関心がありたす。http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/











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


起こりたした



ここで、SUCCESSの結果になる起動のみを陀倖しおみたしょう。exclude匕数を䜿甚し、パラメヌタヌずしおSUCCESSに等しくない倀ぞのパスを枡したす。はいはい。二重吊定は声明です。興味のないものはすべお陀倖したす。



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


成功したリストのスクリヌンショット




さお、自己満足のために、フィルタヌが私たちをだたしおいないこずを確認したしょうフィルタヌは決しお嘘を぀きたせんそしお「倱敗した」もののリストを衚瀺したす



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


倱敗したリストのスクリヌンショット




リモヌトサヌバヌ䞊のフォルダヌからのバヌゞョンのリスト



バヌゞョンのリストを取埗する2番目の方法もありたす。JenkinsAPI呌び出しよりもさらに気に入っおいたす。アプリケヌションが正垞にビルドされた堎合は、パッケヌゞ化されお、リポゞトリの適切なフォルダに配眮されおいるためです。同様に、リポゞトリはデフォルトでアプリケヌションの動䜜バヌゞョンのリポゞトリです。お気に入り。さお、どのバヌゞョンがストレヌゞにあるかを圌に聞いおみたしょう。リモヌトフォルダをcurl、grep、awkしたす。誰かがアンラむナヌに興味があるなら、それはスポむラヌの䞋にありたす。



1行のコマンド
: , , . :



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[^/]+' )




Jenkinsのゞョブセットアップおよびゞョブ構成ファむル



バヌゞョンリストの゜ヌスを敎理したした。結果のリストをタスクにねじ蟌みたしょう。私にずっお明らかな解決策は、アプリケヌション構築ゞョブにステップを远加するこずでした。結果が「成功」の堎合に実行されるステップ。



アセンブリタスク蚭定を開き、䞀番䞋たでスクロヌルしたす。ボタンをクリックしたすビルドステップの远加->条件付きステップシングル。ステップ蚭定で、珟圚のビルドステヌタス条件を遞択し、SUCCESS倀を蚭定したす。これは、シェルの実行コマンドが成功した堎合に実行されるアクションです。



そしお今、楜しい郚分。 Jenkinsはゞョブ構成をファむルに保存したす。 XML圢匏。途䞭でhttp://--/config.xmlしたがっお、構成ファむルをダりンロヌドし、必芁に応じお線集しお、元の堎所に配眮するこずができたす。



䞊蚘で、バヌゞョンリストのBUILD_VERSIONパラメヌタを䜜成するこずに同意したこずを芚えおいたすか



蚭定ファむルをダりンロヌドしお、その䞭を芋おみたしょう。パラメヌタが適切に配眮され、本圓に正しい皮類であるこずを確認するためだけに。



スポむラヌの䞋のスクリヌンショット。



config.xmlスニペットは同じように芋えるはずです。choices芁玠のコンテンツがただ存圚しないこずを陀いお




あなたは確信しおいたすかさお、ビルドが成功した堎合に実行されるスクリプトを䜜成しおいたす。

スクリプトはバヌゞョンのリストを受け取り、構成ファむルをダりンロヌドし、必芁な堎所にバヌゞョンのリストを曞き蟌んでから、元に戻したす。はい。すべおが正しいです。バヌゞョンのリストがすでにある堎所にXMLでバヌゞョンのリストを曞き蟌みたす将来、スクリプトの最初の起動埌になりたす。䞖界にはただ定期的な衚珟を愛する人がいるこずを私は知っおいたす。私は圌らのものではありたせん。蚭定を線集するマシンにxmlstarlerをむンストヌルしおください。これは、sedを䜿甚したXML線集を回避するために支払う倧きな代償ではないように思われたす。



スポむラヌの䞋で、䞊蚘のシヌケンス党䜓を実行するコヌドを匕甚したす。



リモヌトサヌバヌ䞊のフォルダヌからバヌゞョンのリストを構成に曞き蟌みたす
#!/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 '%s\n' "${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




Jenkinsからバヌゞョンを取埗するオプションが奜きで、私ず同じくらい怠惰な堎合は、スポむラヌの䞋で同じコヌドを䜿甚したすが、リストはJenkinsからのものです。



Jenkinsから蚭定にバヌゞョンのリストを曞き蟌みたす
: , . , awk . .



#!/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 '%s\n' "${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




理論的には、䞊蚘の䟋に基づいお蚘述されたコヌドをテストした堎合、展開タスクには、バヌゞョンを含むドロップダりンリストが既に存圚するはずです。これはスポむラヌの䞋のスクリヌンショットのようなものです。



正しく完成したバヌゞョンリスト




すべおが機胜した堎合は、スクリプトをコピヌしお[シェルの実行]コマンドに貌り付け、倉曎を保存したす。



クラりドシェル接続



コレクタヌは私たちのコンテナに入っおいたす。アプリケヌション配信および構成マネヌゞャヌずしおAnsibleを䜿甚したす。したがっお、コンテナの構築に関しおは、DockerをDockerにむンストヌルする、DockerをAnsibleを搭茉したマシンにむンストヌルする、たたはクラりドコン゜ヌルでコンテナを構築するずいう3぀のオプションが思い浮かびたす。この蚘事では、Jenkinsのプラグむンに぀いお黙っおいるこずに同意したした。芚えおいたすか



「箱から出しお」コンテナをクラりドコン゜ヌルで組み立おるこずができるので、なぜ野菜園をフェンスで囲うのでしょうか。枅朔に保っおくださいねクラりドコン゜ヌルでJenkinsを䜿甚しおコンテナを䜜成し、そこからKuberに撃ち蟌みたいず思いたす。さらに、むンフラストラクチャ内には、Googleには非垞に倪いチャネルがあり、展開の速床に有益な効果をもたらしたす。



クラりドコン゜ヌルに接続するには、次の2぀が必芁です。gcloudアクセス暩をGoogleクラりドAPIこの接続が行われたす、そこからVMむンスタンスの。



Googleクラりドからではなく接続するこずを蚈画しおいる人のために
. , *nix' .



, — . — .



暩限を付䞎する最も簡単な方法は、Webむンタヌフェむスを䜿甚するこずです。



  1. 将来、クラりドコン゜ヌルに接続するVMむンスタンスを停止したす。
  2. むンスタンスの詳现を開き、[線集]をクリックしたす。
  3. ペヌゞの䞀番䞋で、むンスタンスアクセススコヌプを遞択したす。すべおのCloudAPIぞのフルアクセス。



    スクリヌンショット


  4. 倉曎を保存しお、むンスタンスを起動したす。


VMの起動が完了したら、SSH経由でVMに接続し、接続が成功するこずを確認したす。次のコマンドを䜿甚したす。



gcloud alpha cloud-shell ssh


成功した接続は次のようになりたす




GKEにデプロむする



IaCInfrastucture as a Codeに完党に切り替えるためにあらゆる方法で努力しおいるため、dockerfileをgitaに保存したす。これは䞀方でです。kubernetesでの展開は、yamlファむルによっお蚘述されたす。このファむルは、このタスクでのみ䜿甚され、それ自䜓もコヌドのようなものです。これは反察偎にありたす。䞀般的に、私は蚈画が次のずおりであるこずを意味したす



  1. BUILD_VERSION倉数の倀を取埗し、オプションで、ENVを介しお枡される倉数の倀を取埗したす。
  2. gitaからdockerfileをダりンロヌドしおいたす。
  3. 展開甚のyamlを生成しおいたす。
  4. これらのファむルの䞡方をscp経由でクラりドコン゜ヌルにアップロヌドしたす。
  5. そこでコンテナを䜜成し、コンテナレゞストリにプッシュしたす
  6. ロヌドデプロむメントファむルをKuberに適甚したす。


もっず具䜓的にしたしょう。ENVに぀いお話しおいるので、PARAM1ずPARAM2の2぀のパラメヌタヌの倀を枡す必芁があるずしたしょう。-展開、タむプのために自分のタスクを远加したす文字列パラメヌタ。



スクリヌンショット




echoをファむルに リダむレクトするだけでyamlを生成したす。もちろん、dockerfileにPARAM1ずPARAM2があり、ロヌド名はawesomeappであり、指定されたバヌゞョンのアプリケヌションでアセンブルされたコンテナヌは、パスgcr.io/awesomeapp/awesomeapp- $ BUILD_VERSIONに沿ったコンテナヌレゞストリにあるず想定されたす。ここで、$ BUILD_VERSIONはちょうどです。ドロップダりンリストから遞択されたした。



リストコマンド
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




gcloud alpha cloud-shell sshを䜿甚しお Jenkins゚ヌゞェントに接続した埌、むンタラクティブモヌドを䜿甚できないため、-commandパラメヌタヌを䜿甚しおクラりドコン゜ヌルにコマンドを送信したす。



叀いdockerfileからクラりドコン゜ヌルのホヌムフォルダを削陀したす。



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


scpを䜿甚しお、新しくダりンロヌドしたdockerfileをクラりドコン゜ヌルのホヌムフォルダヌに配眮したす。



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


コンテナを収集し、タグを付けお、コンテナレゞストリにプッシュしたす。



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"


デプロむメントファむルでも同じこずを行いたす。以䞋のコマンドは、展開が行われおいるクラスタヌの架空の名前awsm-clusterず、クラスタヌが配眮されおいるプロゞェクトの名前awesome-projectを䜿甚しおいるこずに泚意しおください。



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"


タスクを開始し、コン゜ヌル出力を開いお、コンテナヌが正垞にビルドされるこずを確認したす。



スクリヌンショット




そしお、組み立おられたコンテナの展開の成功



スクリヌンショット




Ingressの 蚭定を意図的に無芖したした。単玔な理由の1぀は、特定の名前のワヌクロヌド甚に構成するず、この名前のデプロむメントがいく぀実行されおも、操䜜可胜なたたになりたす。たあ、䞀般的に、これは歎史の範囲を少し超えおいたす。



結論の代わりに



䞊蚘のすべおの手順は、おそらく実行できなかった可胜性がありたすが、Jenkinsのmuuulion甚のプラグむンをむンストヌルするだけでした。しかし、どういうわけか私はプラグむンが奜きではありたせん。たあ、もっず正確に蚀えば、私は絶望からだけ圌らに頌りたす。



そしお、私は私のためにいく぀かの新しいトピックを取り䞊げるのが奜きです。䞊蚘のテキストは、私が行った調査結果を共有する方法でもあり、最初に説明した問題を解決したす。のように、devopsの悲惚なオオカミではない人々ず共有しおください。私の発芋が少なくずも誰かを助けるなら、私は幞せになるでしょう。



All Articles