Bitbucket üzerinde repoya push gelmişse otomatik olarak Private github repoya aktarmak için aşağıdaki şekilde jenkins pipeline oluşturmanız yeterlidir.

Job’ı oluştururken “Generic Webhook Trigger” checkbox’ını aktif edip, Request parameters kısımlarına aşağıdaki gibi ekleme yapmanız gerekir.

SOURCE_REPO
DESTINATION_REPO
SOURCE_BRANCH
DESTINATION_BRANCH
bitbucket
image 28
def SOURCE_BRANCH = env.SOURCE_BRANCH
def SOURCE_REPO = env.SOURCE_REPO
def DESTINATION_REPO = env.DESTINATION_REPO
def DESTINATION_BRANCH = env.DESTINATION_BRANCH

node('operation') {
        stage('Checkout Source Repo') {
            git url: SOURCE_REPO
        }

        stage('Stash Pull Branch') {
            sh("git pull origin $SOURCE_BRANCH")
        }

        stage('Add Github Remote Repo') {
            sh("git remote add github $DESTINATION_REPO || true")
        }

        stage('Github Push') {
            sh("git push github $DESTINATION_BRANCH -f")
            sh("git remote remove github || true")
        }
}

Ardından Stash üzerinde Webhook eklemeniz gerekiyor.

Örnek webhook URL’si aşağıdaki gibidir;

https://jenkins.sezer.test/generic-webhook-trigger/invoke?token=github_sync&SOURCE_REPO=ssh://[email protected]:3333/op/github-sync.git&DESTINATION_REPO=https://[email protected]/sezersanlikan/bitbucket-sync.git&SOURCE_BRANCH=master&DESTINATION_BRANCH=master

Tüm brachları SYNC etmek için ilgili Jenkins Pipeline aşağıdaki gibidir;

def SOURCE_REPO = env.SOURCE_REPO
def DESTINATION_REPO = env.DESTINATION_REPO
def RANDOM_NUMBER = Math.abs(new Random().nextInt() % 90000) +10000
def WORKDIR = "/repo-sync-${RANDOM_NUMBER}"

node('operation') {
        stage('Checkout Source Repo') {
            git url: SOURCE_REPO
        }

        stage('Clone Source Repo to Destination Repo') {
            sh """
                mkdir "${WORKDIR}" || true

                echo "Cloning from ${SOURCE_REPO} into ${WORKDIR}..."

                git init --bare "${WORKDIR}"
                cd "${WORKDIR}"

                git config remote.origin.url "${SOURCE_REPO}"
                git config --add remote.origin.fetch '+refs/heads/*:refs/heads/*'
                git config --add remote.origin.fetch '+refs/tags/*:refs/tags/*'
                git config --add remote.origin.fetch '+refs/notes/*:refs/notes/*'
                git config remote.origin.mirror true
                git fetch --all

                echo ""
                echo "Cloned to ${WORKDIR}; pushing to ${DESTINATION_REPO}"

                git push --mirror "${DESTINATION_REPO}"

                echo ""
                echo "Cleaning up temporary directory ${WORKDIR}..."

                rm -rf "${WORKDIR}"

            """
        }
}

Eğer math fonksiyonunu çalıştırırken hata alırsanız scriptApproval urlsine gidip ilgili fonksiyonu onaylayın.