継続的デリバリーにより,开放者,チーム,および组织は単にコード更新し,顾客に新闻机构をリリースできます。チームチーム组织がci / cdおよびdevopsプラクティスプラクティス采する,文化が変革れ,これらこれらメリットを実现ますます.ci / cdおよびdevopsののを実装配することによりによりによりにより,チームは,最新闻ツールを活,信誉,で,でを,テスト,ソフトウェアをます。

Infrastructure as code(IaC)を使用すると、チームは、コード内でクラウドリソースを静的に定義および宣言し、コードからこれらのクラウドリソースをデプロイして、動的に維持でき、これらのリソースを簡単に管理できます。このブログでは、CI/CD パイプライン内で IaC を実装する方法について説明します。このブログでは、CircleCI のパートナーであるPulumiのorb.をパイプラインに実装配方法もも明します。このorbは,アプリケーションアプリケーション定义し,谷歌Kubernetes引擎(GKE)クラスタクラスタデプロイします.pulumiは,このブログで说明するiacコンポーネントを提供します。

前提条件

このブログは,gitリポジトリがすでに,GitHub.でホスティングされていることを前提としています。ここで提供しているコードサンプルは、プロジェクトのリポジトリ内のディレクトリに配置する必要があります。

使

このこのでは,以以について基本的な理念をしているも前提とています。

Pulumiのセットアップ

Pulumiをを使使と,开発者は自分の好き言语できます。ファーストクラス言语言语を使を,抽象化解再利用が可になります.pulumiは.pulumiは,すべての主要なクラウドプロバイダー(azure,gcpなど)に対応するローレベルの定义定义に加入て,ハイレベルのクラウドパッケージを提供ており,1つのシステムをマスターするで,これらのすべてのににデリバリーようになり。

pulしたアプリケーションで,pulumiアプリを配置する新闻ディレクトリを作物成し。

mkdir -p pulumi / gke cd pulumi / gke

次に,普拉姆アカウントと谷歌云cloudにサインアップします(サインアップをしたことがないない合)。

新しい普鲁米プロジェクトを作成すると、Pulumi / GKE.ディレクトリに次の3つのファイルが作物成されます。

  • Pulumi.yaml.-プロジェクトに関するメタデータを指定します。
  • Pulumi。<スタック名> .yaml- 寿命しスタックのののののれれれれれれは,新しいpulumiプロジェクトプロジェクト作物作物するにに必要ありありに置き换えるがあり。普鲁米.k8s.yamlという名前を付けています。
  • __main__.py.- スタックスタックリソースを定义定义定义するプログラムプログラムは,IAC魔法を実現する場所です。

Pulumi。<スタック名> .yamlファイルを编集し,次のコードを贴り付け。

config: gcp:credentials: ./cicd_demo_gcp_creds.json gcp:project: cicd-workshops gcp:region: us-east1 gcp:zone: us-east1-d gke:name: k8s

__main__.py.ファイルファイル编集し,その内容を次の内容に置き换えます。

