Mengonfigurasi CI/CD untuk menyimpan konfigurasi sebagai kode Terraform

Tutorial ini menjelaskan cara mengelola infrastruktur sebagai kode dengan Terraform dan Cloud Build menggunakan metodologi GitOps yang populer. Istilah GitOps pertama kali diciptakan oleh Weaveworks, dan konsep utamanya adalah menggunakan repositori Git untuk menyimpan status lingkungan yang Anda inginkan. Terraform adalah alat open source HashiCorp yang memungkinkan Anda membuat, mengubah, dan meningkatkan infrastruktur cloud secara tepat menggunakan kode. Dalam tutorial ini, Anda menggunakan Cloud Build, layanan continuous integration, untuk menerapkan manifes Terraform secara otomatis ke lingkungan Anda. Google Cloud

Tutorial ini ditujukan bagi developer dan operator yang mencari strategi elegan untuk membuat perubahan pada infrastruktur yang dapat diprediksi. Artikel ini mengasumsikan bahwa Anda sudah memahami Google Cloud, dan Linux.

Laporan State of DevOps mengidentifikasi kemampuan yang mendorong performa pengiriman software. Tutorial ini akan membantu Anda dengan kemampuan berikut:

Arsitektur

Tutorial ini menerapkan praktik GitOps untuk mengelola eksekusi Terraform. Perhatikan bahwa metode ini menggunakan cabang Secure Source Manager dev dan prod untuk mewakili lingkungan yang sebenarnya. Lingkungan ini ditentukan oleh jaringan Virtual Private Cloud (VPC) dev dan prod, masing-masing, dalam projectGoogle Cloud .

Proses ini dimulai saat Anda mengirim kode Terraform ke cabang dev atau prod. Dalam skenario ini, Cloud Build akan memicu, lalu menerapkan manifes Terraform untuk mencapai status yang Anda inginkan di lingkungannya masing-masing. Di sisi lain, saat Anda mengirim kode Terraform ke cabang lain—misalnya, ke cabang fitur—Cloud Build akan beroperasi untuk menjalankan terraform plan, tetapi tidak ada yang diterapkan ke lingkungan apa pun.

Idealnya, developer atau operator harus membuat proposal infrastruktur ke cabang pengembangan atau fitur, lalu mengirimkannya melalui permintaan pull. Dengan cara ini, Anda dapat membahas dan meninjau potensi perubahan dengan kolaborator dan menambahkan commit tindak lanjut sebelum perubahan digabungkan ke cabang dasar.

Jika tidak ada masalah yang diajukan, Anda harus menggabungkan perubahan ke cabang dev terlebih dahulu. Penggabungan ini memicu deployment infrastruktur ke lingkungan dev, sehingga Anda dapat menguji lingkungan ini. Setelah menguji dan yakin dengan apa yang di-deploy, Anda harus menggabungkan cabang dev ke cabang prod untuk memicu penginstalan infrastruktur ke lingkungan produksi.

