Commit d2f2b64a authored by Watchtek's avatar Watchtek
Browse files

Merge branch 'main' into 'main'

Add auto release(by Gitlab CI)

See merge request !7
parents 954f0271 dbd361d7
Loading
Loading
Loading
Loading
Loading
+93 −2
Original line number Diff line number Diff line
# https://to-be-continuous.biblio19.dev/kicker/
# https://to-be-continuous.gitlab.io/kicker/
# included templates
include:
  # Gitleaks template
  - component: "$CI_SERVER_FQDN/to-be-continuous/gitleaks/gitlab-ci-gitleaks@2.8"
  # Python template
  - component: "$CI_SERVER_FQDN/to-be-continuous/python/gitlab-ci-python@7.11"
    inputs:
      pylint-enabled: true

# your pipeline stages
stages:
  - build
  - test
  - package-build
  - package-test
  - infra
  - deploy
  - acceptance
  - publish
  - infra-prod
  - production

variables:
  TZ: "Asia/Seoul"
  BINARY_NAME: "load_check"   # ✅ set only once here

.default_build_template: &build_template
  stage: package-build
  needs:
    - job: py-lint
      artifacts: false
  script:
    - echo "Creating artifact for $TARGET_OS"
    - pip install -r requirements.txt
    - pyinstaller --onefile ${BINARY_NAME}.py
    - export TS=$(date +%Y-%m-%d_%H%M)
    - |
      if [ "$TARGET_OS" = "windows" ]; then
      mv dist/$DIST_FILE "${BINARY_NAME}_${CI_COMMIT_REF_NAME}_${CI_COMMIT_SHORT_SHA}_${TS}_${TARGET_OS}_amd64.exe"
      else
      mv dist/$DIST_FILE "${BINARY_NAME}_${CI_COMMIT_REF_NAME}_${CI_COMMIT_SHORT_SHA}_${TS}_${TARGET_OS}_amd64"
      fi
  artifacts:
    paths:
      - "${BINARY_NAME}_*"
    expire_in: 1 week
  rules:
    - if: '$CI_COMMIT_TAG'
      when: never
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
      when: on_success
    - if: '$CI_COMMIT_BRANCH =~ /dev|test|ci|pre|production/'
      when: on_success
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
      when: never
    - when: manual

windows_bin:
  <<: *build_template
  image:
    name: batonogov/pyinstaller-windows:latest
    entrypoint: ['']
  variables:
    TARGET_OS: "windows"
    DIST_FILE: "${BINARY_NAME}.exe"

linux_slim_bin:
  <<: *build_template
  image:
    name: batonogov/pyinstaller-linux:latest-slim
    entrypoint: ['']
  variables:
    TARGET_OS: "linux"
    DIST_FILE: "${BINARY_NAME}"

release_job:
  stage: publish
  image: registry.gitlab.com/gitlab-org/cli
  needs:
    - job: windows_bin
      artifacts: true
    - job: linux_slim_bin
      artifacts: true
  before_script:
    - apk add --no-cache curl
  script:
    - sh scripts/release.sh
  rules:
    - if: '$CI_COMMIT_TAG'
      when: never
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
      when: on_success
    - if: '$CI_COMMIT_BRANCH =~ /dev|test|ci|pre|production/'
      when: on_success
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
      when: never
    - when: manual
 No newline at end of file

scripts/release.sh

0 → 100644
+111 −0
Original line number Diff line number Diff line
#!/bin/sh
set -e

echo "=== 🚀 GitLab Release Script with Package Registry ==="

# --- Auth setup ---
if [ -n "$GITLAB_TOKEN" ]; then
    echo "🔑 Using GITLAB_TOKEN for authentication"
else
    echo "❌ GITLAB_TOKEN is required for Release upload (via glab)"
    exit 1
fi

# GitLab instance
export GITLAB_URI="${CI_SERVER_URL:-https://gitlab.com}"
export GITLAB_HOST="${CI_SERVER_HOST:-gitlab.com}"

