Skip to content

Merge pull request #197 from orochi-network/feature/implement_dynamic… #73

Merge pull request #197 from orochi-network/feature/implement_dynamic…

Merge pull request #197 from orochi-network/feature/implement_dynamic… #73

name: 'Build & Push All Docker Images to Docker Hub with Change Detection'
on:
push:
branches:
- main
jobs:
detect-changes:
name: Detect Changes
runs-on: [self-hosted, linux]
outputs:
filtered_packages: ${{ steps.filter.outputs.filtered_packages }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0 # Fetch full commit history
- name: Detect last two merge commits and diff
id: changed
run: |
LAST_MERGE=$(git log --merges --pretty=format:'%H' -n 2)
MERGE_ARRAY=($LAST_MERGE)
LAST_MERGE_COMMIT=${MERGE_ARRAY[0]}
PREV_MERGE_COMMIT=${MERGE_ARRAY[1]}
echo "Last merge commit: $LAST_MERGE_COMMIT"
echo "Previous merge commit: $PREV_MERGE_COMMIT"
CHANGED_PACKAGES=$(git diff --name-only $PREV_MERGE_COMMIT $LAST_MERGE_COMMIT -- packages/ | cut -d '/' -f 1-2 | sort -u)
CLEANED_PACKAGES=$(echo "$CHANGED_PACKAGES" | tr -d '\r' | tr '\n' ' ')
echo "Cleaned packages: $CLEANED_PACKAGES"
echo "changed_packages=$CLEANED_PACKAGES" >> $GITHUB_ENV
- name: Filter packages using case statement and map to numbers
id: filter
run: |
CHANGED_PACKAGES="${{ env.changed_packages }}"
echo "Changed packages: $CHANGED_PACKAGES"
FILTERED_PACKAGES=""
IFS=' ' read -r -a PACKAGE_ARRAY <<< "$CHANGED_PACKAGES"
for PACKAGE in "${PACKAGE_ARRAY[@]}"; do
case $PACKAGE in
"packages/serverless") FILTERED_PACKAGES="$FILTERED_PACKAGES 1" ;;
"packages/broker-service") FILTERED_PACKAGES="$FILTERED_PACKAGES 2" ;;
"packages/proof-service") FILTERED_PACKAGES="$FILTERED_PACKAGES 3" ;;
"packages/ftp") FILTERED_PACKAGES="$FILTERED_PACKAGES 4" ;;
esac
done
FILTERED_PACKAGES=$(echo $FILTERED_PACKAGES | xargs)
echo "Filtered packages: ${FILTERED_PACKAGES[@]}"
echo "filtered_packages=$FILTERED_PACKAGES" >> $GITHUB_OUTPUT
build:
name: Build & Push Docker Images and Push to GitOps
needs: detect-changes
runs-on: [self-hosted, linux]
outputs:
changed_services: ${{ steps.build.outputs.changed_services }}
env:
version: ${{ github.sha }}
SERVICES: "serverless broker proof ftp"
SERVICES_BUILD: "serverless broker-service proof-service ftp"
DOCKER_REPOS: "orochinetwork/zkdb-serverless orochinetwork/zkdb-broker-service orochinetwork/zkdb-proof-service orochinetwork/zkdb-ftp"
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USER }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
- name: Build & Push Docker Images
id: build
run: |
IFS=' ' read -r -a DOCKER_REPOS <<< "${{env.DOCKER_REPOS}}"
IFS=' ' read -r -a SERVICES_BUILD <<< "${{env.SERVICES_BUILD}}"
IFS=' ' read -r -a SERVICES <<< "${{env.SERVICES}}"
CHANGED_SERVICES="${{ needs.detect-changes.outputs.filtered_packages }}"
for i in ${!SERVICES_BUILD[@]}; do
SERVICE_BUILD="${SERVICES_BUILD[$i]}"
SERVICE="${SERVICES[$i]}"
DOCKER_REPO="${DOCKER_REPOS[$i]}"
echo "Building and pushing $SERVICE_BUILD..."
echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_ACCESS_TOKEN }}" > npm-token
# Build the Docker image with a valid tag
docker build -t "$DOCKER_REPO:latest" \
-f "packages/$SERVICE_BUILD/Dockerfile" \
--secret id=npm,src=./npm-token \
--platform=linux/amd64 .
docker tag "$DOCKER_REPO:latest" "$DOCKER_REPO:${{ env.version }}"
docker push "$DOCKER_REPO:latest"
docker push "$DOCKER_REPO:${{ env.version }}"
done
echo "changed_services=$CHANGED_SERVICES" >> $GITHUB_OUTPUT
gitops-push:
name: Push Changes to GitOps
needs: build
runs-on: [self-hosted, linux]
env:
version: ${{ github.sha }}
gitopsbranch: main
steps:
- name: Push changes to GitOps
run: |
eval $(ssh-agent -s)
echo "${{ secrets.SSH_KEY }}" | tr -d '\r' | ssh-add - > /dev/null 2>&1
mkdir -p ~/.ssh
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.name "${{ secrets.GITOPS_USER }}"
git config --global user.email "${{ secrets.GITOPS_EMAIL }}"
git clone ${{ secrets.GITOPS_REPO }}
cd test-argo-cd
git checkout ${{ env.gitopsbranch }}
CHANGED_SERVICES_ARRAY=("serverless" "broker" "proof" "ftp")
CHANGED_SERVICES=$(IFS=,; echo "${CHANGED_SERVICES_ARRAY[*]}")
echo "Changed services: $CHANGED_SERVICES"
for SERVICE in "${CHANGED_SERVICES_ARRAY[@]}"; do
VALUES_PATH="services/orochi/zkDatabase/$SERVICE/zkdb-$SERVICE/values.yaml"
sed -i "s| tag: .*| tag: ${{ env.version }}|" "$VALUES_PATH"
git add "$VALUES_PATH"
done
echo "Committing and pushing changes for ${CHANGED_SERVICES} to ${{ env.gitopsbranch }} version ${{ env.version }}"
git commit -m "Update versions for: ${CHANGED_SERVICES} to ${{ env.version }}"
git push origin ${{ env.gitopsbranch }}
cd ..
rm -rf test-argo-cd