Skip to content

Deploy multiarch image from temporary registry #98

Deploy multiarch image from temporary registry

Deploy multiarch image from temporary registry #98

name: Build file-server container
on:
workflow_dispatch:
inputs:
fileserver_release_name:
description: 'file-server package version'
required: false
default: 'nightly'
fileserver_ref:
description: 'file-server package ref'
required: false
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
name: Build single-architecture container images
uses: flowforge/github-actions-workflows/.github/workflows/build_container_image.yml@fix-image-manifest-unknown
with:
image_name: 'file-server'
package_dependencies: |
@flowforge/file-server
build_context: 'file-server'
npm_registry_url: ${{ vars.PUBLIC_NPM_REGISTRY_URL }}
secrets:
npm_registry_auth_token: ${{ secrets.NPM_PUBLISH_TOKEN }}
temporary_registry_token: ${{ secrets.GITHUB_TOKEN }}
build-multi-architecture:
name: Build multi-architecture container image
needs: build
uses: flowforge/github-actions-workflows/.github/workflows/merge_multiarch_images.yml@9d655b572fffebb432b259566b68be1a7aff7ed5
with:
image_name: 'file-server'
secrets:
temporary_registry_token: ${{ secrets.GITHUB_TOKEN }}
deploy-stage:
name: Deploy to staging environment
environment: stage
runs-on: ubuntu-latest
needs: build-multi-architecture
permissions:
packages: read
contents: read
steps:
- name: Set unique image tag
id: set-image-tag
run: |
echo "image_tag=nightly-$(date +%Y%m%d%H%m%S)" >> $GITHUB_ENV
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v3
with:
aws-access-key-id: ${{ secrets.STAGING_AWS_ID }}
aws-secret-access-key: ${{ secrets.STAGING_AWS_KEY }}
aws-region: eu-west-1
- name: Login to AWS ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
with:
mask-password: 'true'
- name: Login to temporary registry
id: login-ghcr
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Push image to ECR
uses: akhilerm/[email protected]
with:
src: ${{ needs.build-multi-architecture.outputs.image }}
dst: |
${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.eu-west-1.amazonaws.com/flowforge/file-server:nightly
${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.eu-west-1.amazonaws.com/flowforge/file-server:${{ env.image_tag }}
- name: Configure AWS credentials for EKS interaction
uses: aws-actions/configure-aws-credentials@v3
with:
aws-access-key-id: ${{ secrets.STAGING_AWS_ID }}
aws-secret-access-key: ${{ secrets.STAGING_AWS_KEY }}
aws-region: eu-west-1
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/K8sAdmin
role-duration-seconds: 1200
- name: Setup kubectl
uses: azure/setup-kubectl@v3
with:
version: 'v1.23.4'
- name: Configure kubectl
run:
aws eks update-kubeconfig --region eu-west-1 --name ${{ secrets.EKS_CLUSTER_NAME }}
- name: Update image and wait for deployment to finish
id: update-image
timeout-minutes: 5
run: |
kubectl -n default set image deployment/flowforge-file file-storage=${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.eu-west-1.amazonaws.com/flowforge/file-server:${{ env.image_tag }}
kubectl -n default rollout status deployment/flowforge-file
- name: Rollback failed deployment
if: ${{ failure() && steps.update-image.conclusion == 'failure'}}
run: |
kubectl -n default rollout undo deployment/flowforge-file
kubectl -n default rollout status deployment/flowforge-file
deploy-prod:
if: false
name: Deploy to production environment
environment: production
runs-on: ubuntu-latest
needs: [build-multi-architecture, deploy-stage]
permissions:
packages: read
contents: read
steps:
- name: Set unique image tag
id: set-image-tag
run: |
echo "image_tag=nightly-$(date +%Y%m%d%H%m%S)" >> $GITHUB_ENV
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v3
with:
aws-access-key-id: ${{ secrets.PRODUCTION_AWS_ID }}
aws-secret-access-key: ${{ secrets.PRODUCTION_AWS_KEY }}
aws-region: eu-west-1
- name: Login to AWS ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
with:
mask-password: 'true'
- name: Login to temporary registry
id: login-ghcr
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: "[DEBUG] Pull temporary image"
run:
docker pull ${{ needs.build-multi-architecture.outputs.image }}
- name: Push image to ECR
uses: akhilerm/[email protected]
with:
src: ${{ needs.build-multi-architecture.outputs.image }}
dst: |
${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.eu-west-1.amazonaws.com/flowforge/file-server:nightly
${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.eu-west-1.amazonaws.com/flowforge/file-server:${{ env.image_tag }}
- name: Configure AWS credentials for EKS interaction
uses: aws-actions/configure-aws-credentials@v3
with:
aws-access-key-id: ${{ secrets.STAGING_AWS_ID }}
aws-secret-access-key: ${{ secrets.STAGING_AWS_KEY }}
aws-region: eu-west-1
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/K8sAdmin
role-duration-seconds: 1200
- name: Setup kubectl
uses: azure/setup-kubectl@v3
with:
version: 'v1.23.4'
- name: Configure kubectl
run:
aws eks update-kubeconfig --region eu-west-1 --name ${{ secrets.EKS_CLUSTER_NAME }}
- name: Update image and wait for deployment to finish
id: update-image
timeout-minutes: 5
run: |
kubectl -n default set image deployment/flowforge-file file-storage=${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.eu-west-1.amazonaws.com/flowforge/file-server:${{ env.image_tag }}
kubectl -n default rollout status deployment/flowforge-file
- name: Rollback failed deployment
if: ${{ failure() && steps.update-image.conclusion == 'failure'}}
run: |
kubectl -n default rollout undo deployment/flowforge-file
kubectl -n default rollout status deployment/flowforge-file