# --- Tags: one for SHA (immutable), one for branch (rolling) ---
SHA_TAG="ci-${CI_COMMIT_SHORT_SHA}"
SHORT_TAG="$CI_COMMIT_SHORT_SHA"
BRANCH="$CI_COMMIT_BRANCH"

# ✅ Map default branch (main/master) to "latest"
if [ "$CI_COMMIT_BRANCH" = "$CI_DEFAULT_BRANCH" ]; then
  BRANCH_TAG="latest"
else
  BRANCH_TAG="${CI_COMMIT_REF_NAME}"
fi

echo "📦 Publishing Release for $CI_PROJECT_PATH @ $SHORT_TAG ($BRANCH$BRANCH_TAG)"

# --- Collect build artifacts ---
mkdir -p release_files

echo "🔍 Collecting build artifacts for commit $CI_COMMIT_SHORT_SHA ..."
cp *_${CI_COMMIT_SHORT_SHA}_* release_files/ 2>/dev/null || true

if [ -z "$(ls -A release_files)" ]; then
    echo "❌ No artifacts found matching pattern '*_${CI_COMMIT_SHORT_SHA}_*'"
    exit 1
fi

echo "📂 Artifacts in release_files/:"
ls -lh release_files/

# --- Upload to Package Registry ---
upload_and_add_json () {
    file="$1"
    base_label="$2"

    label="$base_label ($BRANCH) ($SHORT_TAG)"

    # ✅ Package registry also uses $BRANCH_TAG (latest for main/master)
    url="$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/load-check/${BRANCH_TAG}/$(basename "$file")"

    echo "⬆️ Uploading $file to Package Registry ($BRANCH_TAG) ..."
    curl --fail --header "JOB-TOKEN: $CI_JOB_TOKEN" \
         --upload-file "$file" "$url"

    if [ "$ASSETS" != "[" ]; then
        ASSETS="$ASSETS,"
    fi
    ASSETS="$ASSETS {\"name\":\"$label\",\"url\":\"$url\",\"link_type\":\"other\"}"
}

# --- Upload artifacts + checksums ---
ASSETS="["

for f in release_files/*; do
  case "$f" in
    *windows_amd64.exe)
      sha_file="${f}.sha256"
      sha256sum "$f" > "$sha_file"

      upload_and_add_json "$f" "Windows binary"
      upload_and_add_json "$sha_file" "Windows binary checksum"
      ;;
    *linux_amd64)
      sha_file="${f}.sha256"
      sha256sum "$f" > "$sha_file"

      upload_and_add_json "$f" "Linux binary"
      upload_and_add_json "$sha_file" "Linux binary checksum"
      ;;
  esac
done

ASSETS="$ASSETS]"

# --- Immutable release by commit SHA ---
echo "📝 Creating immutable release $SHA_TAG ..."
glab release create "$SHA_TAG" \
  -R "https://$CI_SERVER_HOST/$CI_PROJECT_PATH" \
  --ref "$CI_COMMIT_SHA" \
  --name "Release $SHA_TAG" \
  --notes "Binaries built from branch $BRANCH @ $SHORT_TAG" \
  --assets-links="$ASSETS" || echo "⚠️ Release $SHA_TAG already exists, skipping."

# --- Rolling release by branch (always update) ---
echo "📝 Updating rolling release $BRANCH_TAG ..."
glab release delete "$BRANCH_TAG" \
  -R "https://$CI_SERVER_HOST/$CI_PROJECT_PATH" -y || true

glab release create "$BRANCH_TAG" \
  -R "https://$CI_SERVER_HOST/$CI_PROJECT_PATH" \
  --ref "$CI_COMMIT_SHA" \
  --name "Release $BRANCH_TAG" \
  --notes "Binaries built from branch $BRANCH @ $SHORT_TAG" \
  --assets-links="$ASSETS"

echo "✅ Release process finished!"