navicat运行db文件_使用 YAML 文件配置 Jenkins 流水线
本文轉載自:Jenkins 中文社區
這也是一種自定義流水線 DSL 的方法
幾年前,我們的 CTO 寫了一篇關于 使用 Jenkins 和 Docker 為 Ruby On Rails 應用提供持續集成服務 的文章。這些年,我們一直使用這個 CI 流水線解決方案,直到我們最近決定做一次升級。為什么呢?
- Jenkins 的版本過低,已經很難升級
- Wolox 過去幾年增長顯著,一直面臨著如何伸縮的問題
- 只有極少數人如何修復 Jenkins 服務的問題
- 配置 Jenkins 任務不是一件簡單的任務,使我們的項目啟動過程變慢
- 更改每個作業運行的命令也不是一件簡單的任務,并且有權限更改的人并不多。 Wolox 擁有廣泛的項目,語言種類繁多,使得這個問題尤為突顯。
考慮到這些問題,我們開始深入研究最新版的 Jenkins,看看如何提升我們的 CI 服務。我們需要構建一個新的CI服務,至少要解決以下問題:
- 支持 Docker 構建。我們的項目依賴的一個或多個 Docker 鏡像的執行(應用,數據庫,Redis 等)
- 如有必要,易于配置和復制
- 易于增加新項目
- 易于修改構建步驟。工作在項目上的所有人都應該能修改它,如果他們希望執行 npm install 或 yarn install
安裝Jenkins和Docker
安裝 Jenkins 非常簡單,直接從 官方教程 選擇一種方式安裝。
以下是我們在 AWS 上的安裝步驟:
sudo rpm — import https://pkg.jenkins.io/debian/jenkins.io.key sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat/jenkins.repo sudo yum install java-1.8.0 -y sudo yum remove java-1.7.0-openjdk -y sudo yum install jenkins -y sudo yum update -y sudo yum install -y docker
從 GitHub 上自動添加項目
從 Github 上自動添加項目可以通過 GitHub Branch Source 插件實現。它能將 GitHub 的組織中符合規則的項目自動添加到 Jenkins 中。唯一的約束就是在每一個分支下都必須有一個 Jenkinsfile,用于描述如何構建項目。
易于修改的配置
我們之前使用 Jenkins 最痛苦的是修改項目的構建步驟。在 Jenkins 任務中,你會看到像以下代碼(用于構建):
#!/bin/bash +x set -e # Remove unnecessary files echo -e "033[34mRemoving unnecessary files...033[0m" rm -f log/*.log &> /dev/null || true &> /dev/null rm -rf public/uploads/* &> /dev/null || true &> /dev/null # Build Project echo -e "033[34mBuilding Project...033[0m" docker-compose --project-name=${JOB_NAME} build # Prepare test database COMMAND="bundle exec rake db:drop db:create db:migrate" echo -e "033[34mRunning: $COMMAND033[0m" docker-compose --project-name=${JOB_NAME} run -e RAILS_ENV=test web $COMMAND # Run tests COMMAND="bundle exec rspec spec" echo -e "033[34mRunning: $COMMAND033[0m" unbuffer docker-compose --project-name=${JOB_NAME} run web $COMMAND # Run rubocop lint COMMAND="bundle exec rubocop app spec -R --format simple" echo -e "033[34mRunning: $COMMAND033[0m" unbuffer docker-compose --project-name=${JOB_NAME} run -e RUBYOPT="-Ku" web $COMMAND
在構建步驟后,執行 Docker 構建的清理工作:
#!/bin/bash +x docker-compose --project-name=${JOB_NAME} stop &> /dev/null || true &> /dev/null docker-compose --project-name=${JOB_NAME} rm --force &> /dev/null || true &> /dev/null docker stop `docker ps -a -q -f status=exited` &> /dev/null || true &> /dev/null docker rm -v `docker ps -a -q -f status=exited` &> /dev/null || true &> /dev/null docker rmi `docker images --filter 'dangling=true' -q --no-trunc` &> /dev/null || true &> /dev/null
盡管這些命令并不復雜,但是更改其中的任何命令都需要具有權限的人員來操作相應的 Jenkins 任務,并清楚知道自己需要做什么。
Jenkinsfile的成與敗
使用當前的 Jenkins 版本,我們可以利用 Jenkins pipeline 對我們的構建流進行建模,并保存到一個文件中。 該文件會被簽入代碼庫。因此,任何有權訪問它的人都可以修改其中的步驟。棒極了。
Jenkins 流水線還支持:
- Docker 及多個鏡像可用于構建
- 使用 withEnv 設置環境變量,還支持很多其它內建的 函數
這為 Wolox 提供了完美的用例。我們可以將構建配置寫入到一個被檢入到代碼庫的文件中,并且允許任務有權限訪問的人修改。但是,一個簡單的 Rails 項目的 Jenkinsfile 看起來卻像這樣:
# sample Jenkinsfile. Might not compile node { checkout scm withEnv(['MYTOOL_HOME=/usr/local/mytool']) { docker.image("postgres:9.2").withRun() { db -> withEnv(['DB_USERNAME=postgres', 'DB_PASSWORD=', "DB_HOST=db", "DB_PORT=5432"]) { docker.image("redis:X").withRun() { redis -> withEnv(["REDIS_URL=redis://redis"]) { docker.build(imageName, "--file .woloxci/Dockerfile .").inside("--link ${db.id}:postgres --link ${redis.id}:redis") { sh "rake db:create" sh "rake db:migrate" sh "bundle exec rspec spec" } } } } } } }
這樣的文件不僅難以理解,還難以修改。這樣的構建邏輯非常容易被破壞,如果你不熟悉 Groovy。如果你對 Jenkins 流水線是如何工作的一無所知,就更容易了。這樣,修改或增加一個新的 Docker 鏡像就變得不簡單,也容易導致混淆。
通過 YAML 配置 Jenkins 流水線
就個人而言,我總是期望為 CI 配置簡單的配置文件。這次我們有機會構建使用 YAML 文件配置的 CI。經過分析,我們總結出以下這樣的 YAML,它已經能滿足我們的需求:
config: dockerfile: .woloxci/Dockerfile project_name: some-project-name services: - postgresql - redis steps: analysis: - bundle exec rubocop -R app spec --format simple - bundle exec rubycritic --path ./analysis --minimum-score 80 --no-browser setup_db: - bundle exec rails db:create - bundle exec rails db:schema:load test: - bundle exec rspec security: - bundle exec brakeman --exit-on-error audit: - bundle audit check --update environment: RAILS_ENV: test GIT_COMMITTER_NAME: a GIT_COMMITTER_EMAIL: b LANG: C.UTF-8
它描述了項目基本的配置、構建過程中需要的環境變量、依賴的服務、還有構建步驟。
Jenkinsfile + Shared Libraries = WoloxCI
經過調研 Jenkins 和流水線之后,我們發現可以通過擴展共享庫(shared libraries)來實現。共享庫是用 Groovy 編寫的,可以導入到流水線中,并在必要時執行。
如果你細心觀察以下 Jenkinsfile,你會看到代碼是一個接收閉包的方法調用鏈,我們執行另一個方法將一個新的閉包傳遞給它。
# sample Jenkinsfile. Might not compile node { checkout scm withEnv(['MYTOOL_HOME=/usr/local/mytool']) { docker.image("postgres:9.2").withRun() { db -> withEnv(['DB_USERNAME=postgres', 'DB_PASSWORD=', "DB_HOST=db", "DB_PORT=5432"]) { docker.image("redis:X").withRun() { redis -> withEnv(["REDIS_URL=redis://redis"]) { docker.build(imageName, "--file .woloxci/Dockerfile .").inside("--link ${db.id}:postgres --link ${redis.id}:redis") { sh "rake db:create" sh "rake db:migrate" sh "bundle exec rspec spec" } } } } } } }
Groovy 語言足夠靈活,能在在運行時創建聲明式代碼,這使我們能使用 YAML 來配置我們的流水線!
Wolox-CI介紹
wolox-ci 誕生于 Jenkins 的共享庫。以下是關于 Wolox-CI 的具體使用方式。
使用 wolox-ci,Jenkinsfile 被精簡成:
@Library('wolox-ci') _ node { checkout scm woloxCi('.woloxci/config.yml'); }
它會檢出代碼,然后調用 wolox-ci。共享庫代碼會讀取到 YAML 文件,如下:
config: dockerfile: .woloxci/Dockerfile project_name: some-project-name services: - postgresql - redis steps: analysis: - bundle exec rubocop -R app spec –format simple - bundle exec rubycritic –path ./analysis –minimum-score 80 –no-browser setup_db: - bundle exec rails db:create - bundle exec rails db:schema:load test: - bundle exec rspec security: - bundle exec brakeman –exit-on-error audit: - bundle audit check –update environment: RAILS_ENV: test GIT_COMMITTER_NAME: a GIT_COMMITTER_EMAIL: b LANG: C.UTF-8
然后,Jenkins 就會執行你的構建任務。
共享庫有一個好處是我們可以集中擴展和修改我們的共享庫代碼。一旦添加新代碼,Jenkins 就會自動更新它,還會通知所有的任務。
由于我們有不同語言的項目,我們使用 Docker 來構建測試環境。WoloxCI 假設有一個 Dockerfile 要構建,并將在容器內運行所有指定的命令。
config.yml 各部分介紹
config部分
這是 config.yml 的第一部分,用于指定基本配置,包括項目的名稱,Dockerfile 的路徑。Dockerfile 用于構建鏡像,所有的命令都運行在該鏡像的容器中。
Services 部分
這部分定義了哪些服務被暴露到容器中。WoloxCI 支持以下開箱即用的服務:postgresql、mssql 和 redis。你還可以指定 Docker 鏡像的版本。
增加一個新的服務類型也不難。你只需要在該目錄下(https://github.com/Wolox/wolox-ci/tree/development/vars)添加,然后告訴共享庫該服務是如何被轉換的,如https://github.com/Wolox/wolox-ci/blob/development/src/com/wolox/parser/ConfigParser.groovy#L76
Steps 部分
在此部分列出的命令,都會被運行在 Docker 容器中。你可以在 Jenkins 界面上看到每一步的執行結果。
Environment 部分
如果構建過程需要一些環境變量,你可以在這部分指定它們。Steps 部分中描述的步驟執行過程中,Docker 容器會提供你設置好的所有環境變量。
總結
目前,WoloxCI 還在我們所有項目中一小部分項目進行測試。這讓有權限訪問它的人通過 YAML 文件更改構建步驟。這是對我們 CI 工作流程來說是一個重大改進。
Docker 使我們輕松更換編程語言,而不用對 Jenkins 安裝做任何的更改。并且,當檢查到 GitHub 組織中的新項目(項目中有 Jenkinsfile)時,Jenkins GitHub Branch Source 插件會自動添加新的 Jenkins 項目。
所有這些改進節約了我們維護 Jenkins 的大量時間,并使我們可以輕松擴展而無需任何額外配置。
譯者小結
本文最大的亮點是它介紹了一種實現自定義構建語言的方式。通過 Jenkins 的共享庫技術,將構建邏輯從 Jenkinsfile 中移到了 YAML 文件中。同樣的,我們可以將構建邏輯移動 JSON 文件中,或者任何格式的文件中,只你的共享庫能解析它,并將它轉換成 Jenkins 能理解的格式。
總結
以上是生活随笔為你收集整理的navicat运行db文件_使用 YAML 文件配置 Jenkins 流水线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle闪回保存多久,CSS_ora
- 下一篇: oracle如何复制dept,[orac