Skip to content

Commit

Permalink
harbor config
Browse files Browse the repository at this point in the history
  • Loading branch information
Ujstor committed Dec 23, 2024
1 parent 975238a commit 12c1f72
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 40 deletions.
19 changes: 11 additions & 8 deletions .github/workflows/docker-image.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Docker image
name: DockerImage

on:
push:
Expand All @@ -17,32 +17,35 @@ jobs:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to Docker Hub
- name: Login to Harbor
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
registry: harbor.k3s0.ujstor.com
username: ${{ secrets.HARBOR_USERNAME }}
password: ${{ secrets.HARBOR_PASSWORD }}

- name: Install yq
run: |
sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq
sudo chmod +x /usr/bin/yq
- name: Run docker tag sh and export var from config.yml
env:
HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }}
HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }}
run: |
chmod +x ./docker_tag.sh
./docker_tag.sh
- name: Export env variabels
- name: Export env variables
uses: cardinalby/export-env-action@v2
with:
envFile: '.env'

- name: Build and push
if: ${{ env.PUSH_TO_DOCKER == 'true' }}
if: ${{ env.PUSH_TO_HARBOR == 'true' }}
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ env.DOCKER_HUB_USERNAME }}/${{ env.DOCKER_REPO_NAME }}:${{ env.NEW_TAG }}
target: prod
tags: ${{ env.HARBOR_URL }}/${{ env.HARBOR_PROJECT }}/${{ env.HARBOR_REPO }}:${{ env.NEW_TAG }}
9 changes: 5 additions & 4 deletions config.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
docker:
DOCKER_HUB_USERNAME: ujstor
DOCKER_REPO_NAME: portfolio-web-go
VERSION_PART: Patch # Patch, Minor, major
PUSH_TO_DOCKER: true
HARBOR_URL: harbor.k3s0.ujstor.com
HARBOR_PROJECT: docker
HARBOR_REPO: portfolio
VERSION_PART: Major # Patch, Minor, Major
PUSH_TO_HARBOR: true
111 changes: 83 additions & 28 deletions docker_tag.sh
Original file line number Diff line number Diff line change
@@ -1,45 +1,100 @@
#!/bin/bash
set -e

eval $(yq e '.docker | to_entries | .[] | "export \(.key)=\(.value)"' config.yml)
# Load configuration from yaml
eval $(yq e '.docker | to_entries | .[] | "export \(.key)=\(.value)"' docker-config.yml)

DOCKER_IMAGE="$DOCKER_HUB_USERNAME/$DOCKER_REPO_NAME"
# Harbor authentication token
get_harbor_token() {
local token_url="https://${HARBOR_URL}/service/token?service=harbor-registry&scope=repository:${HARBOR_PROJECT}/${HARBOR_REPO}:pull,push"
local token_response=$(curl -s -u "${HARBOR_USERNAME}:${HARBOR_PASSWORD}" "$token_url")
echo "$token_response" | jq -r '.token'
}

TAGS=$(curl -s "https://hub.docker.com/v2/repositories/$DOCKER_IMAGE/tags/?page_size=100" | jq -r '.results[].name')
# Get tags from Harbor
get_harbor_tags() {
local token=$1
if [ -z "$token" ]; then
return 1
fi

if [ -z "$TAGS" ]; then
DEFAULT_TAG="0.0.1"
NEW_TAG="$DEFAULT_TAG"
else
LATEST_TAG=$(echo "$TAGS" | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | tail -n 1)
# Try v2 API first
local api_url="https://${HARBOR_URL}/v2/${HARBOR_PROJECT}/${HARBOR_REPO}/tags/list"
local response=$(curl -s -H "Authorization: Bearer $token" "$api_url")
local tags=$(echo "$response" | jq -r '.tags[]' 2>/dev/null)
# If V2 API fails, try V2.0 API

if [ -z "$LATEST_TAG" ]; then
LATEST_TAG="0.0.1"
if [ -z "$tags" ]; then
api_url="https://${HARBOR_URL}/api/v2.0/projects/${HARBOR_PROJECT}/repositories/${HARBOR_REPO}/artifacts"
response=$(curl -s -H "Authorization: Bearer $token" "$api_url")
tags=$(echo "$response" | jq -r '.[].tags[].name' 2>/dev/null)
fi

IFS='.' read -ra PARTS <<< "$LATEST_TAG"
MAJOR=${PARTS[0]}
MINOR=${PARTS[1]}
PATCH=${PARTS[2]}

if [[ "$VERSION_PART" == "Major" ]]; then
NEW_TAG="$((MAJOR + 1)).0.0"
elif [[ "$VERSION_PART" == "Minor" ]]; then
NEW_TAG="$MAJOR.$((MINOR + 1)).0"
elif [[ "$VERSION_PART" == "Patch" ]]; then
NEW_TAG="$MAJOR.$MINOR.$((PATCH + 1))"
else
echo "Invalid version part specified. Usage: $0 [Major|Minor|Patch]"
echo "$tags"
}

# Get latest version from tags
get_latest_version() {
local tags="$1"
local latest_version="0.0.0"
while read -r tag; do
if ! [[ $tag =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
continue
fi
if [ "$(printf '%s\n' "$latest_version" "$tag" | sort -V | tail -n1)" = "$tag" ]; then
latest_version=$tag
fi
done <<< "$tags"
echo "$latest_version"
}

main() {
TOKEN=$(get_harbor_token)
if [ -z "$TOKEN" ]; then
echo "Failed to get valid token"
exit 1
fi
fi

TAGS=$(get_harbor_tags "$TOKEN")

if [ -z "$TAGS" ]; then
NEW_TAG="0.0.1"
else
LATEST_TAG=$(get_latest_version "$TAGS")
IFS='.' read -ra PARTS <<< "$LATEST_TAG"
MAJOR=${PARTS[0]}
MINOR=${PARTS[1]}
PATCH=${PARTS[2]}

case "$VERSION_PART" in
"Major")
NEW_TAG="$((MAJOR + 1)).0.0"
;;
"Minor")
NEW_TAG="$MAJOR.$((MINOR + 1)).0"
;;
"Patch")
NEW_TAG="$MAJOR.$MINOR.$((PATCH + 1))"
;;
*)
echo "Invalid version part specified. Usage: $0 [Major|Minor|Patch]"
exit 1
;;
esac
fi

create_env_file
}

# Create .env file
create_env_file() {
cat << EOF > .env
DOCKER_HUB_USERNAME=$DOCKER_HUB_USERNAME
DOCKER_REPO_NAME=$DOCKER_REPO_NAME
HARBOR_URL=$HARBOR_URL
HARBOR_PROJECT=$HARBOR_PROJECT
HARBOR_REPO=$HARBOR_REPO
NEW_TAG=$NEW_TAG
PUSH_TO_DOCKER=$PUSH_TO_DOCKER
PUSH_TO_HARBOR=$PUSH_TO_HARBOR
EOF
}

create_env_file
main

0 comments on commit 12c1f72

Please sign in to comment.