import os import pulumi import pulumi_kubernetes from pulumi import ResourceOptions from pulumi_kubernetes.apps.v1 import Deployment from pulumi_kubernetes.core.v1 import Namespace, Pod, Service from pulumi_gcp import container conf = pulumi.Config('gke') gcp_conf = pulumi.Config('gcp') stack_name = conf.require('name') gcp_project = gcp_conf.require('project') gcp_zone = gcp_conf.require('zone') app_name = 'cicd-app' app_label = {'appClass':app_name} cluster_name = app_name image_tag = '' if 'CIRCLE_SHA1' in os.environ: image_tag = os.environ['CIRCLE_SHA1'] else: image_tag = 'latest' docker_image = 'ariv3ra/orb-pulumi-gcp:{0}'.format(image_tag) machine_type = 'g1-small' cluster = container.Cluster( cluster_name, initial_node_count=3, min_master_version='latest', node_version='latest', node_config={ 'machine_type': machine_type, 'oauth_scopes': [ "https://www.googleapis.com/auth/compute", "https://www.googleapis.com/auth/devstorage.read_only", "https://www.googleapis.com/auth/logging.write", "https://www.googleapis.com/auth/monitoring", ], } ) # Set the Kubeconfig file values here def generate_k8_config(master_auth, endpoint, context): config = '''apiVersion: v1 clusters: - cluster: certificate-authority-data: {masterAuth} server: https://{endpoint} name: {context} contexts: - context: cluster: {context} user: {context} name: {context} current-context: {context} kind: Config preferences: {prefs} users: - name: {context} user: auth-provider: config: cmd-args: config config-helper --format=json cmd-path: gcloud expiry-key: '{expToken}' token-key: '{tokenKey}' name: gcp '''.format(masterAuth=master_auth, context=context, endpoint=endpoint, prefs='{}', expToken = '{.credential.token_expiry}', tokenKey='{.credential.access_token}') return config gke_masterAuth = cluster.master_auth['clusterCaCertificate'] gke_endpoint = cluster.endpoint gke_context = gcp_project+'_'+gcp_zone+'_'+cluster_name k8s_config = pulumi.Output.all(gke_masterAuth,gke_endpoint,gke_context).apply(lambda args: generate_k8_config(*args)) cluster_provider = pulumi_kubernetes.Provider(cluster_name, kubeconfig=k8s_config) ns = Namespace(cluster_name, __opts__=ResourceOptions(provider=cluster_provider)) gke_deployment = Deployment( app_name, metadata={ 'namespace': ns, 'labels': app_label, }, spec={ 'replicas': 3, 'selector':{'matchLabels': app_label}, 'template':{ 'metadata':{'labels': app_label}, 'spec':{ 'containers':[ { 'name': app_name, 'image': docker_image, 'ports':[{'name': 'port-5000', 'container_port': 5000}] } ] } } }, __opts__=ResourceOptions(provider=cluster_provider) ) deploy_name = gke_deployment gke_service = Service( app_name, metadata={ 'namespace': ns, 'labels': app_label, }, spec={ 'type': "LoadBalancer", 'ports': [{'port': 80, 'target_port': 5000}], 'selector': app_label, }, __opts__=ResourceOptions(provider=cluster_provider) ) pulumi.export("kubeconfig", k8s_config) pulumi.export("app_endpoint_ip", gke_service.status['load_balancer']['ingress'][0]['ip'])

__main__.py.ファイルのコンテンツは,パイプラインからデプロイするgkeクラスタとインフラストラクチャをを指定ししますとアプリケーションアプリケーションはしますerコンテナをを介してポッドアプリケーションを実するするするするするするするするするするするするするするするするするするノードノードノードノードノードノードノードノードノードノードノードのノードノード作作作しし,さまざまさまざまなコンピュートノードノードのアクティブなerコンテナににトラフィックを均等ルーティングするするロードバランサーリソースソースももルーティングするロードロードソースソースもます.pulumi pythonアプリのについてについてはこのサイトををください。

谷歌云のセットアップ

このセクションでは,必要となるgcp认证认证认证ししし。

GCPプロジェクトの作作

新しいアカウントに対して,デフォルトのプロジェクトが设定されれ単単にティアダウンにに,新しいプロジェクトを作品成して个别にしおくことお勧めますますますします。プロジェクトプロジェクト作物プロジェクトidを必ずコピーしおきます(このidは,プロジェクト名とは异なります)。

如何查找您的项目ID。

プロジェクト认证情iciticalのの

次に,普鲁米がGCPプロジェクトのリソースを作物およびサービスのキーを设定サービスアカウント移キーます设定サービスに移します。,[キーキーの]として[json]を选択して,[作物]ををします。この.JSON.ファイルをPulumi / GKE.フォルダに保存します。

セキュリティ上の重要な注意:ファイル名をcicd_demo_gcp_creds.json.に変更し,谷歌云の认证情情githubパブリックリポジトリに公开されないようにします。さらに,このプロジェクトの.gitignore.ファイルに认证情情.JSON.ファイル名を追加できますファイルファイルのデータには非常に慎重に扱ってててこのファイルデータ公开扱っれるれるとと使者がこの情れるれる使してアカウントにログインログインし作物谷物云アカウントなり额増大大する恐れますますありあり能能能能と

circleciのセットアップ

