Skip to content

Instantly share code, notes, and snippets.

@joshuaquek
Last active May 31, 2021 15:23
Show Gist options
  • Select an option

  • Save joshuaquek/1774b64b667bdefe62b96df35b6e0318 to your computer and use it in GitHub Desktop.

Select an option

Save joshuaquek/1774b64b667bdefe62b96df35b6e0318 to your computer and use it in GitHub Desktop.

Revisions

  1. joshuaquek revised this gist May 31, 2021. No changes.
  2. joshuaquek renamed this gist May 31, 2021. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. joshuaquek created this gist May 16, 2021.
    1 change: 1 addition & 0 deletions .GitLab.com-to-Kubernetes-Deploy
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    Summary: How to deploy to Kubernetes using a Gitlab.com managed Kubernetes Cluster
    1 change: 1 addition & 0 deletions .credits.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    Credits go to: https://www.methodpark.de/blog/how-to-automate-review-deployments-with-kubernetes-and-gitlab/
    66 changes: 66 additions & 0 deletions .gitlab-ci.yml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,66 @@
    # Common base for jobs that deploy to k8s
    .deploy-base:
    # For deploying, we need an image that can interact with k8s. Using
    # GitLab's own official image for this should be safe enough:
    image: registry.gitlab.com/gitlab-org/cluster-integration/helm-install-image/releases/2.16.6-kube-1.13.12
    variables:
    # Define k8s namespace and domain used for deployment:
    NS: $CI_COMMIT_REF_SLUG
    CI_ENVIRONMENT_DOMAIN: $CI_COMMIT_REF_SLUG.$KUBE_INGRESS_BASE_DOMAIN
    only:
    # Deploy only branches and tags:
    refs:
    - branches
    - tags
    # Deploy only if k8s integration is configured:
    kubernetes: active


    # Job that deploys the app to k8s:
    deploy:branch:
    stage: deploy
    extends: .deploy-base
    environment:
    name: $CI_COMMIT_REF_SLUG
    url: http://$CI_COMMIT_REF_SLUG.$KUBE_INGRESS_BASE_DOMAIN
    on_stop: deploy:stop_branch
    before_script:
    - apk add gettext
    script:
    # Create dedicated namespace to deploy in (delete first, if it already exists):
    - kubectl get namespace $NS && kubectl delete namespace $NS || true
    - kubectl create namespace $NS

    # Make Docker credentials available for deployment:
    - kubectl -n $NS create secret docker-registry gitlab-registry --docker-server="$CI_REGISTRY" --docker-username="$CI_REGISTRY_USER" --docker-password="$CI_REGISTRY_PASSWORD"
    - kubectl -n $NS patch serviceaccount default -p '{"imagePullSecrets":[{"name":"gitlab-registry"}]}'

    # Start and expose deployment, set up ingress:
    - kubectl -n $NS create deployment myapp --image=$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG
    - kubectl -n $NS expose deployment/myapp --type=NodePort --port 3000

    # Set up ingress with env var expansion from template:
    - envsubst < k8s/ingress.yml.tpl | kubectl -n $NS apply -f -

    # Wait for pod
    - kubectl -n $NS wait --for=condition=available deployment/myapp --timeout=180s


    # Job that destroys the k8s namespace used to deploy the app. This gets
    # triggered either manually or when the environment is stopped (e.g., when an
    # MR is merged):
    deploy:stop_branch:
    stage: deploy
    extends: .deploy-base
    when: manual
    # This job must not have any dependencies, otherwise it will refuse to run
    # when the artifact retention of previous jobs has expired:
    dependencies: []
    environment:
    name: $CI_COMMIT_REF_SLUG
    action: stop
    variables:
    # Disable checkout here because the ref might not be available anymore
    GIT_STRATEGY: none
    script:
    - kubectl delete namespace $NS