diff --git a/.github/workflows/sync-api.yml b/.github/workflows/sync-api.yml new file mode 100644 index 000000000..19d4280d6 --- /dev/null +++ b/.github/workflows/sync-api.yml @@ -0,0 +1,29 @@ +name: Sync Api +on: + push: + paths: + - 'staging/src/github.com/clusterpedia-io/api/*' +jobs: + sync-api: + name: Sync Api + runs-on: ubuntu-latest + env: + WORKSPACE: ${{ github.workspace }}/src/github.com/clusterpedia-io/clusterpedia + GH_TOKEN: ${{ secrets.CLUSTERPEDIA_BOT_TOKEN }} + MESSAGE: ${{ github.event.head_commit.message }} + REFTYPE: ${{ github.ref_type }} + TAGNAME: ${{ github.ref_name }} + REF: ${{ github.ref }} + defaults: + run: + working-directory: ${{ env.WORKSPACE }} + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + token: ${{ secrets.CLUSTERPEDIA_BOT_TOKEN }} + path: ${{ env.WORKSPACE }} + ref: ${{ github.ref }} + fetch-depth: 0 + - run: hack/sync-api.sh + diff --git a/hack/sync-api.sh b/hack/sync-api.sh new file mode 100755 index 000000000..713a49b8f --- /dev/null +++ b/hack/sync-api.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +function usage() { + cat </dev/null);set -e +if [ -z $REPO_ROOT ]; then + if [ -z $API_ROOT ]; then + echo "the current directory is not in the clusterpedia api path, please set API_ROOT=" + usage + exit 1 + fi + REPO_ROOT=$(pwd) +else + API_ROOT="${REPO_ROOT}/staging/src/github.com/clusterpedia-io/api" +fi + +if [ -z $GH_TOKEN ]; then + echo "the github token is not in the env, please check CLUSTERPEDIA_BOT_TOKEN" + usage + exit 1 +else + API_REPO="https://$GH_TOKEN@github.com/clusterpedia/api.git" +fi + +raw=$(git branch -r --contains $REF) +BRANCH_NAME=${raw/origin\/} + +TAG_MESSAGE=$(git tag -l --format="%(contents)" $TAGNAME) + +install_filter_repo(){ + python3 -m pip install --user git-filter-repo +} + + +# check tag, if exist, delete it +check_tag(){ + git tag -d $TAGNAME + if [ -n "$(git ls-remote --tags origin -l $TAGNAME)" ]; then + echo "tag already exist, delete it before retag" + git push -d origin $TAGNAME + git tag -d $TAGNAME + fi +} + +check_branch(){ + if [ -z "$(git ls-remote --exit-code --heads origin $BRANCH_NAME)" ]; then + echo "remote branch does not exist, create it" + git checkout -b $BRANCH_NAME + git push --set-upstream origin $BRANCH_NAME + else + git checkout $BRANCH_NAME + fi +} + +sync_api(){ + if [ $REFTYPE == "tag" ]; then + git filter-repo --subdirectory-filter staging/src/github.com/clusterpedia-io/api --force + git remote add origin $API_REPO + check_tag + git tag $TAGNAME -a -m $TAG_MESSAGE + git push origin $TAGNAME + echo "push tag success~" + else + git filter-repo --subdirectory-filter staging/src/github.com/clusterpedia-io/api --force + git remote add origin $API_REPO + git push origin $BRANCH_NAME + echo "sync code success~" + fi +} + +install_filter_repo + +sync_api +