次に,普拉姆をci / cdパイプラインパイプラインにするためにcircleciとパイプラインコンフィグファイルをを成する必要がますます。

谷歌サービスアカウントファイルのエンコード

サービスアカウントファイルをBase64.でエンコードしたデータをcircleciの環境変数としてとして保存する必要がありありでで次のコマンドをを実て値をエンコードしして値をエンコードしししを取得をエンコードし

base64 cicd_demo_gcp_creds.json.

このこのコマンドの结果结果は次ようになりなりのようになり

ewogICJ0eXBlIjogInNlcnZpY2VfYWNjb3VudCIsCiAgInByb2plY3RfaWQiOiAiY2ljZC13b3Jrc2hvcHMiLAogICJwcml2YXRlX2tleV9pZCI6ICJiYTFmZDAwOThkNTE1ZTE0NzE3ZjE4NTVlOTY1NmViMTUwNDM4YTQ4IiwKICAicHJpdmF0ZV9rZXkiOiAiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXG5NSUlFdlFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLY3dnZ1NqQWdFQUFvSUJBUURjT1JuRXFla3F4WUlTXG5UcHFlYkxUbWdWT3VzQkY5NTE1YkhmYWNCVlcyZ2lYWjNQeFFBMFlhK2RrYjdOTFRXV1ZoRDZzcFFwWDBxY2l6XG5GdjFZekRJbXkxMCtHYnlUNWFNV2RjTWw3ZlI2TmhZay9FeXEwNlc3U0FhV0ZnSlJkZjU4U0xWcC8yS1pBbjZ6XG5BTVdHZjM5RWxSNlhDaENmZUNNWXorQmlZd29ya3Nob3BzLmlhbS5nc2VydmljZWFjY291bnQuY29tIgp9Cg ==

次のセクションで使使,结果をクリップボードにコピーます。

プロジェクト函数の作物

この CI/CD パイプラインが GCP でコマンドを実行するためには、CircleCI でプロジェクトレベルの环境数をを成する必要がますます。

CIRCLECIダッシュボードを使て,次のプロジェクトレベルの环境环境を作物

  • $ docker_login.= Docker Hubの名名
  • $DOCKER_PWD= docker hubのパスワード
  • $GOOGLE_CLOUD_KEYS=前前のセクションbase64でエンコードした结果
  • $PULUMI_ACCESS_TOKEN= Pulumiダッシュダッシュボードからアクセストークン生成しし。

Pulumiを含有CI / CDパイプライン

これで,pulumiアプリアプリcircleciのconfig.yml.ファイルに融合するするために必要なすべての要素を准ましましましましできましましconfig.yml.を编集し,次のコンフィグをファイルにます。このconfig.yaml.の内容は,デモとプレゼンテーションで使使用するのpythonプロジェクトににであるため,お使いのプロジェクトのconfig.yml.とと异なります。详细详细なサンプルプロジェクトについては,こちらのgithubレポジトリを参照参照てくださいください。どのようなな定理がわれているのがてになるに,このコンフィグサンプルのの,このコンフィグのpulumi结合の重要分について,详しく详しく明します。

