Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
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
1 change: 0 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
PRIVATE_KEY=0x...
ETHEREUM_RPC_URL=https://...
ETHEREUM_BACKUP_RPC_URL=https://...
POLYGON_RPC_URL=https://...
TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_ID=
Expand Down
70 changes: 70 additions & 0 deletions .github/workflows/auto-release-pr.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: Auto Release PR

on:
push:
branches: [develop]
workflow_dispatch:

permissions:
contents: read
pull-requests: write

concurrency:
group: auto-release-pr
cancel-in-progress: false

jobs:
create-release-pr:
name: Create Release PR
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Fetch main branch
run: git fetch origin main

- name: Check for existing PR
id: check-pr
run: |
PR_COUNT=$(gh pr list --base main --head develop --state open --json number --jq 'length')
echo "pr_exists=$([[ $PR_COUNT -gt 0 ]] && echo 'true' || echo 'false')" >> $GITHUB_OUTPUT
echo "::notice::Open PRs from develop to main: $PR_COUNT"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Check for differences
id: check-diff
if: steps.check-pr.outputs.pr_exists == 'false'
run: |
DIFF_COUNT=$(git rev-list --count origin/main..origin/develop)
echo "has_changes=$([[ $DIFF_COUNT -gt 0 ]] && echo 'true' || echo 'false')" >> $GITHUB_OUTPUT
echo "commit_count=$DIFF_COUNT" >> $GITHUB_OUTPUT
echo "::notice::Commits ahead of main: $DIFF_COUNT"

- name: Create Release PR
if: steps.check-pr.outputs.pr_exists == 'false' && steps.check-diff.outputs.has_changes == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMMIT_COUNT: ${{ steps.check-diff.outputs.commit_count }}
run: |
printf '%s\n' \
"## Automatic Release PR" \
"" \
"This PR was automatically created after changes were pushed to develop." \
"" \
"**Commits:** ${COMMIT_COUNT} new commit(s)" \
"" \
"### Checklist" \
"- [ ] Review all changes" \
"- [ ] Verify CI passes" \
"- [ ] Approve and merge when ready for production" \
> /tmp/pr-body.md

gh pr create \
--base main \
--head develop \
--title "Release: develop -> main" \
--body-file /tmp/pr-body.md
116 changes: 116 additions & 0 deletions .github/workflows/rangekeeper-dev.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
name: RangeKeeper DEV CI/CD

on:
push:
branches: [develop]
workflow_dispatch:

env:
DEPLOYMENT_ENABLED: false
DOCKER_TAGS: dfxswiss/rangekeeper:beta
AZURE_RESOURCE_GROUP: rg-dfx-api-dev
AZURE_STORAGE_ACCOUNT_NAME: stdfxapidev
AZURE_WORKSPACE_NAME: log-dfx-api-dev
CONTAINER_NAME: ci-dfx-rk-dev
DEPLOY_INFO: ${{ github.ref_name }}-${{ github.sha }}

jobs:
build-and-deploy:
name: Build, test and deploy to DEV
runs-on: ubuntu-latest
defaults:
run:
working-directory: .
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

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

- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ env.DOCKER_TAGS }}

- name: Log in to Azure
uses: azure/login@v2
with:
creds: ${{ secrets.DFX_DEV_CREDENTIALS }}

- name: Get Storage Key
if: env.DEPLOYMENT_ENABLED == 'true'
run: |
STORAGE_KEY=$(az storage account keys list \
--resource-group ${{ env.AZURE_RESOURCE_GROUP }} \
--account-name ${{ env.AZURE_STORAGE_ACCOUNT_NAME }} \
--query '[0].value' -o tsv)
echo "STORAGE_KEY=$STORAGE_KEY" >> $GITHUB_ENV

- name: Get Log Analytics Info
if: env.DEPLOYMENT_ENABLED == 'true'
run: |
LOG_WORKSPACE_ID=$(az monitor log-analytics workspace show \
--resource-group ${{ env.AZURE_RESOURCE_GROUP }} \
--workspace-name ${{ env.AZURE_WORKSPACE_NAME }} \
--query customerId -o tsv)

LOG_WORKSPACE_KEY=$(az monitor log-analytics workspace get-shared-keys \
--resource-group ${{ env.AZURE_RESOURCE_GROUP }} \
--workspace-name ${{ env.AZURE_WORKSPACE_NAME }} \
--query primarySharedKey -o tsv)
echo "LOG_WORKSPACE_ID=$LOG_WORKSPACE_ID" >> $GITHUB_ENV
echo "LOG_WORKSPACE_KEY=$LOG_WORKSPACE_KEY" >> $GITHUB_ENV

