web-dev-qa-db-ja.com

Jenkinsパイプラインを使用してGitマージ/プッシュすることは可能ですか

Jenkinsfileを使用してJenkinsワークフローを作成しようとしています。 「develop」ブランチの変更を監視するだけです。変更が発生したら、タグをgitし、マスターにマージします。 GitSCM Stepを使用していますが、サポートしていると思われるのはgit cloneだけです。タグ/マージを実行するためにシェルを作成する必要はありませんが、回避する方法はありません。これが可能かどうかは誰にもわかりますか? GitサーバーにBitBucket(オンプレミス)を使用しています。

24
Progger

以前はフリースタイルジョブのタグ付け/マージ/プッシュを行うプラグインであったGitPublisherプラグインは、Jenkinsパイプラインと互換性があるように更新されていないため、現時点では不可能です。 パイプラインプラグインの互換性ページ と専用の GitPublisher Jira issue の両方でこの問題を追跡できます。

だから、あなたが持っている唯一のオプションは実際にタグ/マージコマンドをシェルアウトすることです...しかし、Gitレポジトリの資格情報の使用など、いくつかのJenkinsビルトイン機能の恩恵を受けることができることに注意してください必要に応じて簡単にタグ付け/マージします。

チェックアウトの例:

git url: "ssh://jenkins@your-git-repo:12345/your-git-project.git",
    credentialsId: 'jenkins_ssh_key',
    branch: develop

タグ/マージ/プッシュは非常に簡単です:

sh 'git tag -a tagName -m "Your tag comment"'
sh 'git merge develop'
sh 'git commit -am "Merged develop branch to master'
sh "git Push Origin master"

いつかGitPublisherがパイプライン互換バージョンでリリースされることを願っていますが、今のところはこの回避策が必要です。

25
Pom12

Gitクレデンシャルが必要な場合は、次のリンクのようなSSHエージェントプラグインを使用できます。 https://issues.jenkins-ci.org/browse/JENKINS-28335?focusedCommentId=260925&page=com。 atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-260925

sshagent(['git-credentials-id']) {
  sh "git Push Origin master"
}
17

私の場合、HTTPSを使用せざるを得ませんでした。私はそれを解決しました:

  1. ユーザー名/パスワード認証情報の作成bitbucketUsernamePassword
  2. その資格情報を使用してチェックアウトします。
  3. チェックアウトを行う前にcredential.helperを設定します。
  4. git checkout branchを実行して、ローカルブランチトラッキングリモートを取得します。

その後、git Pushで物事をプッシュできます。

このような:

sh 'git config --global credential.helper cache'
sh 'git config --global Push.default simple'

checkout([
    $class: 'GitSCM',
    branches: [[name: branch]],
    extensions: [
        [$class: 'CloneOption', noTags: true, reference: '', shallow: true]
    ],
    submoduleCfg: [],
    userRemoteConfigs: [
        [ credentialsId: 'bitbucketUsernamePassword', url: cloneUrl]
    ]
])
sh "git checkout ${branch}" //To get a local branch tracking remote

その後、次のようなことができます:

sh 'git Push'
7
Tomas Bjerre

はい、そうです!!数日間苦労した後、私はスクリプト化されたパイプラインスクリプト用のこれらの簡単なコードブロックになりました。

withCredentials([sshUserPrivateKey(credentialsId: '<credential-id>', keyFileVariable: 'SSH_KEY')]) {
   sh("git Push Origin <local-branch>:<remote-branch>")
}

楽しい!!

4
Litty Philip

このスレッドは本当に役に立ちました。私のJenkinsクレデンシャルはユーザー名/パスワードなので、次を使用しました:

withCredentials([usernamePassword(credentialsId: 'fixed', usernameVariable: 'username', passwordVariable: 'password')]){
                {
                    sh("git Push http://$username:[email protected]/repo")
                }

ユーザー名とパスワードは両方ともログで隠されています:

+ git Push http://****:****@git.corp.mycompany.com/repo
3
s d

私は同様のタスクを実行する必要があり、これを次のバリエーションで動作させることができました: https://issues.jenkins-ci.org/browse/JENKINS-28335?focusedCommentId=320383&page=com。 atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-32038

withCredentials([sshUserPrivateKey(credentialsId: 'ci', keyFileVariable: 'SSH_KEY')]) {
    sh 'echo ssh -i $SSH_KEY -l git -o StrictHostKeyChecking=no \\"\\$@\\" > local_ssh.sh'
    sh 'chmod +x local_ssh.sh'
    withEnv(['GIT_SSH=local_ssh.sh']) {
        sh 'git Push Origin develop'
    }
}

一方、ciは、Jenkins内で設定した資格情報のIDです。 sshキーへのパスは、環境変数SSH_KEYとして使用可能になります。

2
Gregorio Melo

これは青い海のsshagentで動作します(https認証を使用します)

sshagent(credentials: ["406ef572-9598-45ee-8d39-9c9a227a9227"]) {
                    def repository = "git@" + env.GIT_URL.replaceFirst(".+://", "").replaceFirst("/", ":")
                    sh("git remote set-url Origin $repository")
                    sh("git tag --force build-${env.BRANCH_NAME}")
                    sh("git Push --force Origin build-${env.BRANCH_NAME}")
                }
1

私の場合、SSHを介してCodeCommitリポジトリにプッシュしたいと思います。 sshagentが設定されていないため、Userは機能しません。これは最終的に仕事をしました:

withCredentials([sshUserPrivateKey(credentialsId: CODECOMMIT_CREDENTIALS_ID, keyFileVariable: 'SSH_KEY', usernameVariable: 'SSH_USER')]) {
    withEnv(["GIT_SSH_COMMAND=ssh -o StrictHostKeyChecking=no -o User=${SSH_USER} -i ${SSH_KEY}"]) {
        sh 'git Push ${CODECOMMIT_URL} ${COMMIT_ID}:refs/heads/${BRANCH}'
    }
}
1
NeverFall

Litty Philipsの答えは私にほとんど道を譲りましたが、GIT_SSH_COMMANDを定義する必要もありました。

withCredentials([sshUserPrivateKey(credentialsId: '<credential-id>', keyFileVariable: 'SSH_KEY')]) {
   sh """
   GIT_SSH_COMMAND = "ssh -i $SSH_KEY"
   git Push Origin <local-branch>:<remote-branch>
   """
}
0
J Blackburn