版本:2.1 Orbs:pulumi:pulumi/pulumi@1.0.1作业:build_test:docker: - 图片:circleci / python:3.7.2环境:pipenv_venv_in_project:'true'步骤: -  checkout  - 运行:name:name:安装python依赖项命令:|pipenv安装 -  skip-lock  - 运行:名称:运行测试命令:|pipenv运行pytest build_push_image:docker: - 图片:circleci / python:3.7.2步骤: -  checkout  -  setup_remote_docker:docker_layer_caching:false  - 运行:名称:build和push docker图像命令:|pipenv安装 -  skip-lock pipenv运行pyinstaller -f hello_world.py echo'导出标记= $ {circle_sha1}'>> $ bash_env echo'export image_name = Orb-pulumi-gcp'>> $ bash_env源$ bash_env docker build  -t $ docker_login / $ image_name -t $ docker_login / $ image_name:$标签。echo $ docker_pwd |Docker登录-u $ docker_login --password-stdin docker推送$ docker_login / $ image_name deploy_to_gcp:docker: - 图片:circleci / python:3.7.2环境:cloudsdk_python:'/usr/bin/python2.7'google_sdk_path:'〜/ Google-cloud-sdk /'步骤: - 结帐 -  pulumi / login:access-token:$ {pulumi_access_token}  - 运行:name:安装dependecies命令:|CD〜/ sudo pip安装 -  apgrade pip == 18.0 && pip安装-User pulumi pulumi-gcp pulumi-kubernetes curl -o gcp-cli.tar.gz https://dl.google.com/dl/cloudsdk/频道/ Rapid / Google-cloud-sdk.tar.gz tar -xzvf gcp-cli.tar.gz echo $ {google_cloud_keys} |base64 --decode --ignore-arterber> $ {home} /project/pulumi/gcp/gke/cicd_demo_gcp_creds.json ./google-cloud-sdk/install.sh -quiet echo'导出路径= $ path:〜/Google-cloud-sdk / bin'>> $ bash_env源$ bash_env gcloud auth activate-service-帐户--key-file $ {home} /project/pulumi/gcp/gke/cicd_demo_gcp_creds.json-  Pulumi /更新:堆栈:K8S Working_Directory:$ {home} / project / pulumi / gcp / gke /workflows: build_test_deploy: jobs: - build_test - build_push_image: requires: - build_test - deploy_to_gcp: requires: - build_push_image

pul次コードスニペット,普拉姆,普拉姆がががこのパイプラインでで使れることををししし

版本:2.1 Orbs:pulumi:pulumi/pulumi@1.0.1

サンプルパイプラインの职位:キーには、3 つの個別のジョブが定義されています。

  • build_test.:このこのジョブ,アプリケーションの単体テストを行しし。

  • build_push_image.:このジョブは,通讯,プロジェクトリポジトリプロジェクトリポジトリ共存するdockerfileに基础て新闻Dockerイメージをビルドします。

  • deploy_to_gcp.:このこのは,普拉姆orを介してててクラスタにします。

ここでは,build_push_image.およびdeploy_to_gcp.ジョブジョブについて详しく见见ていきましょましょ

build_push_image:

build_push_image:docker: - 图片:circleci / python:3.7.2步骤: -  checkout  -  setup_remote_docker:docker_layer_caching:false  - 运行:名称:名称:build和push docker图像命令:pipenv安装 -  skip-lock pipenv运行pyinstaller -f hello_world.py echo'导出标记= $ {circle_sha1}'>> $ bash_env echo'export image_name = Orb-pulumi-gcp'>> $ bash_env源$ bash_env docker build  -t $ docker_login / $ image_name -t $ docker_login / $ image_name:$标签。echo $ docker_pwd |Docker登录-u $ docker_login --password-stdin docker推送$ docker_login / $ image_name

アプリケーションがテストされ正式パスすると,build_push_image.次に,このアプリケーションに単れますに,プロジェクトのリポジトリにあるdockerfile.に基础て,新しい码头イメージをビルドするDocker建立コマンドを実行します。このジョブは既存の环境环境使しが,一道守靠近を指定ために使さののののののますますしこのしdockerfile.をを下にます。

来自Python:3.7.2运行mkdir / opt / hello_world / workdir / opt / hello_world / copt dist / hello_world / opt / hello_world /公开80 cmd [“./hello_world”]

Docker推送コマンドにより,新闻ビルドされ守码头イメージがdocker hubにアップロードおよび保管され,今后取得できるようになり。

deploy_to_gcp:

deploy_to_gcp:docker: - 图片:circleci / python:3.7.2环境:cloudsdk_python:'/usr/bin/python2.7'google_sdk_path:'〜/ google-cloud-sdk /'步骤: -  checkout  -  pulumi / login:访问-Token:$ {pulumi_access_token}  - 运行:name:安装依赖项命令:|CD〜/ sudo pip安装 -  apgrade pip == 18.0 && pip安装-User pulumi pulumi-gcp pulumi-kubernetes curl -o gcp-cli.tar.gz https://dl.google.com/dl/cloudsdk/频道/ Rapid / Google-cloud-sdk.tar.gz tar -xzvf gcp-cli.tar.gz echo $ {google_cloud_keys} |base64 --decode --ignore-arterber> $ {home} /project/pulumi/gcp/gke/cicd_demo_gcp_creds.json ./google-cloud-sdk/install.sh -quiet echo'导出路径= $ path:〜/Google-cloud-sdk / bin'>> $ bash_env源$ bash_env gcloud auth activate-service-帐户--key-file $ {home} /project/pulumi/gcp/gke/cicd_demo_gcp_creds.json-  Pulumi /更新:堆栈:K8S Working_Directory:$ {home} / project / pulumi / gcp / gke /

