Skip to content

Commit

Permalink
feat: earthly
Browse files Browse the repository at this point in the history
  • Loading branch information
Skylar Simoncelli committed Sep 19, 2024
1 parent 3b4c996 commit 284b8ba
Show file tree
Hide file tree
Showing 2 changed files with 183 additions and 141 deletions.
152 changes: 11 additions & 141 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,147 +35,17 @@ env:
SSH_AUTH_SOCK: /tmp/ssh_agent.sock

jobs:
build-and-push:
runs-on: ubuntu-latest
if: ${{ github.event.action != 'closed' || github.event.pull_request.merged == true }}
concurrency:
group: pr-${{ github.event.pull_request.number }}-author-${{ github.event.pull_request.user.login }}
cancel-in-progress: true
permissions:
id-token: write
contents: write
steps:
- name: Checkout
uses: actions/checkout@v4
with:
repository: ${{ github.event.inputs.repository }}
ref: ${{ github.event.inputs.branch }}

- name: Setup Earthly
uses: ./.github/earthly-setup
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') }}
with:
ssh_key: ${{ secrets.SUBSTRATE_REPO_SSH_KEY }}
config_tar: ${{ secrets.EARTHLY_TAR }}

- name: Build With Benchmarking Features Enabled
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') && (github.ref_name == 'master' || inputs.upload == 'true') }}
env:
EARTHLY_CI: true
run: |
export EARTHLY_OUTPUT=true
earthly -P +build --PROFILE=production --FEATURES=runtime-benchmarks
- name: Generate and Extract Weights
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') && (github.ref_name == 'master' || inputs.upload == 'true') }}
continue-on-error: true
run: |
repository_name="${GITHUB_REPOSITORY##*/}"
echo "Listing contents on the runner host in /home/runner/work/${repository_name}/${repository_name}:"
ls -la /home/runner/work/${repository_name}/${repository_name}
echo "Pulling Docker image..."
docker pull ubuntu:22.04
mkdir -p weights
echo "Running Docker container..."
docker run -d --name weight_generation \
--memory=4096m \
--cpus=1 \
-v /home/runner/work/${repository_name}/${repository_name}:/workspace \
ubuntu:22.04 \
/bin/bash -c "sleep infinity"
echo "Installing necessary packages inside the container..."
docker exec weight_generation bash -c "\
apt-get update && \
apt-get install -y jq curl build-essential && \
echo 'Checking files in workspace...' && \
ls -la /workspace && \
mkdir -p /workspace/target/production && \
cp /workspace/sidechains-substrate-node /workspace/target/production/sidechains-substrate-node && \
echo 'Verifying the binary is in the expected path...' && \
ls -la /workspace/target/production && \
cd /workspace && \
echo 'Setting the current working directory to /workspace...' && \
chmod +x scripts/run_all_pallet_overhead_and_machine_benchmarks.sh && \
chmod +x scripts/run_storage_benchmarks.sh && \
source .envrc || true && \
./scripts/run_all_pallet_overhead_and_machine_benchmarks.sh -b && \
./scripts/run_storage_benchmarks.sh -b || true"
echo "Finding and copying weight files..."
weight_files=$(docker exec weight_generation find /workspace/runtime/src/weights -name '*.rs')
echo "$weight_files" | while read weight_file; do
weight_file_name=$(basename "$weight_file")
echo "Copying ${weight_file_name}"
docker cp "weight_generation:$weight_file" "weights/${weight_file_name}"
done
docker stop weight_generation
docker rm weight_generation
- name: Upload Weights
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') && (github.ref_name == 'master' || inputs.upload == 'true') }}
continue-on-error: true
uses: actions/upload-artifact@v4
with:
name: weights
path: weights/

