Skip to main content

サーバ構築

開発 / リリース環境としては、Docker をベースにしているため、各種 docker-compose.ymlが用意されている。

Prerequire

環境構築の前の事前準備

Docker ベースの起動

特に環境変数等は存在しない。

Local

開発環境として構築する場合は、docker-compose.dev.yml で立ち上げる。

ローカルでdockerを起動
docker compose up

Cloud

現状の CELL4 環境は Azure 環境で構築しているため、.github/workflow/ 内部にある、github   workflow で自動構築している。

Click >>> 検証環境立ち上げworkflow定義
検証環境立ち上げworkflow定義
name: aks-deploy
on:
workflow_dispatch:
inputs:
environment:
description: 'environment'
required: true
type: environment

env:
TRUE: true

## Slack 通知で使用

# SLACK_USERNAME: GithubActions

# SLACK_ICON: ${{ secrets.SLACK_ICON }}

# SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}

run-name: ${{ github.workflow }} / ${{ inputs.environment }} (${{ github.ref_name }})

concurrency:
group: ${{ github.workflow }}-${{ inputs.environment }}
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-latest
environment: ${{ inputs.environment }}

outputs:
TAG: ${{ steps.create-image-tag.outputs.TAG }}

steps:
- name: Create image tag
id: create-image-tag
run: |
IMAGE_TAG="${{ vars.ENV_NAME }}-$(echo ${{ github.sha }} | cut -c 1-7)-$(date +%Y%m%d%H%M%S)"
echo "TAG=${IMAGE_TAG}" >> "$GITHUB_ENV"
echo "TAG=${IMAGE_TAG}" >> "$GITHUB_OUTPUT"

- name: checkout branch
uses: actions/checkout@v4

- name: Azure Login
uses: azure/login@v2
with:
creds: |
{
"clientId":"${{ secrets.AZURE_CLIENT_ID }}",
"clientSecret":"${{ secrets.AZURE_CLIENT_SECRET }}",
"subscriptionId":"${{ secrets.AZURE_SUBSCRIPTION_ID }}",
"tenantId":"${{ secrets.AZURE_TENANT_ID }}"
}

- name: log into acr
run: |
az acr login --name ${{ vars.ACR_NAME }}

- name: Set image tag
run: |
yq e ".services.app.image = \"${{ vars.ACR_NAME }}.azurecr.io/${{ vars.ACR_REPOSITORY_NAME }}:${{ env.TAG }}\"" -i docker-compose.build.yml
yq docker-compose.build.yml

- name: Build Docker image
run: |
docker-compose -f docker-compose.build.yml build

- name: push images
run: |
docker push ${{ vars.ACR_NAME }}.azurecr.io/${{ vars.ACR_REPOSITORY_NAME }}:${{ env.TAG }}

# #-- Slack通知 --#
# # ビルド失敗
# - name: Slack Notification on Failure
# uses: rtCamp/action-slack-notify@v2
# if: ${{ failure() }}
# env:
# SLACK_TITLE: Deploy / Failure
# SLACK_COLOR: danger
# SLACK_MESSAGE: "[cell4-app] ${{ vars.ENV_NAME }}環境のビルドが失敗しました😢"

deploy:
runs-on: ubuntu-latest
needs: build
environment: ${{ inputs.environment }}
defaults:
run:
working-directory: ./.k8s

env:
TAG: ${{ needs.build.outputs.TAG }}

steps:
- name: checkout branch
uses: actions/checkout@v4

- name: make script executable
run: chmod -R +x ../.github/workflows/scripts/

- name: Azure Login
uses: azure/login@v2
with:
creds: |
{
"clientId":"${{ secrets.AZURE_CLIENT_ID }}",
"clientSecret":"${{ secrets.AZURE_CLIENT_SECRET }}",
"subscriptionId":"${{ secrets.AZURE_SUBSCRIPTION_ID }}",
"tenantId":"${{ secrets.AZURE_TENANT_ID }}"
}

- name: setup ytt
uses: carvel-dev/setup-action@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
only: ytt

- name: create output directory
run: |
mkdir -p output

- name: generate data-value
run: |
yq -i '.all.common.namespace |= "${{ vars.AKS_NAMESPACE }}"' ./${{ vars.ENV_NAME }}/data-value.yaml
yq -i '.app.deploy.image |= "${{ vars.ACR_NAME }}.azurecr.io/${{ vars.ACR_REPOSITORY_NAME }}:${{ env.TAG }}"' ./${{ vars.ENV_NAME }}/data-value.yaml

- name: create manifest app
run: |
ytt -f ./template/app \
-f ./${{ vars.ENV_NAME }}/data-value.yaml \
> ./output/app.yaml
cat ./output/app.yaml

- name: create ingress
run: |
ytt -f ./template/ingress \
-f ./${{ vars.ENV_NAME }}/data-value.yaml \
> ./output/ingress.yaml
cat ./output/ingress.yaml

- name: create namespace
run: |
../../.github/workflows/scripts/invoke_command.sh ${{ vars.AKS_RG_NAME }} ${{ vars.AKS_NAME }} "kubectl create namespace ${{ vars.AKS_NAMESPACE }} --dry-run=client -o json | kubectl apply -f -"
working-directory: .k8s/output

- name: apply manifest
run: |
../../.github/workflows/scripts/invoke_command.sh ${{ vars.AKS_RG_NAME }} ${{ vars.AKS_NAME }} "kubectl apply -f ."
working-directory: .k8s/output

# #-- Slack通知 --#
# # 成功
# - name: slack notification on success
# uses: rtCamp/action-slack-notify@v2
# if: ${{ success() }}
# env:
# SLACK_TITLE: Deploy / Success
# SLACK_COLOR: good
# SLACK_MESSAGE: "[cell4-app] ${{ vars.ENV_NAME }}環境のデプロイが完了しました🚀"

# # 失敗
# - name: slack notification on failure
# uses: rtCamp/action-slack-notify@v2
# if: ${{ failure() }}
# env:
# SLACK_TITLE: Deploy / Failure
# SLACK_COLOR: danger
# SLACK_MESSAGE: "[cell4-app] ${{ vars.ENV_NAME }}環境のデプロイが失敗しました😢"