上记で指定したdeploy_to_gcp:ジョブは,普鲁米,普拉姆アプリとorbをを使用し,gcpで新闻gkeを実际に立ち上げるのでです,以deploy_to_gcp:ジョブについて简义にに明します。

-Pulumi / login.访问令牌$ {pulumi_access_token}

上记ののコード,pulumi orbの登录:コマンドコマンドの仕様と実実を示してい访问 - 令牌:パラメーターには、CircleCI ダッシュボードで設定した$ {pulumi_access_token}环境环境数が渡されます。

curl -o gcp-cli.tar.gz https://dl.google.com/dl/cloudsdk/channels/rapid/google-cloud-sdk.tar.gz tar -xzvf gcp-cli.tar.gz Echo $ {google_cloud_keys} |base64 --decode --ignore-arterber> $ {home} /project/pulumi/gcp/gke/cicd_demo_gcp_creds.json ./google-cloud-sdk/install.sh -quiet echo'导出路径= $ path:〜/Google-cloud-sdk / bin'>> $ bash_env源$ bash_env gcloud auth activate-service-帐户--key-file $ {home} /project/pulumi/gcp/gke/cicd_demo_gcp_creds.json

上游のコマンドは,谷歌云sdkをダウンロードしししてインストールますし。このsdkは,gcpでgkeクラスタ作作作者:王莹,GCP丨GCK】最初の2行,SDKををダウンロードして解冻ししし変更変更するために必要をを変更変更するために必要ををおよびecho $ {google_cloud_keys} |base64 --decode ...コマンドは,$ {google_cloud_keys}环境环境数ををデコード,cicd_gcp_creds.json.にデコードしたコンテンツを入力します。このファイルは、Pulumi アプリプロジェクトのディレクトリに存在する必要があります。この特定の跑:ブロックブロックのコマンドの残り残りは,sdkをインストールし。最后最后行は,cicd_demo_gcp_creds.json.ファイルからgcpにアクセスするサービスをを可します。

-  Pulumi /更新:堆栈:K8S Working_Directory:$ {home} / project / pulumi / gcp / gke /

上记ののコード,pulumi orbの更新:,GCP上の新闻GKEクラスタクラスタへのアプリケーションののデプロイを始のしのデプロイを始のしPulumi /更新:コマンドは,堆栈:およびWorking_Directory:パラメーターパラメーター表示ます。これらこれらのパラメーター,pulumiスタックの名前普鲁米プロジェクトプロジェクトとしてとしてさたディレクトリへのパスを示しますファイルお使い示します。Working_Directory:は,上记のコードサンプルとは异なります。

结论

このこのでは,基础设施作为代码(IAC)ソリューションをCI / CDパイプラインににしするましましまた说说しましましでor or or or ororをor ororををををorするするするましについてももするしましましもも说しましましもも说しましましこれらこれらサンプルをと,ci / cdオートメーションによるiacソリューションソリューション使使コードコードの,テスト,およびデプロイ深く深くのできるできるにます。

CircleCI orbを使用すると,CircleCIコンフィグの記述が簡素化されるため,生産性が向上します。Orbs は共有できるため、作成済みのコマンド、ジョブ、および Executor をコンフィグファイルで使用でき、時間を節約できます。Orbs の使用は CircleCI と GKE のデプロイに限定されません。Orb レジストリで利用可能な Orbs のリストを確認し、クラウドプラットフォーム、プログラミング言語など対応する Orbs を見つけることができます。

详细详细なサンプルプロジェクトについて,こちらこちらgithubレポジトリを参照参照てくださいください。