Skip to content
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

feat: Proxy colonies M1 #311

Merged
merged 19 commits into from
Jan 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
0e1d6f3
Feat: Handle disable proxy colony metadataDelta event
mmioana Dec 23, 2024
fd93b00
feat: get colonyAddress when requesting a proxy colony and the initia…
bassgeta Jan 6, 2025
2cbac4d
Feat: Re-enable deployed proxy colony
mmioana Jan 6, 2025
8996fd3
feat: create proxy colony requested motion
bassgeta Jan 7, 2025
d6eeddd
feat: link action that finalized a motion to the motion and the motio…
bassgeta Jan 10, 2025
86556a8
Feat: Allow addition of proxy colonies with multisig
davecreaser Jan 9, 2025
14e0714
Fix multisig connection to finalization action
davecreaser Jan 15, 2025
d8481a2
feat: handle enabling and disabling of a proxy colony via a motion
rumzledz Jan 9, 2025
5cb9ad8
feat: remove redundant operation parsing
rumzledz Jan 14, 2025
53afa66
feat: add support for enabling and disable proxy colonies via multi-sig
rumzledz Jan 13, 2025
75b53b7
feat: remove redundant operation parsing
rumzledz Jan 14, 2025
4fa7a94
Move targetChainId up to the top level of colonyAction
davecreaser Jan 16, 2025
fd28eee
Fixes after rebase
davecreaser Jan 21, 2025
8776d33
update main workflow to build main chain
bogdan-1337 Jan 22, 2025
ca781fe
cicd: add changes to dockerfile and new proxy build workflow
bogdan-1337 Jan 22, 2025
c11d40d
cicd: update dockerfile build target logic
bogdan-1337 Jan 22, 2025
a3cd46d
cicd: declare build target in final stage
bogdan-1337 Jan 22, 2025
ee3deac
cicd: rename cicd workflows and update ecr repo for qa prod proxy cha…
bogdan-1337 Jan 22, 2025
a927a71
Fix: Align generated.ts
mmioana Jan 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
220 changes: 220 additions & 0 deletions .github/workflows/build-deploy-proxy.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
name: Block ingestor proxy chain - Build and deploy

on:

workflow_dispatch: # Allows manual workflow trigger
repository_dispatch: # Allows API workflow trigger
types: [cdapp-block-ingestor-proxy-chain]

# push:
# branches:
# - master # Automatically deploy on commits to master
# paths-ignore:
# - '.github/**'
# - '**.md'

concurrency:
group: cdapp-block-ingestor-proxy-chain
cancel-in-progress: true

# Set global env variables
env:
AWS_REGION: eu-west-2
ECR_REPOSITORY: ${{ secrets.AWS_ACCOUNT_ID_QA }}.dkr.ecr.eu-west-2.amazonaws.com/cdapp/block-ingestor-proxy-chain
COMMIT_HASH: ${{ github.event.client_payload.COMMIT_HASH != null && github.event.client_payload.COMMIT_HASH || github.sha }}

jobs:

# Build cdapp block-ingestor and push to AWS ECR
buildAndPush:

runs-on: ubuntu-latest

steps:

- name: Echo Env Vars through Context
run: |
echo "$GITHUB_CONTEXT"

- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID_QA }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY_QA }}
aws-region: ${{ env.AWS_REGION }}

- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1

- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0

- name: Checkout relevant branch
run:
git checkout ${{ github.event.client_payload.COMMIT_HASH != null && github.event.client_payload.COMMIT_HASH || github.sha }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

- name: Build and push
uses: docker/build-push-action@v3
with:
context: ${{ github.workspace }}
file: ./Dockerfile
push: true
build-args: |
BUILD_TARGET=proxy-chain
tags: |
${{ env.ECR_REPOSITORY }}:run-${{ github.run_number }}
${{ env.ECR_REPOSITORY }}:${{ env.COMMIT_HASH }}

- uses: sarisia/actions-status-discord@c193626e5ce172002b8161e116aa897de7ab5383
if: always()
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
title: "Build and push cdapp block-ingestor"

# Deploy cdapp block-ingestor to QA environment
deployQA:

needs: buildAndPush

runs-on: ubuntu-latest

env:
NAMESPACE: cdapp
CLUSTER_NAME: qa-cluster
ENVIRONMENT_TAG: qa
REPOSITORY_NAME: cdapp/block-ingestor-proxy-chain

steps:

- name: Configure AWS credentials for ECR
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID_QA }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY_QA }}
aws-region: ${{ env.AWS_REGION }}

- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1

- name: Echo current image and tag new image
run: |
echo -e "Getting image info...\n"

echo -e "###### Current image being used ######\n"
SHA256=$(aws ecr batch-get-image --repository-name ${{ env.REPOSITORY_NAME }} --image-ids imageTag=${{ env.ENVIRONMENT_TAG }} --output json | jq '.images[].imageId.imageDigest')
aws ecr batch-get-image --repository-name ${{ env.REPOSITORY_NAME }} --image-ids imageDigest=$SHA256 --output json | jq '.images[].imageId'

