日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Gitlab-ci 替代 webhook 触发Jenkins job

發(fā)布時間:2025/3/8 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Gitlab-ci 替代 webhook 触发Jenkins job 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

導(dǎo)讀:網(wǎng)易云信的 gitlab 服務(wù)器搭建在外網(wǎng),Jenkins 服務(wù)器搭建在內(nèi)網(wǎng),因此 gitlab 沒辦法直接把 webhook 發(fā)送給Jenkins,而?pipeline 的搭建采用第三方 relay 轉(zhuǎn)發(fā)的方式,但是這個 relay 經(jīng)常“罷工”。本文根據(jù)網(wǎng)易云信的落地實踐,詳細介紹了如何借助 Gitlab-ci 替代 webhook 觸發(fā) Jenkins job。

文|鄒李勇 網(wǎng)易云信資深 C++ 開發(fā)/DevOps 工程師

背景

Gitlab 如何觸發(fā) Jenkins job?

?

我們 push 代碼或提交 merge request 的時候,gitlab 會發(fā)送一個webhook(單純地理解成一個 http 請求或 restful api 即可)給 Jenkins,請求執(zhí)行某個 job。

困境?

網(wǎng)易云信使用的 gitlab 服務(wù)由杭研維護,服務(wù)器搭建在外網(wǎng)。而我們的? Jenkins 服務(wù)器搭建在內(nèi)網(wǎng),這意味著 gitlab 沒辦法直接把 webhook 發(fā)送給Jenkins,而我們的 pipeline 在搭建之初采用了第三方 relay 轉(zhuǎn)發(fā)的方式,把 gitlab 的 webhook 轉(zhuǎn)發(fā)給 Jenkins。雖然把 webhook 從 gitlab 發(fā)送到 Jenkins 的目的達到了,但是這個免費的第三方 relay 可能經(jīng)常“罷工”。

借助 Gitlab-ci 替代 webhook 觸發(fā) Jenkins job

?gitlab-ci?

簡單來講,gitlab-ci 是 gitlab 自帶的特性,通過源碼根目錄下的 .gitlab-ci.yml 文件配置。在代碼? push 或 merge request 的時候自動運行。

以下是官方的解釋:

GitLab Auto DevOps is a collection of pre-configured features and integrations that work together to support your software delivery process.

GitLab CI/CD can automatically build, test, deploy, and monitor your applications by using Auto DevOps.

To use GitLab CI/CD, you need:

  • Application code hosted in a Git repository.

  • A file called .gitlab-ci.yml in the root of your repository, which contains the CI/CD configuration.

官方的 you need 中其實還少了一點 —— GitLab runner,運行 GitLab-ci job 的地方,也就是說 .gitlab-ci.yml 中定義的所有工作都會分發(fā)到這里。

在我們這個實踐中,我們會在 GitLab runner 中搭建一套 python 環(huán)境和 python-jenkins 模塊,然后通過 python 腳本觸發(fā) Jenkins job,最后把這個觸發(fā) Jenkins job 的 python 腳本部署到 gitlab-ci 中。