- name: Overwrite Weights in Runtime Directory
continue-on-error: true
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') && (github.ref_name == 'master' || inputs.upload == 'true') }}
run: |
pwd
ls -la
sudo chmod -R a+rwx ./runtime/src/weights
for weight_file in weights/*.rs
do
cp "$weight_file" "./runtime/src/weights/$(basename "$weight_file")"
done
- name: Acquire AWS credentials
uses: aws-actions/configure-aws-credentials@v4
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') }}
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN_SECRET }}
aws-region: ${{ env.AWS_REGION }}

- name: Login to container registry
uses: docker/login-action@v3
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') }}
with:
registry: ${{ secrets.ECR_REGISTRY_SECRET }}

- name: Main Build
env:
EARTHLY_CI: true
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') }}
run: |
ref=${{ github.ref_name }}
type=${{ github.ref_type }}
args=("--image=${{ secrets.ECR_REGISTRY_SECRET }}/substrate-node")
event_name="${{ github.event_name }}"
if [[ "$type" == "tag" && "$ref" =~ ^v ]]; then
export EARTHLY_PUSH=true
args+=("--tags=$ref")
elif [[ \
"${{ github.event.pull_request.merged }}" == 'true' \
&& "$ref" == 'master' \
|| "${{ inputs.upload }}" == 'true' \
]]; then
export EARTHLY_PUSH=true
export EARTHLY_OUTPUT=true
fi
if [[ "$EARTHLY_PUSH" == true ]]; then
args+=(--PROFILE=production)
fi
earthly -P +ci ${args[@]}
- name: Upload chain spec artifacts
uses: actions/upload-artifact@v4
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') && (github.ref_name == 'master' || inputs.upload == true) }}
with:
name: chain-specs
path: |
./devnet_chain_spec.json
./staging_chain_spec.json
earthly-build-and-push:
uses: ./.github/workflows/modules/artifacts/earthly-build-and-push.yml
with:
repository: ${{ github.repository }}
branch: ${{ github.head_ref }}
upload: 'true'
secrets:
SUBSTRATE_REPO_SSH_KEY: ${{ secrets.SUBSTRATE_REPO_SSH_KEY }}
EARTHLY_TAR: ${{ secrets.EARTHLY_TAR }}
AWS_ROLE_ARN_SECRET: ${{ secrets.AWS_ROLE_ARN_SECRET }}
ECR_REGISTRY_SECRET: ${{ secrets.ECR_REGISTRY_SECRET }}

deploy-argocd:
needs: build-and-push
Expand Down
172 changes: 172 additions & 0 deletions .github/workflows/modules/artifacts/earthly-build-and-push.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
name: Build and Push

on:
workflow_call:
inputs:
repository:
description: 'Repository to checkout'
required: true
type: string
branch:
description: 'Branch to checkout'
required: true
type: string
upload:
description: 'Whether to upload artifacts'
required: false
default: 'false'
type: string
secrets:
SUBSTRATE_REPO_SSH_KEY:
required: true
EARTHLY_TAR:
required: true
AWS_ROLE_ARN_SECRET:
required: true
ECR_REGISTRY_SECRET:
required: true
permissions:
id-token: write
contents: write

jobs:
build-and-push:
runs-on: ubuntu-latest
if: ${{ github.event.action != 'closed' || github.event.pull_request.merged == true }}
concurrency:
group: pr-${{ github.event.pull_request.number }}-author-${{ github.event.pull_request.user.login }}
cancel-in-progress: true
steps:
- name: Checkout
uses: actions/checkout@v4
with:
repository: ${{ inputs.repository }}
ref: ${{ inputs.branch }}

- name: Setup Earthly
uses: ./.github/earthly-setup
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') }}
with:
ssh_key: ${{ secrets.SUBSTRATE_REPO_SSH_KEY }}
config_tar: ${{ secrets.EARTHLY_TAR }}

- name: Build With Benchmarking Features Enabled
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') && (github.ref_name == 'master' || inputs.upload == 'true') }}
env:
EARTHLY_CI: true
run: |
export EARTHLY_OUTPUT=true
earthly -P +build --PROFILE=production --FEATURES=runtime-benchmarks
- name: Generate and Extract Weights
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') && (github.ref_name == 'master' || inputs.upload == 'true') }}
continue-on-error: true
run: |
repository_name="${GITHUB_REPOSITORY##*/}"
echo "Listing contents on the runner host in /home/runner/work/${repository_name}/${repository_name}:"
ls -la /home/runner/work/${repository_name}/${repository_name}
echo "Pulling Docker image..."
docker pull ubuntu:22.04
mkdir -p weights
echo "Running Docker container..."
docker run -d --name weight_generation \
--memory=4096m \
--cpus=1 \
-v /home/runner/work/${repository_name}/${repository_name}:/workspace \
ubuntu:22.04 \
/bin/bash -c "sleep infinity"
echo "Installing necessary packages inside the container..."
docker exec weight_generation bash -c "\
apt-get update && \
apt-get install -y jq curl build-essential && \
echo 'Checking files in workspace...' && \
ls -la /workspace && \
mkdir -p /workspace/target/production && \
cp /workspace/sidechains-substrate-node /workspace/target/production/sidechains-substrate-node && \
echo 'Verifying the binary is in the expected path...' && \
ls -la /workspace/target/production && \
cd /workspace && \
echo 'Setting the current working directory to /workspace...' && \
chmod +x scripts/run_all_pallet_overhead_and_machine_benchmarks.sh && \
chmod +x scripts/run_storage_benchmarks.sh && \
source .envrc || true && \
./scripts/run_all_pallet_overhead_and_machine_benchmarks.sh -b && \
./scripts/run_storage_benchmarks.sh -b || true"
echo "Finding and copying weight files..."
weight_files=$(docker exec weight_generation find /workspace/runtime/src/weights -name '*.rs')
echo "$weight_files" | while read weight_file; do
weight_file_name=$(basename "$weight_file")
echo "Copying ${weight_file_name}"
docker cp "weight_generation:$weight_file" "weights/${weight_file_name}"
done
docker stop weight_generation
docker rm weight_generation
- name: Upload Weights
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') && (github.ref_name == 'master' || inputs.upload == 'true') }}
continue-on-error: true
uses: actions/upload-artifact@v4
with:
name: weights
path: weights/