echo -e "\n###### Tagging new image with environment tag ######"
MANIFEST=$(aws ecr batch-get-image --repository-name ${{ env.REPOSITORY_NAME }} --image-ids imageTag=${{ env.COMMIT_HASH }} --output json | jq --raw-output --join-output '.images[0].imageManifest')
aws ecr put-image --repository-name ${{ env.REPOSITORY_NAME }} --image-tag ${{ env.ENVIRONMENT_TAG }} --image-manifest "$MANIFEST"

echo -e "\n###### New image being used ######\n"
SHA256=$(aws ecr batch-get-image --repository-name ${{ env.REPOSITORY_NAME }} --image-ids imageTag=${{ env.ENVIRONMENT_TAG }} --output json | jq '.images[].imageId.imageDigest')
aws ecr batch-get-image --repository-name ${{ env.REPOSITORY_NAME }} --image-ids imageDigest=$SHA256 --output json | jq '.images[].imageId'

- name: Configure AWS credentials for EKS
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID_QA }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY_QA }}
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID_QA }}:role/eks-admin
role-session-name: github-cicd
role-duration-seconds: 1200
aws-region: ${{ env.AWS_REGION }}

- name: Configure AWS EKS
run: |
aws eks --region ${{ env.AWS_REGION }} update-kubeconfig --name ${{ env.CLUSTER_NAME }}

- name: Deploy to Kubernetes cluster
run: |
kubectl rollout restart deployment/cdapp-block-ingestor-${{ env.ENVIRONMENT_TAG }}-polygon-amoy -n ${{ env.NAMESPACE }}

- name: Validate Kubernetes deployment
run: |
kubectl rollout status deployment/cdapp-block-ingestor-${{ env.ENVIRONMENT_TAG }}-polygon-amoy -n ${{ env.NAMESPACE }}

- uses: sarisia/actions-status-discord@c193626e5ce172002b8161e116aa897de7ab5383
if: always()
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
title: "Deploy cdapp block-ingestor to ${{ env.ENVIRONMENT_TAG }}-polygon-amoy"

# Deploy cdapp block-ingestor to Prod environment
deployProd:

needs: deployQA

environment: prod

runs-on: ubuntu-latest

env:
NAMESPACE: cdapp
CLUSTER_NAME: prod-cluster
ENVIRONMENT_TAG: prod
REPOSITORY_NAME: cdapp/block-ingestor-proxy-chain

steps:

- name: Configure AWS credentials for ECR
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID_QA }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY_QA }}
aws-region: ${{ env.AWS_REGION }}

- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1

- name: Echo current image and tag new image
run: |
echo -e "Getting image info...\n"

echo -e "###### Current image being used ######\n"
SHA256=$(aws ecr batch-get-image --repository-name ${{ env.REPOSITORY_NAME }} --image-ids imageTag=${{ env.ENVIRONMENT_TAG }} --output json | jq '.images[].imageId.imageDigest')
aws ecr batch-get-image --repository-name ${{ env.REPOSITORY_NAME }} --image-ids imageDigest=$SHA256 --output json | jq '.images[].imageId'

echo -e "\n###### Tagging new image with environment tag ######"
MANIFEST=$(aws ecr batch-get-image --repository-name ${{ env.REPOSITORY_NAME }} --image-ids imageTag=${{ env.COMMIT_HASH }} --output json | jq --raw-output --join-output '.images[0].imageManifest')
aws ecr put-image --repository-name ${{ env.REPOSITORY_NAME }} --image-tag ${{ env.ENVIRONMENT_TAG }} --image-manifest "$MANIFEST"

echo -e "\n###### New image being used ######\n"
SHA256=$(aws ecr batch-get-image --repository-name ${{ env.REPOSITORY_NAME }} --image-ids imageTag=${{ env.ENVIRONMENT_TAG }} --output json | jq '.images[].imageId.imageDigest')
aws ecr batch-get-image --repository-name ${{ env.REPOSITORY_NAME }} --image-ids imageDigest=$SHA256 --output json | jq '.images[].imageId'

- name: Configure AWS credentials for EKS
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID_PROD }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY_PROD }}
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID_PROD }}:role/eks-admin
role-session-name: github-cicd
role-duration-seconds: 1200
aws-region: ${{ env.AWS_REGION }}

- name: Configure AWS EKS
run: |
aws eks --region ${{ env.AWS_REGION }} update-kubeconfig --name ${{ env.CLUSTER_NAME }}

- name: Deploy to Kubernetes cluster
run: |
kubectl rollout restart deployment/cdapp-block-ingestor-${{ env.ENVIRONMENT_TAG }}-polygon-mainnet -n ${{ env.NAMESPACE }}

- name: Validate Kubernetes deployment
run: |
kubectl rollout status deployment/cdapp-block-ingestor-${{ env.ENVIRONMENT_TAG }}-polygon-mainnet -n ${{ env.NAMESPACE }}

- uses: sarisia/actions-status-discord@c193626e5ce172002b8161e116aa897de7ab5383
if: always()
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
title: "Deploy cdapp block-ingestor to ${{ env.ENVIRONMENT_TAG }}-polygon-mainnet"
4 changes: 3 additions & 1 deletion .github/workflows/build-deploy.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Build and deploy cdapp block-ingestor docker image
name: Block ingestor main chain - Build and deploy

