Тепер, коли ми налаштували обліковий запис служби та створили ролі Kubernetes, ми можемо розмістити їх на машині для розробки за шляхом ‘.kube/config’.
Спробуємо цю конфігурацію на машині для розробки.
kubectl get all -n prod-example-dot-com
Команда повинна працювати без проблем, що вказує на те, що публічний домен, налаштований в цій статті, та токен, згенерований в цій статті, працюють правильно.
Цей крок необхідний перед тим, як деплоїти ці облікові дані до GitHub Actions, щоб переконатися, що все працює коректно.
GitHub має власне сховище секретів, розташоване в налаштуваннях репозиторію -> Секрети та змінні -> Дії -> Секрети.
Давайте додамо контекст Kubernetes під змінною KUBE_CONF у форматі Base64.
cd .kube
cat config | base64
Додатково нам потрібно додати ще 3 секрети:
- REGISTRY_URL
- REGISTRY_USERNAME
- REGISTRY_PASSWORD
Ці параметри необхідні для налаштування власного реєстру артефактів, створеного в цій статті.
Тепер ми готові додати CI/CD пайплайн для деплойменту застосунку.
У попередній статті ми створили terraform скрипти і вже закомітили їх у репозиторій.
Давайте додамо файл ‘.github/workflows/deploy-main.yaml’
name: CI/CD Pipeline
on:
push:
branches:
- main # Trigger workflow on pushes to the main branch
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Docker
uses: docker/setup-buildx-action@v2
- name: Log in to Custom Registry
uses: docker/login-action@v2
with:
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
registry: ${{ secrets.REGISTRY_URL }}
- name: Build the project
run: make
- name: Push the Docker image
run: make push
deploy:
needs: build-and-push
runs-on: ubuntu-latest
steps:
# Checkout the repository
- name: Checkout Code
uses: actions/checkout@v3
# Install Terraform
- name: Set up Terraform
uses: hashicorp/setup-terraform@v3
with:
terraform_version: 1.1.7 # Specify your Terraform version
# Authenticate with Kubernetes (via kubeconfig, GKE, or other means)
- name: Set up Terraform credentials
run: |
mkdir -p ~/.kube
echo "${{ secrets.KUBE_CONFIG }}" | base64 --decode > ~/.kube/config
- name: Navigate to Terraform Directory
working-directory: ./infra
run: echo "Navigated to infra folder"
# Initialize Terraform
- name: Terraform Init
working-directory: ./infra
run: terraform init
# Plan the Terraform deployment
- name: Terraform Plan
working-directory: ./infra
run: terraform plan
env:
TF_VAR_registry_url: ${{ secrets.REGISTRY_URL }}
TF_VAR_registry_username: ${{ secrets.REGISTRY_USERNAME }}
TF_VAR_registry_password: ${{ secrets.REGISTRY_PASSWORD }}
# Apply Terraform configuration
- name: Terraform Apply
working-directory: ./infra
run: terraform apply -auto-approve
env:
TF_VAR_registry_url: ${{ secrets.REGISTRY_URL }}
TF_VAR_registry_username: ${{ secrets.REGISTRY_USERNAME }}
TF_VAR_registry_password: ${{ secrets.REGISTRY_PASSWORD }}
У цьому пайплайні є два завдання:
- build-and-push
- deploy
Перше завдання призначене для створення контейнера за допомогою стандартної команди ‘make’ та завантаження його до віддаленого реєстру через команду ‘make push’.
Цей підхід можна використовувати для будь-якого контейнеризованого застосунку.
Друге завдання призначене для застосування terraform скриптів, які автоматично перезапускають деплоймент незалежно від версії образу.
Отже, кожен коміт або pull-запит до репозиторію створюватиме окремий застосунок і деплоїтиме його в Kubernetes.
Все готово.
Перекладено з: How to Create GitHub Action Workflow CI/CD pipeline for Kubernetes with Terraform