因此整個實踐分成3個部分。

  • 搭建 Gitlab runner

  • 通過 python-jenkins 觸發(fā) Jenkins job

  • 使用 gitlab-ci 在 push 代碼和 merge request 時調(diào)用 python 腳本

  • ?搭建 gitlab runner?

    安裝 gitlab runner 客戶端

    官方:GitLab Runner can be installed and used on GNU/Linux, macOS, FreeBSD, and Windows.

    因此選擇任意一臺長期在線的打包機即可。筆者推薦優(yōu)先選擇 GNU/Linux,通常 linux 上搭建常駐服務(wù)要比其他系統(tǒng)更方便,MacOS 次之,最后是 Windows。

    以下是 GNU/Linux 平臺的安裝方法的搬運:

    • Download

      To download the appropriate package for your system:

    - Find the latest file name and options athttps://gitlab-runner-downloads.s3.amazonaws.com/latest/index.html.

    - Choose a version and download a binary, as described in the documentation for downloading any other tagged releases for bleeding edge GitLab Runner releases.

    For example, for Debian or Ubuntu:

    # Replace ${arch} with any of the supported architectures, e.g. amd64, arm, arm64# A full list of architectures can be found here https://gitlab-runner-downloads.s3.amazonaws.com/latest/index.htmlcurl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_${arch}.deb"

    For example, for CentOS or Red Hat Enterprise Linux:

    ???????

    # Replace ${arch} with any of the supported architectures, e.g. amd64, arm, arm64# A full list of architectures can be found here https://gitlab-runner-downloads.s3.amazonaws.com/latest/index.htmlcurl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_${arch}.rpm"

    • Install

      - Install the package for your system as follows.

      For example, for Debian or Ubuntu:

    dpkg -i gitlab-runner_<arch>.deb

    For example, for CentOS or Red Hat Enterprise Linux:

    rpm -i gitlab-runner_<arch>.rpm

    其他平臺的安裝方案請點擊官方教程傳送門:

    https://docs.gitlab.com/runner/install/

    通常作為一個 trigger 代理,任務(wù)開銷很小,我們可以把 /etc/gitlab-runner/config.toml 配置里的 concurrent 可以改得大一些,以支持更高的并發(fā)量。

    注冊 gitlab runner

    • 注意

      - 搭建 gitlab runner 每臺 runner 只需要執(zhí)行一次

      - 注冊 gitlab runner 每個 git 倉庫每臺 runner 都需要單獨注冊

    • 準備工作

      -?先登入 gitlab,進入對應(yīng)的 git 倉庫(project)

      -?展開左邊側(cè)邊欄最下面 Settings -> CI/CD。點擊頁面上 Runners 欄右邊的 Expand,頁面往下滾動一點可看到大概如下,注意紅框中的內(nèi)容。

    • 注冊

      以官方 GNU/Linux 為例,其他平臺高度雷同。

      1. Run the following command:

    sudo gitlab-runner register

    2.?Enter your GitLab instance URL.

    上圖紅框中 Register the runner with this URL 下面的內(nèi)容。

    3.?Enter the token you obtained to register the runner.

    上圖紅框中 And this registration token 下面內(nèi)容。

    4. Enter a description for the runner. You can change this value later in the GitLab user interface.

    在 gitlab 中顯示的 runner 描述,該實踐中我們把他當(dāng)名字用,叫 scapegoat-01。

    5. Enter the tags associated with the runner, separated by commas. You can change this value later in the GitLab user interface.

    tag 相當(dāng)于Jenkins中的 label, 用于 runner 分類。該實踐中輸入 scapegoat。

    6. Provide the runner executor. For most use cases, enter docker.

    這里我們選 shell, window 可選 powershell。

    其他平臺命令相同,官方傳送門:

    https://docs.gitlab.com/runner/register/index.html。

    注冊成功后可在紅框下面 Available specific runners 里看到我們剛剛注冊的 runner,類似下圖。其中:

    • scapegoat-01 是 runner 的 description

    • scapegoat 對應(yīng) runner 的 tag,tag 可以不只一個

    通過 python-jenkins 觸發(fā) Jenkins job?

    環(huán)境安裝

    • 在 gitlab runner 里安裝 python

      Linux 發(fā)行版中一般自帶,Debian 系列可以使用以下命令,其他平臺可以 Google 查看。

    sudo apt install python或sudo apt install python3

    • 安裝 pip

      python3 通常自帶,python 需要自己安裝。

    sudo apt install python-pip

    • 安裝 python-jenkins

    python -m pip install python-jenkinsor python3 -m pip install python-jenkins
    • 獲取 gitlab access token

      登入 jenkins,點擊菜單欄右邊的用戶圖標。

      在彈出的左側(cè)邊欄點擊 Configure。

      在 APT Token 欄點擊 Add new token,輸入 token 名,點擊 Generate。

    如下紅框中的內(nèi)容就是新生成的 token,在下面 python 腳本中要用。

    編寫 python 腳本

    #!/usr/bin/python# file name: Jenkins-Compile-trigger.py import jenkinsimport requestsimport timeimport sysimport os jenkins_url = "http://yunxin-jenkins.netease.im:8080"# gitlab的登錄賬號jenkins_user = "zouliyong" #獲取gitlab access token章節(jié)獲取到的tokenjenkins_token = "xxxxxxxxxxxxxxxxx" #Jenkins job namejob_name = "Lava-CI"#從gitlab-ci中獲取Jenkins job的參數(shù),按需修改job_parameters = { "_GitlabSourceBranch" : os.getenv("CI_MERGE_REQUEST_SOURCE_BRANCH_NAME"), "_GitlabTargetBranch" : os.getenv("CI_MERGE_REQUEST_TARGET_BRANCH_NAME"), "_GitlabMergeRequestLastCommit" : os.getenv("CI_COMMIT_SHA"), "_GitlabSourceRepoHomepage" : os.getenv("CI_PROJECT_URL"), "_GitlabMergeRequestIid" : os.getenv("CI_MERGE_REQUEST_IID"), "_GitlabPipelineId" : os.getenv("CI_PIPELINE_ID"), "_GitlabPipelineUrl" : os.getenv("CI_PIPELINE_URL"), "_GitlabJobId" : os.getenv("CI_JOB_ID"), "_GitlabUserName" : os.getenv("GITLAB_USER_NAME"), "_GitlabUserEmail" : os.getenv("GITLAB_USER_EMAIL")} build_number = 0build_info = {"building" : False} print("jenkins job name: ", job_name)print("jenkins job parameters: ", job_parameters) #連接Jenkins服務(wù)server = jenkins.Jenkins(jenkins_url, username= jenkins_user, password= jenkins_token) #獲取Jenkins job最后一次build的build numberdef last_build_number(server, job): last_build = server.get_job_info(job)['lastBuild'] return 1 if None == last_build else last_build['number']last_build = server.get_job_info(job_name)['lastBuild']next_build_number = last_build_number(server, job_name) + 1 #觸發(fā)Jenkinsjobqueue_id = server.build_job(job_name, parameters=job_parameters)print("Jenkins build is waiting for running [queue id = %d] ..." % queue_id)sys.stdout.flush() #到這里,Jenkins job已經(jīng)被放到執(zhí)行隊列里了,#只是觸發(fā)不用等待Jenkins job結(jié)束的話,python腳本可以到此為止 #等待Jenkins job開始執(zhí)行while True: if next_build_number <= last_build_number(server, job_name): try: build_info = server.get_build_info(job_name, next_build_number) except requests.exceptions.RequestException as e: print(e) server = jenkins.Jenkins(jenkins_url, username= jenkins_user, password= jenkins_token) build_info = server.get_build_info(job_name, next_build_number) if queue_id == build_info["queueId"]: build_number = next_build_number print("build number: %d" % build_number) break next_build_number = next_build_number + 1 time.sleep(0.1) print("Jenkins build is running [build number = %d] ..." % build_number)print("Jenkins job URL: %s/job/%s/%d/display/redirect" % (jenkins_url, job_name, build_number))sys.stdout.flush() #到這里Jenkins job已經(jīng)被正式調(diào)度,并開始執(zhí)行 #等待Jenkins job執(zhí)行結(jié)束while build_info["building"]: try: build_info = server.get_build_info(job_name, build_number) except requests.exceptions.RequestException as e: print(e) server = jenkins.Jenkins(jenkins_url, username= jenkins_user, password= jenkins_token) build_info = server.get_build_info(job_name, build_number) time.sleep(1) # 獲取執(zhí)行結(jié)果result = server.get_build_info(job_name, build_number)["result"]print("jenkins build result: %s" % result)assert("SUCCESS" == result)

    運行如上腳本即可觸發(fā)對應(yīng)的 Jenkins job,

    python Jenkins-Compile-trigger.py

    使用 gitlab-ci 在 push 代碼和 merge request 時調(diào)用 python 腳本編寫 .gitlab-ci.yml 文件。

    #file name: .gitlab-ci.yml stages: - build # 在代碼push的時候觸發(fā)Compilation: stage: build tags: - scapegoat # runner tag 參照上面注冊gitlab runner章節(jié) script: - python Jenkins-Compile-trigger.py # 只在merge request的時候觸發(fā)CI: stage: build tags: - scapegoat script: # 這個腳本可以根據(jù)情況參照Jenkins-Compile-trigger.py自行修改 - python Jenkins-CI-trigger.py only: - merge_requests

    把如上 .gitlab-ci.yml 和觸發(fā)用 Jenkins job 的 python 一起放在源碼根目錄下,同代碼一起上傳倉庫。通過 gitlab-ci 觸發(fā) Jenkins job 的功能就實現(xiàn)了。

    作者介紹?

    鄒李勇,網(wǎng)易云信資深 C++ 開發(fā)/DevOps 工程師。Linux 平臺 RTC SDK 開發(fā),負責(zé) DevOps 系統(tǒng)開發(fā)和運維。

    總結(jié)

    以上是生活随笔為你收集整理的Gitlab-ci 替代 webhook 触发Jenkins job的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲免费资源 | 曰韩精品 | 国产精品成人免费精品自在线观看 | 中国黄色a级片 | 亚洲一区二区三区四区五区六区 | 欧美一区二区三区激情 | 992tv成人免费视频 | 精品国产一区二区不卡 | 欧美性另类 | 久久色在线视频 | 男人操女人下面 | 精品在线观看一区二区 | 九九热国产在线 | 手机在线一区 | 狠狠干一区二区 | 日韩在线中文字幕 | xxxx日本免费 | 在线观看免费观看 | 久久男人网 | 天天干天天操天天爱 | 九九福利视频 | 91免费在线播放 | 久久精品女人 | 成人教育av在线 | 日本aⅴ片 | 亚州欧美 | 深爱激情综合 | 精品国产乱码一区二区 | 日韩精品在线播放 | 麻豆免费av | 可以免费看黄的网站 | 中文字幕在线网站 | 国产观看| 亚洲色诱| 国产精品一二三区在线观看 | 日本一区精品视频 | 午夜视频福利网站 | 国产主播毛片 | 午夜影院免费在线观看 | 亚洲欧美日韩在线播放 | 成人在线播放网站 | 久草一区| 黄色日b片 | 热久久久| 中文字幕二 | 久久久久久久亚洲精品 | 精品国产无码一区二区三区 | 久久av秘一区二区三区 | 亚洲高清资源 | 国产特级av | 国产一区二区三区视频在线 | 日韩人妻无码精品久久久不卡 | 日本一区二区三区在线免费观看 | 黄色成人在线 | 免费三级黄 | 少妇又色又紧又大爽又刺激 | 黄色免费在线看 | 国产一区二区三区欧美 | 成人久久久久久 | 欧美国产日韩在线视频 | 暖暖av| 男女操操 | 日本色妞 | 四虎在线免费观看 | 亚洲97 | 青青草av | 婷婷色九月 | 久久久精品免费看 | 中文字幕一区二区在线观看 | 色一情一乱一乱一区91av | 国产美女www爽爽爽 www.国产毛片 | 欧美亚洲三级 | 亚洲天堂视频在线观看 | 亚洲欧洲精品一区 | www午夜| 国产动漫av | 亚洲黄色小说网 | 134vcc影院免费观看 | 亚洲欧美日韩在线播放 | 国产亚洲精品成人av在线 | 黄色资源网站 | 爱爱免费视频网站 | 亚洲啪av永久无码精品放毛片 | 亚洲精品在线观看免费 | 亚洲污视频 | 香蕉视频黄色在线观看 | 男生捅女生肌肌 | 阿v天堂在线 | av免费观看入口 | 免费一级淫片 | 欧美人与性动交α欧美片 | 日韩黄| 成年人观看视频 | 伊人伊人鲁 | 天堂资源网 | 原来神马电影免费高清完整版动漫 | 亚色成人| 欧美大白屁股 | 国产二区三区 |