149 lines
5.3 KiB
YAML
149 lines
5.3 KiB
YAML
name: Deploy
|
|
|
|
on:
|
|
workflow_call:
|
|
secrets:
|
|
domain:
|
|
description: Main project deploy domain used in URLs
|
|
required: true
|
|
payum-apikey:
|
|
description: Payum API Key
|
|
required: true
|
|
storage-key:
|
|
description: storage key
|
|
required: true
|
|
storage-secret-key:
|
|
description: storage secret key
|
|
required: true
|
|
project-id:
|
|
description: GCP project ID
|
|
required: true
|
|
workload-identity-provider:
|
|
description: GCP workload identity provider
|
|
required: true
|
|
database-url:
|
|
description: Database URL
|
|
required: true
|
|
mailer-dsn:
|
|
description: Mailer DSN
|
|
required: true
|
|
|
|
|
|
jobs:
|
|
meta:
|
|
name: Meta
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
context: ${{ steps.meta.outputs.context }}
|
|
environment: ${{ steps.meta.outputs.environment }}
|
|
image_tag: ${{ steps.meta.outputs.image_tag }}
|
|
release_name: ${{ steps.meta.outputs.release_name }}
|
|
url: ${{ steps.meta.outputs.url }}
|
|
project: ${{ steps.meta.outputs.project }}
|
|
namespace: ${{ steps.meta.outputs.namespace }}
|
|
storage_name: ${{ steps.meta.outputs.storage_name }}
|
|
steps:
|
|
- name: Generate metadata
|
|
id: meta
|
|
run: |
|
|
set -xo pipefail
|
|
PROJECT=plateformcoop-ebs
|
|
# Tags are deployed in prod
|
|
CONTEXT=prod
|
|
ENVIRONMENT=prod
|
|
IMAGE_TAG=${{ github.ref_name }}
|
|
RELEASE_NAME=prod
|
|
echo "context=${CONTEXT}" >> $GITHUB_OUTPUT
|
|
echo "environment=${ENVIRONMENT}" >> $GITHUB_OUTPUT
|
|
echo "image_tag=${IMAGE_TAG}" >> $GITHUB_OUTPUT
|
|
echo "release_name=${RELEASE_NAME}" >> $GITHUB_OUTPUT
|
|
echo "namespace=${CONTEXT}-${PROJECT}" >> $GITHUB_OUTPUT
|
|
|
|
deploy:
|
|
name: Deploy
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
permissions:
|
|
contents: 'read'
|
|
id-token: 'write'
|
|
pull-requests: 'write'
|
|
environment:
|
|
name: ${{ needs.meta.outputs.environment }}
|
|
needs: ["meta"]
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v3
|
|
|
|
- name: GKE Auth
|
|
uses: 'google-github-actions/auth@v2'
|
|
with:
|
|
project_id: '${{ secrets.project-id }}'
|
|
workload_identity_provider: '${{ secrets.workload-identity-provider }}'
|
|
|
|
- name: Setup gcloud
|
|
uses: google-github-actions/setup-gcloud@v1
|
|
with:
|
|
project_id: ${{ secrets.project-id }}
|
|
|
|
- name: Connect cluster
|
|
run: |
|
|
gcloud components install gke-gcloud-auth-plugin
|
|
gcloud auth login --cred-file=$CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE
|
|
gcloud container clusters get-credentials ${{ vars.CLUSTER_NAME }} --region europe-west1 --project ${{ secrets.project-id }}
|
|
kubectl config view
|
|
|
|
# https://github.com/helm/helm/issues/8036
|
|
- name: Build helm dependencies
|
|
run: |
|
|
set -o pipefail
|
|
# add all repos
|
|
if [ -f "./helm/chart/Chart.lock" ]; then
|
|
yq --indent 0 '.dependencies | map(["helm", "repo", "add", .name, .repository] | join(" ")) | .[]' "./helm/chart/Chart.lock" | sh --;
|
|
fi
|
|
helm dependency build ./helm/chart
|
|
|
|
- name: Deploy on namespace
|
|
id: deploy
|
|
shell: bash
|
|
run: |
|
|
set -o pipefail
|
|
if ! helm upgrade --install ${{ needs.meta.outputs.release_name }} ./helm/chart \
|
|
--atomic \
|
|
--debug \
|
|
--namespace ${{ needs.meta.outputs.namespace }} \
|
|
--set=php.image.tag=${{ needs.meta.outputs.image_tag }} \
|
|
--set=caddy.image.tag=${{ needs.meta.outputs.image_tag }} \
|
|
--set=ingress.hosts[0].host=${{ vars.DOMAIN }} \
|
|
--set=ingress.tls[0].secretName=${{ needs.meta.outputs.release_name }}-tls \
|
|
--set=ingress.tls[0].hosts[0]=${{ vars.DOMAIN }} \
|
|
--set=postgresql.url="${{ secrets.database-url }}" \
|
|
--set=payum.apikey="${{ secrets.payum-apikey }}" \
|
|
--set=mailer.dsn="${{ secrets.mailer-dsn }}" \
|
|
--set=php.storage.bucket="${{ vars.STORAGE_BUCKET }}" \
|
|
--set=php.storage.endpoint="https://storage.googleapis.com" \
|
|
--set=php.storage.region="eu-west-1" \
|
|
--set=php.storage.usePathStyleEndpoint=true \
|
|
--set=php.storage.key="${{ secrets.storage-key }}" \
|
|
--set=php.storage.secret="${{ secrets.storage-secret-key }}" \
|
|
--values ./helm/chart/values-${{ needs.meta.outputs.context }}.yml \
|
|
| sed --unbuffered '/USER-SUPPLIED VALUES/,$d' ; then
|
|
echo "Deployment has failed!"
|
|
echo "Here are the last events to help diagnose the problem:"
|
|
kubectl get events --namespace ${{ needs.meta.outputs.namespace }} --sort-by .metadata.creationTimestamp
|
|
exit 1
|
|
fi
|
|
|
|
- name: Output deployment URL
|
|
uses: actions/github-script@v6
|
|
if: github.event_name == 'pull_request'
|
|
env:
|
|
URL: ${{ needs.meta.outputs.url }}
|
|
with:
|
|
script: |
|
|
const { URL } = process.env
|
|
github.rest.issues.createComment({
|
|
issue_number: context.issue.number,
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
body: `Chart has been deployed with this url:\n\`\`\`\n${URL}\n\`\`\``
|
|
})
|