Tujuan

  • Siapkan instance dan repositori Secure Source Manager Anda.
  • Konfigurasi Terraform untuk menyimpan status di bucket Cloud Storage.
  • Berikan izin ke akun layanan Cloud Build Anda.
  • Hubungkan Cloud Build ke repositori Secure Source Manager Anda.
  • Ubah konfigurasi lingkungan Anda di cabang fitur.
  • Dorong perubahan pada lingkungan pengembangan.
  • Mendorong perubahan pada lingkungan produksi.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  7. Di Cloud Shell, dapatkan ID project yang baru saja Anda pilih:
    gcloud config get-value project
    Jika perintah ini tidak menampilkan project ID, konfigurasikan Cloud Shell untuk menggunakan project Anda. Ganti PROJECT_ID dengan project ID Anda.
    gcloud config set project PROJECT_ID
  8. Aktifkan API yang diperlukan:
    gcloud services enable cloudbuild.googleapis.com compute.googleapis.com securesourcemanager.googleapis.com
    Langkah ini mungkin memerlukan waktu beberapa menit hingga selesai.
  9. Jika Anda belum pernah menggunakan Git di Cloud Shell, konfigurasikan dengan nama dan alamat email Anda:
    git config --global user.email "YOUR_EMAIL_ADDRESS"
    git config --global user.name "YOUR_NAME"
    
    Git menggunakan informasi ini untuk mengidentifikasi Anda sebagai penulis commit yang Anda buat di Cloud Shell.
  10. Menyiapkan repositori Secure Source Manager

    Dalam tutorial ini, Anda menggunakan satu repositori Secure Source Manager untuk menentukan infrastruktur cloud. Anda mengorkestrasi infrastruktur ini dengan memiliki cabang yang berbeda yang sesuai dengan lingkungan yang berbeda:

    • Cabang dev berisi perubahan terbaru yang diterapkan ke lingkungan pengembangan.
    • Cabang prod berisi perubahan terbaru yang diterapkan ke lingkungan produksi.
    • Cabang fitur yang mirip dengan feature_x digunakan untuk melakukan perubahan sebelum melakukan push ke cabang dev atau prod.

    Dengan infrastruktur ini, Anda dapat mereferensikan repositori untuk mengetahui konfigurasi yang diharapkan di setiap lingkungan dan mengusulkan perubahan baru dengan menggabungkannya ke dalam lingkungan dev terlebih dahulu. Selanjutnya, promosikan perubahan tersebut dengan menggabungkan cabang dev ke cabang prod berikutnya.

    1. Buat repositori Secure Source Manager kosong - jangan lakukan inisialisasi repositori.
    2. Tambahkan helper autentikasi Secure Source Manager ke git config global Anda dengan menjalankan perintah berikut:

      git config --global credential.'https://*.*.sourcemanager.dev'.helper gcloud.sh
      

      Helper autentikasi menggunakan gcloud CLI untuk mengambil kredensialGoogle Cloud Anda saat menggunakan perintah Git dengan Secure Source Manager.

    3. Untuk melakukan autentikasi ulang setelah penyiapan kredensial awal, jalankan perintah gcloud CLI berikut:

      gcloud auth login
      
    4. Clone repositori solutions-terraform-cloudbuild-gitops ke shell lokal atau lingkungan kerja Anda:

      git clone https://github.com/GoogleCloudPlatform/solutions-terraform-cloudbuild-gitops.git
      
    5. Tambahkan repositori Secure Source Manager Anda sebagai upstream.

      git remote add google HTTPS_REPO_URL
      

      Dengan HTTPS_REP_URL adalah URL HTTPS untuk repositori Secure Source Manager Anda. Anda dapat menemukan URL di bagian atas halaman repositori di antarmuka web Secure Source Manager.

    6. Buat dan beralih ke cabang dev Anda.

      git checkout dev
      
    7. Kirim repositori yang di-clone ke repositori Anda dengan perintah berikut:

      git push -u google --all
      
    8. Ulangi dua langkah sebelumnya untuk cabang prod Anda.

    Kode dalam repositori ini disusun sebagai berikut:

    • Folder environments/ berisi subfolder yang merepresentasikan lingkungan, seperti dev dan prod, yang masing-masing memberikan pemisahan logis antara workload pada berbagai tahap kematangan, pengembangan, dan produksi. Meskipun memiliki lingkungan yang semirip mungkin dengan ini merupakan praktik yang baik, setiap subfolder memiliki konfigurasi Terraform-nya sendiri untuk memastikan bahwa lingkungan tersebut dapat memiliki setelan unik sesuai kebutuhan.

    • Folder modules/ berisi modul Terraform inline. Modul ini mewakili pengelompokan logis resource terkait dan digunakan untuk berbagi kode di berbagai lingkungan.

    • File cloudbuild.yaml adalah file konfigurasi build yang berisi petunjuk untuk Cloud Build, seperti cara menjalankan tugas berdasarkan serangkaian langkah. File ini menentukan eksekusi bersyarat yang bergantung pada cabang yang digunakan Cloud Build untuk mengambil kode, misalnya:

      • Untuk cabang dev dan prod, langkah-langkah berikut dijalankan:

        1. terraform init
        2. terraform plan
        3. terraform apply
      • Untuk cabang lain, langkah-langkah berikut dijalankan:

        1. terraform init untuk semua subfolder environments
        2. terraform plan untuk semua subfolder environments

    Untuk memastikan bahwa perubahan yang diusulkan sesuai untuk setiap lingkungan, terraform init dan terraform plan dijalankan untuk semua subfolder environments. Sebelum menggabungkan permintaan pull, Anda dapat meninjau paket untuk memastikan bahwa, misalnya, akses tidak diberikan kepada entitas yang tidak sah.

    Ubah file konfigurasi build

    Agar file konfigurasi build contoh berfungsi dengan Secure Source Manager, Anda perlu melakukan pengeditan berikut:

    • Tambahkan langkah untuk meng-clone repositori Anda.
    • Tambahkan langkah untuk mendapatkan nama cabang dan tetapkan ke variabel.

    Edit file konfigurasi build di cabang dev:

    1. Pindah ke cabang dev:

      git checkout dev
      
    2. Buka file cloudbuild.yaml dan ganti isinya dengan kode berikut:

      # Copyright 2019 Google LLC
      #
      # Licensed under the Apache License, Version 2.0 (the "License");
      # you may not use this file except in compliance with the License.
      # You may obtain a copy of the License at
      #
      #     https://www.apache.org/licenses/LICENSE-2.0
      #
      # Unless required by applicable law or agreed to in writing, software
      # distributed under the License is distributed on an "AS IS" BASIS,
      # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      # See the License for the specific language governing permissions and
      # limitations under the License.
      
      
      steps:
      - id: 'clone repository'
        name: 'gcr.io/cloud-builders/git'
        args:
        - clone
        - '${_REPO_URL}'
        - .
      - id: 'branch name'
        name: gcr.io/cloud-builders/git
        entrypoint: 'sh'
        args:
        - '-c'
        - |
            branch=$(basename "$_REF")
            git checkout ${branch}
            echo "***********************"
            git branch --show-current
            echo "***********************"
      
      - id: 'tf init'
        name: 'hashicorp/terraform:1.0.0'
        entrypoint: 'sh'
        args:
        - '-c'
        - |
         branch=$(basename "$_REF")
            if [ -d "environments/${branch}/" ]; then
              cd environments/${branch}
              terraform init
            else
              for dir in environments/*/
              do
                cd ${dir}
                env=${dir%*/}
                env=${env#*/}
                echo ""
                echo "*************** TERRAFORM INIT ******************"
                echo "******* At environment: ${env} ********"
                echo "*************************************************"
                terraform init || exit 1
                cd ../../
              done
            fi
      
      - id: 'tf plan'
        name: 'hashicorp/terraform:1.0.0'
        entrypoint: 'sh'
        args:
        - '-c'
        - |
            branch=$(basename "$_REF")
            if [ -d "environments/${branch}/" ]; then
              cd environments/${branch}
              terraform plan
            else
              for dir in environments/*/
              do
                cd ${dir}
                env=${dir%*/}
                env=${env#*/}
                echo ""
                echo "*************** TERRAFOM PLAN ******************"
                echo "******* At environment: ${env} ********"
                echo "*************************************************"
                terraform plan || exit 1
                cd ../../
              done
            fi
      
      - id: 'tf apply'
        name: 'hashicorp/terraform:1.0.0'
        entrypoint: 'sh'
        args:
        - '-c'
        - |
            branch=$(basename "$_REF")
            if [ -d "environments/${branch}/" ]; then
              cd environments/${branch}
              terraform apply -auto-approve
            else
              echo "***************************** SKIPPING APPLYING *******************************"
              echo "Branch '${branch}' does not represent an official environment."
              echo "*******************************************************************************"
            fi
    3. Periksa apakah file telah diubah.

      git status
      
    4. Commit dan kirim perubahan Anda:

      git add --all
      git commit -m "Modify build config file."
      git push google dev
      
    5. Buka permintaan pull untuk mempromosikan perubahan Anda dengan cepat ke cabang prod.

      1. Di antarmuka web Secure Source Manager, buka repositori Anda.
      2. Klik tab Pull requests.
      3. Klik New pull request.
      4. Di kolom merge into:, pilih cabang prod.
      5. Di kolom pull from:, pilih cabang dev.
      6. Tinjau perubahan, lalu klik New pull request.
      7. Klik Create pull request.
      8. Klik Merge pull request.
      9. Klik Merge pull request lagi.

        Perubahan akan digabungkan ke cabang prod Anda.

    Mengonfigurasi Terraform untuk menyimpan status di bucket Cloud Storage

    Secara default, Terraform menyimpan status secara lokal dalam file bernama terraform.tfstate. Konfigurasi default ini dapat menyulitkan tim untuk menggunakan Terraform, terutama ketika banyak pengguna menjalankan Terraform secara bersamaan dan setiap mesin memiliki pemahamannya sendiri tentang infrastruktur saat ini.

    Untuk membantu Anda menghindari masalah tersebut, bagian ini mengonfigurasi status jarak jauh yang mengarah ke bucket Cloud Storage. Status jarak jauh adalah fitur backend dan, dalam tutorial ini, dikonfigurasi dalam file backend.tf—misalnya:

    # Copyright 2019 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     https://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    
    terraform {
      backend "gcs" {
        bucket = "PROJECT_ID-tfstate"
        prefix = "env/dev"
      }
    }
    

    Pada langkah-langkah berikut, Anda akan membuat bucket Cloud Storage dan mengubah beberapa file agar mengarah ke bucket baru dan project Google Cloud Anda.

    1. Di Cloud Shell, buat bucket Cloud Storage.

      PROJECT_ID=$(gcloud config get-value project)
      gcloud storage buckets create gs://${PROJECT_ID}-tfstate
      
    2. Aktifkan Pembuatan Versi Objek untuk menyimpan histori deployment Anda:

      gcloud storage buckets update gs://${PROJECT_ID}-tfstate --versioning
      

      Mengaktifkan Pembuatan Versi Objek akan meningkatkan biaya penyimpanan, yang dapat Anda kurangi dengan mengonfigurasi Object Lifecycle Management untuk menghapus versi status sebelumnya.

    3. Buat cabang cloud-storage-bucket baru untuk melakukan perubahan:

      cd ~/solutions-terraform-cloudbuild-gitops
      git checkout -b cloud-storage-bucket
      
    4. Ganti placeholder PROJECT_ID dengan ID project di file terraform.tfvars dan backend.tf:

      sed -i s/PROJECT_ID/$PROJECT_ID/g environments/*/terraform.tfvars
      sed -i s/PROJECT_ID/$PROJECT_ID/g environments/*/backend.tf
      

      Di OS X atau macOS, Anda mungkin perlu menambahkan dua tanda kutip ("") setelah sed -i, sebagai berikut:

      sed -i "" s/PROJECT_ID/$PROJECT_ID/g environments/*/terraform.tfvars
      sed -i "" s/PROJECT_ID/$PROJECT_ID/g environments/*/backend.tf
      
    5. Periksa apakah semua file telah diperbarui:

      git status
      

      Outputnya akan terlihat seperti ini:

      On branch cloud-storage-bucket
      Changes not staged for commit:
      (use "git add ..." to update what will be committed)
      (use "git restore ..." to discard changes in working directory)
             modified:   environments/dev/backend.tf
             modified:   environments/dev/terraform.tfvars
             modified:   environments/prod/backend.tf
             modified:   environments/prod/terraform.tfvars
      no changes added to commit (use "git add" and/or "git commit -a")
      
    6. Commit dan kirim perubahan Anda:

      git add --all
      git commit -m "Update project IDs and buckets"
      git push google -u cloud-storage-bucket
      

      Cabang cloud-storage-bucket baru Anda dikirim ke repositori Anda.

    7. Gabungkan perubahan cloud-storage-bucket ke dalam cabang dev dan prod dengan membuka dan mengirimkan permintaan penggabungan untuk setiap cabang.

    Memberikan izin ke akun layanan Cloud Build Anda

    Agar akun layanan Cloud Build dapat menjalankan skrip Terraform dengan tujuan mengelola Google Cloud resource, Anda perlu memberinya akses yang sesuai ke project Anda. Untuk mempermudah, akses editor project diberikan dalam tutorial ini. Untuk lingkungan produksi, ikuti praktik terbaik keamanan IT perusahaan Anda, biasanya dengan memberikan akses dengan hak istimewa terendah.

    1. Untuk menemukan email akun layanan Cloud Build, dari halaman Cloud Build, buka Settings.

      Buka setelan Cloud Build

    2. Salin nilai Email akun layanan.

    3. Berikan akses yang diperlukan ke akun layanan Cloud Build Anda:

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member serviceAccount:CLOUDBUILD_SA --role roles/editor
      

      Ganti kode berikut:

      • PROJECT_ID dengan ID project Anda.
      • CLOUDBUILD_SA dengan email akun layanan Cloud Build.

    Menghubungkan ke Cloud Build

    Untuk memicu Cloud Build saat mengirim ke cabang mana pun, siapkan webhook Secure Source Manager. File konfigurasi build akan memeriksa nama cabang untuk menentukan apakah perubahan perlu dilakukan pada lingkungan dev atau prod.

    1. Aktifkan dan siapkan Cloud Build di project Anda.

    2. Buka halaman Pemicu di konsol Google Cloud .

      Buka halaman Pemicu

    3. Pilih project Anda dari menu drop-down pemilih project di bagian atas halaman.

    4. Klik Buka.

    5. Klik Create trigger.

    6. Masukkan setelan pemicu berikut:

      • Nama: trigger-on-push

      • Region: pilih region untuk pemicu Anda. Jika file konfigurasi build yang terkait dengan pemicu Anda menentukan private pool, region yang Anda pilih untuk pemicu harus cocok dengan region private pool.

        Jika Anda memilih global sebagai region, Cloud Build akan menggunakan region yang ditentukan dalam file konfigurasi build untuk menjalankan build Anda. Ini dapat berupa region kumpulan pribadi, jika Anda menentukan kumpulan pribadi dalam file konfigurasi build, atau kumpulan default global jika Anda tidak menentukan kumpulan pribadi.

      • Deskripsi (opsional): Masukkan deskripsi untuk pemicu Anda.

      • Peristiwa: Pilih Peristiwa webhook sebagai peristiwa repositori untuk memanggil pemicu.

        Jika Secret Manager belum diinstal, Anda akan diminta untuk mengaktifkan Secret Manager.

      • URL Webhook: pilih salah satu opsi berikut:

        • Gunakan secret baru jika Anda ingin membuat secret baru menggunakan Cloud Build. Klik Create secret untuk membuat secret.
        • Gunakan secret yang ada atau buat secret Anda sendiri jika Anda ingin menggunakan secret yang ada. Masukkan secret dan versi di kotak pilihan drop-down.

        Jika menggunakan secret yang sudah ada, Anda mungkin perlu memberikan peran Secret Manager Secret Accessor secara manual ke agen layanan Cloud Build service-PROJECT_NUMBER@gcp-sa-cloudbuild..

        Untuk mempelajari lebih lanjut, lihat Memberikan peran kepada agen layanan Cloud Build.

    7. Klik Tampilkan pratinjau URL dan catat URL-nya. Anda memerlukan URL ini untuk menyiapkan webhook di Secure Source Manager.

      • Konfigurasi: untuk Jenis, pilih File konfigurasi Cloud Build (YAML atau JSON) dan untuk Lokasi, pilih Inline.
    8. Klik tombol Open Editor untuk mengedit file konfigurasi build Anda.

    9. Salin konten file cloudbuild.yaml Anda ke editor.

      Seperti yang telah dibahas sebelumnya, pipeline ini memiliki perilaku yang berbeda bergantung pada cabang yang diambil. Build akan memeriksa apakah variabel ${branch} cocok dengan folder lingkungan mana pun. Jika demikian, Cloud Build akan menjalankan terraform plan untuk lingkungan tersebut. Jika tidak, Cloud Build akan mengeksekusi terraform plan untuk semua lingkungan guna memastikan perubahan yang diusulkan sesuai untuk semua lingkungan. Jika salah satu rencana ini gagal dijalankan, build akan gagal.

      - id: 'tf plan'
        name: 'hashicorp/terraform:1.0.0'
        entrypoint: 'sh'
        args:
        - '-c'
        - |
            branch=$(basename "$_REF")
            if [ -d "environments/${branch}/" ]; then
              cd environments/${branch}
              terraform plan
            else
              for dir in environments/*/
              do
                cd ${dir}
                env=${dir%*/}
                env=${env#*/}
                echo ""
                echo "*************** TERRAFOM PLAN ******************"
                echo "******* At environment: ${env} ********"
                echo "*************************************************"
                terraform plan || exit 1
                cd ../../
              done
            fi

      Perintah terraform apply berjalan untuk cabang lingkungan, tetapi sepenuhnya diabaikan dalam kasus lainnya.

    10. Klik + Tambahkan variabel, lalu tambahkan dua variabel substitusi berikut:

      • Variabel: _REPO_URL, Nilai:$(body.repository.clone_url)
      • Variabel: _REF, Nilai:$(body.ref)
    11. Klik Buat.

    Menyiapkan webhook di Secure Source Manager

    Buat webhook untuk memicu build saat melakukan push ke cabang dev atau prod.

    1. Di antarmuka web Secure Source Manager, buka repositori yang ingin Anda buat webhook-nya.
    2. Klik Setelan.
    3. Klik Webhook, lalu klik Tambahkan webhook.
    4. Di kolom Hook ID, masukkan ID untuk webhook.

    5. Di kolom Target URL, masukkan URL Webhook yang Anda salin saat menyiapkan pemicu webhook di Cloud Build.

      Untuk menemukan URL Webhook:

      1. Buka halaman Pemicu di konsol Google Cloud .

        Buka halaman Pemicu

      2. Klik pemicu Anda.

      3. Di bagian Webhook URL, klik Tampilkan pratinjau URL, lalu salin URL.

    6. URL Webhook berisi nilai kunci dan rahasia yang dimasukkan saat Anda membuat pemicu Cloud Build. Untuk mencegah kebocoran nilai ini, hapus nilai tersebut dari akhir URL target dan salin ke kolom String Kueri Sensitif.

      Untuk menemukan kunci dan rahasia di URL webhook, cari teks yang dimulai dengan key=

      Misalnya, dengan URL berikut: https://cloudbuild.googleapis.com/v1/projects/my-project/triggers/test-trigger:webhook?key=eitIfKhYnv0LrkdsyHqIros8fbsheKRIslfsdngf&secret=Hello%20Secret%20Manager

      Salin dan hapus bagian yang dimulai dengan tanda tanya ?key=... dari kolom URL Target. Kemudian, hapus tanda tanya awal, pindahkan bagian key=... yang tersisa ke kolom String Kueri Sensitif.

    7. Klik Tambahkan webhook.

    8. Webhook ditampilkan di halaman Webhook.

    Mengubah konfigurasi lingkungan Anda di cabang fitur baru

    1. Pastikan Anda berada di cabang dev:

      cd ~/solutions-terraform-cloudbuild-gitops
      git checkout dev
      
    2. Tarik perubahan terbaru:

      git pull
      
    3. Buat cabang bug-fix untuk mengubah konfigurasi lingkungan.

      git checkout -b bug-fix
      
    4. Buka modules/firewall/main.tf untuk mengedit.

    5. Di baris 30, perbaiki kesalahan ketik "http-server2" di kolom target_tags.

      Nilai harus berupa "http-server".

    6. Commit dan kirim perubahan Anda:

      git add --all
      git commit -m "Fix typo."
      git push google -u bug-fix
      
    7. Buka halaman History Cloud Build di konsol Google Cloud :

      Buka halaman Histori

    8. Klik Build untuk melihat informasi selengkapnya, termasuk output terraform plan.

    Perhatikan bahwa tugas Cloud Build menjalankan pipeline yang ditentukan dalam file cloudbuild.yaml. Seperti yang telah dibahas sebelumnya, pipeline ini memiliki perilaku yang berbeda bergantung pada cabang yang diambil. Build akan memeriksa apakah variabel ${branch} cocok dengan folder lingkungan mana pun. Jika demikian, Cloud Build akan menjalankan terraform plan untuk lingkungan tersebut. Jika tidak, Cloud Build akan mengeksekusi terraform plan untuk semua lingkungan guna memastikan perubahan yang diusulkan sesuai untuk semua lingkungan. Jika salah satu rencana ini gagal dijalankan, build akan gagal.

    - id: 'tf plan'
      name: 'hashicorp/terraform:1.0.0'
      entrypoint: 'sh'
      args:
      - '-c'
      - |
          branch=$(basename "$_REF")
          if [ -d "environments/${branch}/" ]; then
            cd environments/${branch}
            terraform plan
          else
            for dir in environments/*/
            do
              cd ${dir}
              env=${dir%*/}
              env=${env#*/}
              echo ""
              echo "*************** TERRAFOM PLAN ******************"
              echo "******* At environment: ${env} ********"
              echo "*************************************************"
              terraform plan || exit 1
              cd ../../
            done
          fi

    Demikian pula, perintah terraform apply yang akan berjalan untuk cabang lingkungan, tetapi sepenuhnya diabaikan dalam kasus lainnya. Di bagian ini, Anda telah mengirimkan perubahan kode ke cabang baru, sehingga tidak ada deployment infrastruktur yang diterapkan ke project Google Cloud Anda.

    - id: 'tf apply' name: 'hashicorp/terraform:1.0.0' entrypoint: 'sh' args: - '-c' - | branch=$(basename "$_REF") if [ -d "environments/${branch}/" ]; then cd environments/${branch} terraform apply -auto-approve else echo "***************************** SKIPPING APPLYING *******************************" echo "Branch '${branch}' does not represent an official environment." echo "*******************************************************************************" fi

    Mendorong perubahan pada lingkungan pengembangan

    Kini saatnya menerapkan status yang Anda inginkan ke lingkungan dev.

    1. Di antarmuka web Secure Source Manager, buka repositori Anda.
    2. Klik New pull request.
    3. Di kolom merge into:, pilih cabang dev Anda.
    4. Di kolom pull from:, pilih cabang bug-fix Anda.
    5. Klik New pull request.
    6. Klik Create pull request.
    7. Klik Merge pull request, lalu klik Merge pull request lagi.
    8. Periksa apakah Cloud Build baru telah dipicu:

      Buka halaman Cloud Build

    9. Buka build dan periksa log.

      Setelah build selesai, Anda akan melihat tampilan seperti ini:

      Step #3 - "tf apply": external_ip = EXTERNAL_IP_VALUE
      Step #3 - "tf apply": firewall_rule = dev-allow-http
      Step #3 - "tf apply": instance_name = dev-apache2-instance
      Step #3 - "tf apply": network = dev
      Step #3 - "tf apply": subnet = dev-subnet-01
      
    10. Salin EXTERNAL_IP_VALUE dan buka alamat di browser web.

      http://EXTERNAL_IP_VALUE
      

      Penyediaan ini mungkin memerlukan waktu beberapa detik untuk mem-boot VM dan menyebarkan aturan firewall. Terakhir, Anda akan melihat Environment: dev di browser web.

    11. Buka Cloud Storage:

      Buka halaman Cloud Storage

    12. Pilih project Anda.

    13. Klik bucket penyimpanan status Terraform Anda. Nama bucket akan terlihat seperti berikut:

      PROJECT_ID-tfstate
      
    14. Klik env, lalu dev untuk melihat file status Terraform Anda.

    Mendorong perubahan pada lingkungan produksi

    Setelah lingkungan pengembangan sudah diuji sepenuhnya, Anda dapat mempromosikan kode infrastruktur ke produksi.

    1. Di antarmuka web Secure Source Manager, buka repositori Anda.
    2. Klik tab Pull requests.
    3. Klik New pull request.
    4. Untuk merge into:, pilih cabang prod repositori Anda.
    5. Untuk pull from:, pilih cabang dev repositori Anda.
    6. Klik New pull request.
    7. Untuk title, masukkan judul seperti "Promoting networking changes", lalu klik Create pull request.
    8. Tinjau perubahan yang diusulkan, lalu klik Merge pull request.

      Tanggal dan URL repositori ditambahkan di kolom komentar.

    9. Klik Merge pull request lagi untuk mengonfirmasi.

    10. Di konsol Google Cloud , buka halaman Build History untuk melihat perubahan yang Anda terapkan ke lingkungan produksi:

      Buka halaman Cloud Build

    11. Tunggu hingga build selesai, lalu periksa log.

      Di akhir log, Anda akan melihat sesuatu seperti ini:

      Step #3 - "tf apply": external_ip = EXTERNAL_IP_VALUE
      Step #3 - "tf apply": firewall_rule = prod-allow-http
      Step #3 - "tf apply": instance_name = prod-apache2-instance
      Step #3 - "tf apply": network = prod
      Step #3 - "tf apply": subnet = prod-subnet-01
      
    12. Salin EXTERNAL_IP_VALUE dan buka alamat di browser web.

      http://EXTERNAL_IP_VALUE
      

      Penyediaan ini mungkin memerlukan waktu beberapa detik untuk mem-boot VM dan menyebarkan aturan firewall. Terakhir, Anda akan melihat Environment: prod di browser web.

    13. Buka Cloud Storage:

      Buka halaman Cloud Storage

    14. Pilih project Anda.

    15. Klik bucket penyimpanan status Terraform Anda. Nama bucket akan terlihat seperti berikut:

      PROJECT_ID-tfstate
      
    16. Klik env, lalu prod untuk melihat file status Terraform Anda.

    Anda telah berhasil mengonfigurasi pipeline infrastruktur sebagai kode tanpa server di Cloud Build. Di masa mendatang, Anda dapat mencoba hal berikut:

    • Tambahkan deployment untuk kasus penggunaan terpisah.
    • Buat lingkungan tambahan untuk mencerminkan kebutuhan Anda.
    • Gunakan project per lingkungan, bukan VPC per lingkungan.

    Pembersihan

    Setelah menyelesaikan tutorial, bersihkan resource yang dibuat di Google Cloud sehingga Anda tidak akan ditagih di masa mendatang.

    Menghapus project

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Langkah berikutnya