on:

Expand Down Expand Up @@ -65,6 +65,8 @@ jobs:
context: ${{ github.workspace }}
file: ./Dockerfile
push: true
build-args: |
BUILD_TARGET=main-chain
tags: |
${{ env.ECR_REPOSITORY }}:run-${{ github.run_number }}
${{ env.ECR_REPOSITORY }}:${{ env.COMMIT_HASH }}
Expand Down
16 changes: 16 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# Declare the build argument at the top
ARG BUILD_TARGET=main-chain

FROM node:20-slim AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
Expand Down Expand Up @@ -25,3 +28,16 @@ COPY --from=build /workspace /workspace
WORKDIR /workspace/apps/proxy-chain
CMD ["pnpm", "--filter", "@joincolony/proxy-chain", "prod"]

# Final stage that will be used
FROM ${BUILD_TARGET} AS final

# Re-declare the build argument in the final stage
ARG BUILD_TARGET

# Add labels and echo build info
LABEL build_type=${BUILD_TARGET}
RUN echo "🏗️ Building ${BUILD_TARGET} version of block-ingestor" && \
echo "📦 Final build target: ${BUILD_TARGET}"

# Keep existing CMD from the selected stage

10 changes: 6 additions & 4 deletions apps/main-chain/src/eventListeners/colony.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,6 @@ export const setupListenersForColonies = async (): Promise<void> => {
ContractEventsSignatures.ReputationMiningCycleComplete,
handleReputationMiningCycleComplete,
);
addProxyColoniesEventListener(
ContractEventsSignatures.ProxyColonyRequested,
handleProxyColonyRequested,
);
};

export const setupListenersForColony = (
Expand Down Expand Up @@ -175,6 +171,12 @@ export const setupListenersForColony = (
),
);

addProxyColoniesEventListener(
ContractEventsSignatures.ProxyColonyRequested,
colonyAddress,
handleProxyColonyRequested,
);

/*
* @NOTE Setup both token event listners
*
Expand Down
4 changes: 3 additions & 1 deletion apps/main-chain/src/eventListeners/proxyColonies.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,14 @@ import eventManager from '~eventManager';

export const addProxyColoniesEventListener = (
eventSignature: ContractEventsSignatures,
colonyAddress: string,
handler: EventHandler,
): void =>
eventManager.addEventListener({
type: EventListenerType.ProxyColonies,
eventSignature,
topics: [utils.id(eventSignature)],
address: process.env.CHAIN_NETWORK_CONTRACT ?? '',
address: colonyAddress,
colonyAddress,
handler,
});
3 changes: 0 additions & 3 deletions apps/main-chain/src/handlers/colonies/colonyAdded.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@ import { getColonyContributorId } from '~utils/contributors';
import { tryFetchGraphqlQuery } from '~utils/graphql';
import { createUniqueColony } from './helpers/createUniqueColony';
import { output } from '@joincolony/utils';
import rpcProvider from '~provider';
import networkClient from '~networkClient';
import { getTransactionSignerAddress } from '~utils/transactions';
import { getColonyCreationSalt } from './helpers/validateCreationSalt';

export default async (event: ContractEvent): Promise<void> => {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { Id } from '@colony/colony-js';
import {
ColonyActionType,
GetProxyColonyDocument,
GetProxyColonyQuery,
GetProxyColonyQueryVariables,
UpdateProxyColonyDocument,
UpdateProxyColonyMutation,
UpdateProxyColonyMutationVariables,
} from '@joincolony/graphql';
import { ContractEvent } from '@joincolony/blocks';
import {
DisableProxyColonyOperation,
getColonyFromDB,
getDomainDatabaseId,
writeActionFromEvent,
} from '~utils';
import amplifyClient from '~amplifyClient';

export const handleDisableProxyColony = async (
event: ContractEvent,
operation: DisableProxyColonyOperation,
): Promise<void> => {
const { contractAddress: colonyAddress } = event;
const { agent: initiatorAddress } = event.args;

const foreignChainId = operation.payload[0];

const colony = await getColonyFromDB(colonyAddress);
if (!colony) {
return;
}

const proxyColonyId = `${colonyAddress}_${foreignChainId}`;

const item = await amplifyClient.query<
GetProxyColonyQuery,
GetProxyColonyQueryVariables
>(GetProxyColonyDocument, {
id: proxyColonyId,
});

// If the proxy colony is already disabled, we early-return
if (!item?.data?.getProxyColony?.isActive) {
return;
}

await amplifyClient.mutate<
UpdateProxyColonyMutation,
UpdateProxyColonyMutationVariables
>(UpdateProxyColonyDocument, {
input: {
id: proxyColonyId,
isActive: false,
},
});

await writeActionFromEvent(event, colonyAddress, {
type: ColonyActionType.RemoveProxyColony,
initiatorAddress,
targetChainId: Number(foreignChainId),
multiChainInfo: {
completed: true,
},
fromDomainId: getDomainDatabaseId(colonyAddress, Id.RootDomain),
});
};
Loading