-
Notifications
You must be signed in to change notification settings - Fork 0
add build-push-deploy #11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
8f30a64
63df8dd
b0f0f27
d2736ba
10bfe9b
d89cc67
7ae5c59
8facb60
458c9f0
bfd5d44
7e9a827
8e45f86
f97bb17
b5a22fd
b855cba
f20315e
318229d
c58b909
e0786b1
dc832e8
7eb5d87
2769466
0594a3a
5aef156
c7fd0f7
3b20427
833709f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,170 @@ | ||||||
on: | ||||||
workflow_call: | ||||||
inputs: | ||||||
service-name: | ||||||
description: "Name of the service to build. Used as the default image name and src dir unless 'image-name' or 'src-path' are used." | ||||||
type: string | ||||||
required: true | ||||||
stage-name: | ||||||
description: "The backend environment we are building for (API calls are pointed to). This should be one of (development, staging, production)." | ||||||
type: string | ||||||
required: true | ||||||
deploy-namespace: | ||||||
description: "The Kubernetes namespace to deploy the service to." | ||||||
type: string | ||||||
required: false | ||||||
docker-build-args: | ||||||
description: "Extra args passed to 'docker build'." | ||||||
type: string | ||||||
required: false | ||||||
docker-image-ref: | ||||||
description: "The version number or sha used in creating image tag." | ||||||
type: string | ||||||
required: false | ||||||
default: "${{ github.sha }}" | ||||||
dockerfiles: | ||||||
description: "JSON list of dockerfiles to build, e.g. ['Dockerfile1', 'Dockerfile2']" | ||||||
type: string | ||||||
required: false | ||||||
default: "['Dockerfile']" | ||||||
docker-bake-target: | ||||||
description: "The target to build with docker bake." | ||||||
type: string | ||||||
required: false | ||||||
docker-bake-platforms: | ||||||
description: "The platforms to build with docker bake." | ||||||
type: string | ||||||
required: false | ||||||
migration-job-file: | ||||||
description: "The file path to the migration k8s job YAML." | ||||||
type: string | ||||||
required: false | ||||||
default: "deployment/migration-job.yaml" | ||||||
|
||||||
|
||||||
|
||||||
jobs: | ||||||
# Looks for PR labels like "deploy-to-<env>" so we can deploy to those envs | ||||||
get-deploy-labels: | ||||||
name: Get Deploy Envs | ||||||
runs-on: mdb-dev | ||||||
concurrency: | ||||||
group: ${{ github.workflow_ref }} # workflow_ref contains the workflow name and branch ref | ||||||
cancel-in-progress: true # Cancel any in-progress runs on this branch - this one is newer | ||||||
outputs: | ||||||
deploy-envs: ${{ steps.get-labels.outputs.deploy-envs }} | ||||||
steps: | ||||||
- id: get-labels | ||||||
uses: mindsdb/github-actions/get-deploy-labels@main | ||||||
|
||||||
|
||||||
# Build docker image(s) based on Dockerfile(s) and push to ECR | ||||||
build: | ||||||
runs-on: mdb-dev | ||||||
needs: [get-deploy-labels] | ||||||
if: ${{ !inputs.docker-bake && needs.get-deploy-labels.outputs.deploy-envs != '[]' }} | ||||||
strategy: | ||||||
matrix: | ||||||
dockerfile: ${{fromJson(inputs.dockerfiles)}} | ||||||
concurrency: | ||||||
group: ${{ github.workflow_ref }} # workflow_ref contains the workflow name and branch ref | ||||||
cancel-in-progress: true # Cancel any in-progress runs on this branch - this one is newer | ||||||
env: | ||||||
AWS_REGION: us-east-1 | ||||||
steps: | ||||||
- uses: actions/checkout@v4 | ||||||
with: | ||||||
ref: ${{ inputs.docker-image-ref }} | ||||||
# Build via docker-bake if a bakefile is specified | ||||||
- if: ${{ contains(matrix.dockerfile, '.hcl') }} | ||||||
uses: mindsdb/github-actions/docker-bake@main | ||||||
with: | ||||||
git-sha: ${{ inputs.docker-image-ref }} | ||||||
target: ${{ inputs.docker-bake-target }} | ||||||
platforms: ${{ inputs.docker-bake-platforms }} | ||||||
push-cache: false | ||||||
# Otherwise build via regular docker | ||||||
- if: ${{ !contains(matrix.dockerfile, '.hcl') }} | ||||||
uses: mindsdb/github-actions/build-push-ecr@main | ||||||
with: | ||||||
module-name: ${{ inputs.service-name }} | ||||||
build-for-environment: ${{ inputs.stage-name }} | ||||||
image-ref: ${{ inputs.docker-image-ref }} | ||||||
extra-build-args: "-f ${{ matrix.dockerfile }}" | ||||||
|
||||||
|
||||||
migrate: | ||||||
runs-on: mdb-dev | ||||||
needs: [get-deploy-labels, build] | ||||||
strategy: | ||||||
matrix: | ||||||
deploy-env: ${{fromJson(needs.get-deploy-labels.outputs.deploy-envs)}} | ||||||
concurrency: | ||||||
group: deploy-${{ matrix.deploy-env }} # All deployments for this env are grouped together | ||||||
cancel-in-progress: false # Don't cancel in-progress deployments, it breaks helm | ||||||
steps: | ||||||
- uses: actions/checkout@v4 | ||||||
with: | ||||||
ref: ${{ inputs.docker-image-ref }} | ||||||
- name: Migrate | ||||||
run: | | ||||||
export NAMESPACE=${{inputs.deploy-namespace || matrix.deploy-env}} | ||||||
export IMAGE_TAG=${{ inputs.stage-name }}-${{ inputs.docker-image-ref }} | ||||||
export JOB_NAME=$(grep -E '^ *name:' ${{ inputs.migration-job-file }} | head -1 | awk '{print $2}') | ||||||
|
||||||
kubectl -n $NAMESPACE delete job --ignore-not-found $JOB_NAME | ||||||
envsubst '${IMAGE_TAG} ${NAMESPACE}' < ${{ inputs.migration-job-file }} | kubectl apply -f - | ||||||
|
||||||
kubectl -n "$NAMESPACE" wait --for=condition=complete --timeout=1m "job/$JOB_NAME" | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. performance: 🤖 AI Agent Prompt for Cursor/Windsurf
📝 Committable Code Suggestion
Suggested change
|
||||||
|
||||||
# Deploy the built image to the specified environments | ||||||
# Deploys to all environments at once | ||||||
deploy: | ||||||
runs-on: mdb-dev | ||||||
needs: [ get-deploy-labels, build, migrate ] | ||||||
strategy: | ||||||
matrix: | ||||||
deploy-env: ${{fromJson(needs.get-deploy-labels.outputs.deploy-envs)}} | ||||||
concurrency: | ||||||
group: deploy-${{ matrix.deploy-env }} # All deployments for this env are grouped together | ||||||
cancel-in-progress: false # Don't cancel in-progress deployments, it breaks helm | ||||||
environment: | ||||||
# Assuming that ENV_URL is set in a github environment in the repo | ||||||
# If not the link in the slack message will be borked, thats all | ||||||
name: ${{ matrix.deploy-env }} | ||||||
url: ${{ vars.ENV_URL }} | ||||||
steps: | ||||||
- uses: actions/checkout@v4 | ||||||
- uses: mindsdb/github-actions/setup-env@main | ||||||
- name: Notify of deployment starting | ||||||
# This same message will be updated later with the deployment status | ||||||
id: slack | ||||||
uses: mindsdb/github-actions/slack-deploy-msg@main | ||||||
with: | ||||||
channel-id: ${{ secrets.SLACK_DEPLOYMENTS_CHANNEL_ID }} | ||||||
status: "started" | ||||||
color: "#0099CC" | ||||||
env-name: ${{ matrix.deploy-env }} | ||||||
env-url: ${{ vars.ENV_URL }} | ||||||
slack-token: ${{ secrets.GH_ACTIONS_SLACK_BOT_TOKEN }} | ||||||
- uses: DevOps-Nirvana/aws-helm-multi-deploy-nodocker@v4 | ||||||
# Do the actual deployment | ||||||
with: | ||||||
environment-slug: ${{matrix.deploy-env}} | ||||||
k8s-namespace: ${{inputs.deploy-namespace || matrix.deploy-env}} | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. correctness: 🤖 AI Agent Prompt for Cursor/Windsurf
📝 Committable Code Suggestion
Suggested change
|
||||||
image-tag: ${{ inputs.stage-name }}-${{ github.sha }} | ||||||
hamishfagg marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
timeout: 600s | ||||||
# We need to wait till deployment is finished here, since the calling workflow might test the deployment env once this job is done | ||||||
wait: "true" | ||||||
- name: Notify of deployment finish | ||||||
# Update the slack message from before with the deployment status | ||||||
uses: mindsdb/github-actions/slack-deploy-msg@main | ||||||
if: always() | ||||||
with: | ||||||
channel-id: ${{ secrets.SLACK_DEPLOYMENTS_CHANNEL_ID }} | ||||||
status: "${{ job.status == 'success' && 'finished' || 'failed' }}" | ||||||
color: "${{ job.status == 'success' && '#00C851' || '#FF4444' }}" | ||||||
env-name: ${{ matrix.deploy-env }} | ||||||
env-url: ${{ vars.ENV_URL }} | ||||||
slack-token: ${{ secrets.GH_ACTIONS_SLACK_BOT_TOKEN }} | ||||||
update-message-id: ${{ steps.slack.outputs.ts }} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
correctness:
envsubst '${IMAGE_TAG} ${NAMESPACE}' < ${{ inputs.migration-job-file }}
will not substitute variables in the YAML unless the YAML contains${IMAGE_TAG}
and${NAMESPACE}
placeholders; if the YAML uses a different variable format or hardcoded values, the migration job will use incorrect image or namespace.🤖 AI Agent Prompt for Cursor/Windsurf
📝 Committable Code Suggestion