diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 0add5f0..f5a0076 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,4 +1,4 @@ -name: Docker image +name: DockerImage on: push: @@ -17,11 +17,12 @@ 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: | @@ -29,20 +30,22 @@ jobs: 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 }} diff --git a/config.yml b/config.yml index 7c4cbc8..576eae8 100644 --- a/config.yml +++ b/config.yml @@ -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 diff --git a/docker_tag.sh b/docker_tag.sh index 4d102bc..2ecb2ee 100644 --- a/docker_tag.sh +++ b/docker_tag.sh @@ -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