Restore workflows #4
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: .Helm Deployer | ||
on: | ||
workflow_call: | ||
inputs: | ||
### Required | ||
# Only secrets! | ||
### Typical / recommended | ||
atomic: | ||
description: Atomic deployment? That means fail all or nothing | ||
default: true | ||
required: false | ||
type: string | ||
directory: | ||
description: Chart directory | ||
default: 'charts/app' | ||
required: false | ||
type: string | ||
environment: | ||
description: Environment name; omit for PRs | ||
required: false | ||
type: string | ||
oc_server: | ||
default: https://api.silver.devops.gov.bc.ca:6443 | ||
description: OpenShift server | ||
required: false | ||
type: string | ||
params: | ||
description: Extra parameters to pass to helm upgrade | ||
required: false | ||
type: string | ||
tag: | ||
description: Specify a tag to deploy; defaults to PR number | ||
required: false | ||
type: string | ||
triggers: | ||
description: Paths used to trigger a deployment; e.g. ('./backend/' './frontend/) | ||
required: false | ||
type: string | ||
db_user: | ||
description: The database user | ||
required: false | ||
type: string | ||
### Usually a bad idea / not recommended | ||
timeout-minutes: | ||
description: 'Timeout minutes' | ||
default: 10 | ||
required: false | ||
type: number | ||
values: | ||
description: 'Values file' | ||
default: 'values.yaml' | ||
required: false | ||
type: string | ||
outputs: | ||
tag: | ||
description: 'Which tag was used for deployment?' | ||
value: ${{ jobs.deploy.outputs.tag }} | ||
triggered: | ||
description: 'Has a deployment has been triggered?' | ||
value: ${{ jobs.deploy.outputs.triggered }} | ||
secrets: | ||
oc_namespace: | ||
description: OpenShift namespace | ||
required: true | ||
oc_token: | ||
description: OpenShift token | ||
required: true | ||
jobs: | ||
deployer-db: | ||
name: Database | ||
uses: ./.github/workflows/.deployer-db.yml | ||
secrets: | ||
oc_namespace: ${{ secrets.OC_NAMESPACE }} | ||
oc_token: ${{ secrets.OC_TOKEN }} | ||
with: | ||
environment: ${{ inputs.environment }} | ||
triggers: ${{ inputs.triggers }} | ||
deploy: | ||
name: Stack | ||
needs: deployer-db | ||
environment: ${{ inputs.environment }} | ||
runs-on: ubuntu-24.04 | ||
outputs: | ||
tag: ${{ inputs.tag || steps.pr.outputs.pr }} | ||
triggered: ${{ steps.deploy.outputs.triggered }} | ||
steps: | ||
- uses: actions/checkout@v4 | ||
Variables | ||
- if: inputs.tag == '' | ||
id: pr | ||
uses: bcgov/[email protected] | ||
- id: vars | ||
run: | | ||
# Vars: tag and release | ||
# Tag defaults to PR number, but can be overridden by inputs.tag | ||
tag=${{ inputs.tag || steps.pr.outputs.pr }} | ||
# Release name includes run numbers to ensure uniqueness | ||
release=${{ github.event.repository.name }}-${{ inputs.environment || steps.pr.outputs.pr || inputs.tag }} | ||
# version, to support helm packaging for non-pr based releases (workflow_dispatch). default to 1.0.0+github run number | ||
version=1.0.0+${{ github.run_number }} | ||
# Summary | ||
echo "tag=${tag}" | ||
echo "release=${release}" | ||
echo "version=${version}" | ||
# Output | ||
echo "tag=${tag}" >> $GITHUB_OUTPUT | ||
echo "release=${release}" >> $GITHUB_OUTPUT | ||
echo "version=${version}" >> $GITHUB_OUTPUT | ||
## Deploy | ||
- name: Stop pre-existing deployments on PRs (status = pending-upgrade) | ||
if: github.event_name == 'pull_request' | ||
uses: bcgov/[email protected] | ||
with: | ||
oc_namespace: ${{ secrets.oc_namespace }} | ||
oc_token: ${{ secrets.oc_token }} | ||
oc_server: ${{ vars.oc_server }} | ||
triggers: ${{ inputs.triggers }} | ||
commands: | | ||
# Interrupt any previous deployments (PR only) | ||
PREVIOUS=$(helm status ${{ steps.vars.outputs.release }} -o json | jq .info.status || true) | ||
if [[ ${PREVIOUS} =~ pending ]]; then | ||
echo "Rollback triggered" | ||
helm rollback ${{ steps.vars.outputs.release }} || \ | ||
helm uninstall ${{ steps.vars.outputs.release }} | ||
fi | ||
- name: Helm Deploy | ||
id: deploy | ||
uses: bcgov/action-oc-runner@main | ||
with: | ||
oc_namespace: ${{ secrets.oc_namespace }} | ||
oc_token: ${{ secrets.oc_token }} | ||
oc_server: ${{ vars.oc_server }} | ||
triggers: ${{ inputs.triggers }} | ||
commands: | | ||
# Deploy | ||
# If directory provided, cd to it | ||
[ -z "${{ inputs.directory }}" ]|| cd ${{ inputs.directory }} | ||
# Helm package | ||
sed -i 's/^name:.*/name: ${{ github.event.repository.name }}/' Chart.yaml | ||
helm package -u . --app-version="tag-${{ steps.vars.outputs.tag }}_run-${{ github.run_number }}" --version=${{ steps.pr.outputs.pr || steps.vars.outputs.version }} | ||
# Helm upgrade/rollout | ||
helm upgrade \ | ||
--set-string global.repository=${{ github.repository }} \ | ||
--set-string global.tag=${{ steps.vars.outputs.tag }} \ | ||
--set-string global.config.databaseUser=${{ inputs.db_user }} \ | ||
${{ inputs.params }} \ | ||
--install --wait ${{ inputs.atomic && '--atomic' || '' }} ${{ steps.vars.outputs.release }} \ | ||
--timeout ${{ inputs.timeout-minutes }}m \ | ||
--values ${{ inputs.values }} \ | ||
./${{ github.event.repository.name }}-${{ steps.pr.outputs.pr || steps.vars.outputs.version }}.tgz | ||
# Helm release history | ||
helm history ${{ steps.vars.outputs.release }} | ||
# Completed pod cleanup | ||
oc delete po --field-selector=status.phase==Succeeded || true | ||
- env: | ||
results: ${{ toJSON(steps.deploy) }} | ||
run: | | ||
# Verify outputs | ||
echo "Outputs: ${{ env.results }}" | ||
if [ "${{ steps.deploy.outputs.triggered }}" != "true" ]; then | ||
echo "Error! Verify outputs." | ||
exit 1 | ||
fi |