- name: Render deployment YAML
if: env.DEPLOYMENT_ENABLED == 'true'
uses: nowactions/envsubst@v1
with:
input: ./aci-dev.yaml
output: ./rendered-aci-dev.yaml
env:
DEPLOY_INFO: ${{ env.DEPLOY_INFO }}
STORAGE_KEY: ${{ env.STORAGE_KEY }}
LOG_WORKSPACE_ID: ${{ env.LOG_WORKSPACE_ID }}
LOG_WORKSPACE_KEY: ${{ env.LOG_WORKSPACE_KEY }}
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
PRIVATE_KEY: ${{ secrets.RK_DEV_PRIVATE_KEY }}
ETHEREUM_RPC_URL: ${{ secrets.RK_DEV_ETHEREUM_RPC_URL }}
POLYGON_RPC_URL: ${{ secrets.RK_DEV_POLYGON_RPC_URL }}
TELEGRAM_BOT_TOKEN: ${{ secrets.RK_DEV_TELEGRAM_BOT_TOKEN }}
TELEGRAM_CHAT_ID: ${{ secrets.RK_DEV_TELEGRAM_CHAT_ID }}
DISCORD_WEBHOOK_URL: ${{ secrets.RK_DEV_DISCORD_WEBHOOK_URL }}

- name: Stop Azure Container Instance
if: env.DEPLOYMENT_ENABLED == 'true'
run: |
az container stop --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --name ${{ env.CONTAINER_NAME }} || true

- name: Delete Azure Container Instance
if: env.DEPLOYMENT_ENABLED == 'true'
run: |
az container delete --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --name ${{ env.CONTAINER_NAME }} --yes || true

- name: Deploy container instance
if: env.DEPLOYMENT_ENABLED == 'true'
run: |
az container create --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --file ./rendered-aci-dev.yaml

- name: Stop container (disabled)
if: env.DEPLOYMENT_ENABLED != 'true'
run: |
az container stop --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --name ${{ env.CONTAINER_NAME }} || true

- name: Logout from Azure
run: |
az logout
if: always()
116 changes: 116 additions & 0 deletions .github/workflows/rangekeeper-prd.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
name: RangeKeeper PRD CI/CD

on:
push:
branches: [main]
workflow_dispatch:

env:
DEPLOYMENT_ENABLED: false
DOCKER_TAGS: dfxswiss/rangekeeper:latest
AZURE_RESOURCE_GROUP: rg-dfx-api-prd
AZURE_STORAGE_ACCOUNT_NAME: stdfxapiprd
AZURE_WORKSPACE_NAME: log-dfx-api-prd
CONTAINER_NAME: ci-dfx-rk-prd
DEPLOY_INFO: ${{ github.ref_name }}-${{ github.sha }}

jobs:
build-and-deploy:
name: Build, test and deploy to PRD
runs-on: ubuntu-latest
defaults:
run:
working-directory: .
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

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

- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ env.DOCKER_TAGS }}

- name: Log in to Azure
uses: azure/login@v2
with:
creds: ${{ secrets.DFX_PRD_CREDENTIALS }}

- name: Get Storage Key
if: env.DEPLOYMENT_ENABLED == 'true'
run: |
STORAGE_KEY=$(az storage account keys list \
--resource-group ${{ env.AZURE_RESOURCE_GROUP }} \
--account-name ${{ env.AZURE_STORAGE_ACCOUNT_NAME }} \
--query '[0].value' -o tsv)
echo "STORAGE_KEY=$STORAGE_KEY" >> $GITHUB_ENV

- name: Get Log Analytics Info
if: env.DEPLOYMENT_ENABLED == 'true'
run: |
LOG_WORKSPACE_ID=$(az monitor log-analytics workspace show \
--resource-group ${{ env.AZURE_RESOURCE_GROUP }} \
--workspace-name ${{ env.AZURE_WORKSPACE_NAME }} \
--query customerId -o tsv)