- name: Overwrite Weights in Runtime Directory
continue-on-error: true
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') && (github.ref_name == 'master' || inputs.upload == 'true') }}
run: |
pwd
ls -la
sudo chmod -R a+rwx ./runtime/src/weights
for weight_file in weights/*.rs
do
cp "$weight_file" "./runtime/src/weights/$(basename "$weight_file")"
done
- name: Acquire AWS credentials
uses: aws-actions/configure-aws-credentials@v4
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') }}
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN_SECRET }}
aws-region: ${{ env.AWS_REGION }}

- name: Login to container registry
uses: docker/login-action@v3
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') }}
with:
registry: ${{ secrets.ECR_REGISTRY_SECRET }}

- name: Main Build
env:
EARTHLY_CI: true
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') }}
run: |
ref=${{ github.ref_name }}
type=${{ github.ref_type }}
args=("--image=${{ secrets.ECR_REGISTRY_SECRET }}/substrate-node")
event_name="${{ github.event_name }}"
if [[ "$type" == "tag" && "$ref" =~ ^v ]]; then
export EARTHLY_PUSH=true
args+=("--tags=$ref")
elif [[ \
"${{ github.event.pull_request.merged }}" == 'true' \
&& "$ref" == 'master' \
|| "${{ inputs.upload }}" == 'true' \
]]; then
export EARTHLY_PUSH=true
export EARTHLY_OUTPUT=true
fi
if [[ "$EARTHLY_PUSH" == true ]]; then
args+=(--PROFILE=production)
fi
earthly -P +ci ${args[@]}
- name: Upload chain spec artifacts
uses: actions/upload-artifact@v4
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ci-off') && (github.ref_name == 'master' || inputs.upload == true) }}
with:
name: chain-specs
path: |
./devnet_chain_spec.json
./staging_chain_spec.json
./staging_preview_chain_spec.json
./staging_preprod_chain_spec.json

0 comments on commit 284b8ba

Please sign in to comment.