LOG_WORKSPACE_KEY=$(az monitor log-analytics workspace get-shared-keys \
--resource-group ${{ env.AZURE_RESOURCE_GROUP }} \
--workspace-name ${{ env.AZURE_WORKSPACE_NAME }} \
--query primarySharedKey -o tsv)
echo "LOG_WORKSPACE_ID=$LOG_WORKSPACE_ID" >> $GITHUB_ENV
echo "LOG_WORKSPACE_KEY=$LOG_WORKSPACE_KEY" >> $GITHUB_ENV

- name: Render deployment YAML
if: env.DEPLOYMENT_ENABLED == 'true'
uses: nowactions/envsubst@v1
with:
input: ./aci-prd.yaml
output: ./rendered-aci-prd.yaml
env:
DEPLOY_INFO: ${{ env.DEPLOY_INFO }}
STORAGE_KEY: ${{ env.STORAGE_KEY }}
LOG_WORKSPACE_ID: ${{ env.LOG_WORKSPACE_ID }}
LOG_WORKSPACE_KEY: ${{ env.LOG_WORKSPACE_KEY }}
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
PRIVATE_KEY: ${{ secrets.RK_PRD_PRIVATE_KEY }}
ETHEREUM_RPC_URL: ${{ secrets.RK_PRD_ETHEREUM_RPC_URL }}
POLYGON_RPC_URL: ${{ secrets.RK_PRD_POLYGON_RPC_URL }}
TELEGRAM_BOT_TOKEN: ${{ secrets.RK_PRD_TELEGRAM_BOT_TOKEN }}
TELEGRAM_CHAT_ID: ${{ secrets.RK_PRD_TELEGRAM_CHAT_ID }}
DISCORD_WEBHOOK_URL: ${{ secrets.RK_PRD_DISCORD_WEBHOOK_URL }}

- name: Stop Azure Container Instance
if: env.DEPLOYMENT_ENABLED == 'true'
run: |
az container stop --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --name ${{ env.CONTAINER_NAME }} || true

- name: Delete Azure Container Instance
if: env.DEPLOYMENT_ENABLED == 'true'
run: |
az container delete --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --name ${{ env.CONTAINER_NAME }} --yes || true

- name: Deploy container instance
if: env.DEPLOYMENT_ENABLED == 'true'
run: |
az container create --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --file ./rendered-aci-prd.yaml

- name: Stop container (disabled)
if: env.DEPLOYMENT_ENABLED != 'true'
run: |
az container stop --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --name ${{ env.CONTAINER_NAME }} || true

- name: Logout from Azure
run: |
az logout
if: always()
59 changes: 59 additions & 0 deletions aci-dev.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
apiVersion: 2023-05-01
location: westeurope
name: ci-dfx-rk-dev
type: Microsoft.ContainerInstance/containerGroups
properties:
osType: Linux
containers:
- name: rk
properties:
image: dfxswiss/rangekeeper:beta
resources:
requests:
cpu: 0.5
memoryInGb: 1.0
ports:
- port: 3000
environmentVariables:
# Secrets (from GitHub Secrets)
- name: PRIVATE_KEY
secureValue: '${PRIVATE_KEY}'
- name: ETHEREUM_RPC_URL
secureValue: '${ETHEREUM_RPC_URL}'
- name: POLYGON_RPC_URL
secureValue: '${POLYGON_RPC_URL}'
- name: TELEGRAM_BOT_TOKEN
secureValue: '${TELEGRAM_BOT_TOKEN}'
- name: TELEGRAM_CHAT_ID
secureValue: '${TELEGRAM_CHAT_ID}'
- name: DISCORD_WEBHOOK_URL
secureValue: '${DISCORD_WEBHOOK_URL}'
# Config (changeable)
- name: DEPLOY_INFO
value: '${DEPLOY_INFO}'
- name: LOG_LEVEL
value: 'info'
- name: HEALTH_PORT
value: '3000'
- name: MAX_TOTAL_LOSS_PERCENT
value: '10'
- name: DRY_RUN
value: 'false'
volumeMounts:
- name: volume
mountPath: /app/data
volumes:
- name: volume
azureFile:
shareName: ci-rk
storageAccountName: stdfxapidev
storageAccountKey: '${STORAGE_KEY}'
restartPolicy: Always
imageRegistryCredentials:
- server: index.docker.io
username: '${DOCKER_USERNAME}'
password: '${DOCKER_PASSWORD}'
diagnostics:
logAnalytics:
workspaceId: '${LOG_WORKSPACE_ID}'
workspaceKey: '${LOG_WORKSPACE_KEY}'
Loading
Loading