{"id":20619744,"url":"https://github.com/twtrubiks/docker-jenkins-django-tutorial","last_synced_at":"2025-04-15T12:02:29.681Z","repository":{"id":84518940,"uuid":"113661118","full_name":"twtrubiks/docker-jenkins-django-tutorial","owner":"twtrubiks","description":"實戰 Docker + Jenkins + Django + Postgres 📝","archived":false,"fork":false,"pushed_at":"2021-10-13T07:00:18.000Z","size":42,"stargazers_count":140,"open_issues_count":0,"forks_count":44,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-03-28T19:53:44.359Z","etag":null,"topics":["django","docker","jenkins","tutorial"],"latest_commit_sha":null,"homepage":"","language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/twtrubiks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-12-09T10:30:13.000Z","updated_at":"2025-03-23T06:33:19.000Z","dependencies_parsed_at":null,"dependency_job_id":"7dd7f405-da69-49d4-908a-cf03d1d656f3","html_url":"https://github.com/twtrubiks/docker-jenkins-django-tutorial","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fdocker-jenkins-django-tutorial","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fdocker-jenkins-django-tutorial/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fdocker-jenkins-django-tutorial/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fdocker-jenkins-django-tutorial/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/twtrubiks","download_url":"https://codeload.github.com/twtrubiks/docker-jenkins-django-tutorial/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249067779,"owners_count":21207395,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["django","docker","jenkins","tutorial"],"created_at":"2024-11-16T12:12:24.636Z","updated_at":"2025-04-15T12:02:29.659Z","avatar_url":"https://github.com/twtrubiks.png","language":"Dockerfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# docker-jenkins-django-tutorial\n\n實戰 Docker + Jenkins + Django + Postgres  📝\n\n這篇文章主要延續之前的教學文，建議對 Docker 以及 Django 有基礎的認識，可參考\n\n[Docker 基本教學 - 從無到有 Docker-Beginners-Guide](https://github.com/twtrubiks/docker-tutorial)\n\n[Django-REST-framework 基本教學 - 從無到有 DRF-Beginners-Guide 📝](https://github.com/twtrubiks/django-rest-framework-tutorial)\n\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#ci--cd-%E4%BB%8B%E7%B4%B9) - [Youtube Tutorial PART 1 - CI ( Continuous Integration ) / CD (Continuous Delivery / Continuous Deployment) 介紹](https://youtu.be/wJlE0aFluY4)\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#docker--jenkins--django--postgres-%E8%A8%AD%E5%AE%9A) - [Youtube Tutorial PART 2 - Docker + Jenkins + Django + Postgres 設定](https://youtu.be/fjwIVCywX2A)\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#docker--jenkins--django--postgres-%E5%AF%A6%E6%88%B0%E6%95%99%E5%AD%B8) - [Youtube Tutorial PART 3 - Jenkins 基本設定](https://youtu.be/27rmiKGrG2M)\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#jenkins--github-integration-plugin) - [Youtube Tutorial PART 4 - Jenkins + GitHub Integration 實戰](https://youtu.be/AYgw5NXAeNY)\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#jenkins--github-webhooks-%E5%AF%A6%E6%88%B0) - [Youtube Tutorial PART 5 - Jenkins + GitHub Webhooks 實戰](https://youtu.be/ymfTEPxKRqQ)\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#jenkins--bitbucket-private-repo-%E5%AF%A6%E6%88%B0) - [Youtube Tutorial PART 6 - Jenkins + BitBucket private repo 實戰](https://youtu.be/S6Hfcm_xrnE)\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#jenkins--notifications---send-email) - [Youtube Tutorial PART 7 - Jenkins + Notifications - Send Email 實戰](https://youtu.be/MWWBleOtqVk)\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#jenkins--slack) - [Youtube Tutorial PART 8 - Jenkins + Slack 實戰](https://youtu.be/jmVRb81KpUk)\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#job-chaining-in-jenkins) - [Youtube Tutorial PART 9 - Jenkins Job chaining tutorial](https://youtu.be/FOhxViut4cI)\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#delivery-pipeline-plugin) - [Youtube Tutorial PART 10 - Jenkins + Delivery Pipeline tutorial](https://youtu.be/kBAAtMOclv8)\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#build-pipeline-plugin) - [Youtube Tutorial PART 11 - Jenkins + Build Pipeline tutorial](https://youtu.be/Dk4busLipS0)\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#remote-access-api) - [Youtube Tutorial PART 12 - Jenkins +  Remote access API tutorial](https://youtu.be/p7uxurX4MnI)\n\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#csrf-protection) - CSRF Protection\n\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#ssh-plugin---ssh-remote-hosts) - SSH Plugin - SSH remote hosts\n\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#%E8%A8%AD%E5%AE%9A%E6%99%82%E5%8D%80) - 設定時區\n\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial#%E8%A8%AD%E5%AE%9A%E6%AC%8A%E9%99%90-security) - 設定權限 Security\n\n* [目錄](https://github.com/twtrubiks/docker-jenkins-django-tutorial/tree/master/jenkins_nginx) - jenkins 搭配 nginx\n\n## CI / CD 介紹\n\n在開始介紹前，先帶大家了解幾個名詞，相信大家一定常常聽到別人說 CI / CD，\n\nCI : Continuous Integration ， 又稱 持續整合。\n\nCD : Continuous Delivery / Continuous Deployment ， 又稱 持續交付 / 持續佈署。\n\n![](https://i.imgur.com/s1hwUjr.jpg)\n\n圖片來源 [http://www.code-maze.com/wp-content/uploads/2016/02/ci-4-1024x584.png](http://www.code-maze.com/wp-content/uploads/2016/02/ci-4-1024x584.png)\n\n詳細的定義在這裡我就不另外做介紹，培養大家 google 的能力 :smiley:\n\n### CI / CD 的好處\n\nCI 對團隊來講有非常多的好處，一個良好的 CI 能加速整個團隊的工作流程，而且 developer 不用擔心\n\npush 後整個專案可能會掛掉。也因為持續的佈署與測試，可以在早期就發現程式的漏洞（ 盡早修正 bug\n\n，越晚發現付出的代價越高 :scream: ）。\n\n透過 CI，可以為團隊帶來更好的溝通，也可以更容易的進行 Code Review ，提升整個工作團隊的效率，\n\n減少不必要的手動流程 ( 自動化 )，developer 可以更專注的在開發程式。\n\nCI 不只對 developer 有好處，也對管理者有好處，可以隨時監控目前整個團隊的工作流程以及品質。\n\n### 該選擇哪一款 CI / CD 呢\n\n因為這類工具很多，在這裡我挑幾個\n\n[Jenkins](https://jenkins-ci.org/)\n\n![](https://i.imgur.com/lQefqzU.jpg)\n\n[GitLab CI](https://docs.gitlab.com/)\n\n![](https://i.imgur.com/ThRu34A.jpg)\n\n[Travis CI](https://travis-ci.org/)\n\n![](https://i.imgur.com/vWiOoH4.jpg)\n\n[Drone](https://github.com/drone/drone)\n\n![](https://i.imgur.com/o34VAYY.jpg)\n\n該選擇哪一個呢 ？\n\n基本上，還是要依照自己的的需求、技術、工作流程來選擇最適合你們團隊的。\n\n但這篇文章的主角是 Jenkins :smile:\n\n## Docker + Jenkins + Django + Postgres 設定\n\n使用 [Docker 基本教學 - 從無到有 Docker-Beginners-Guide](https://github.com/twtrubiks/docker-tutorial) 當作範例，\n\n主要是 docker-compose.yml 裡面的設定，有兩種設定方式，\n\n一種是將路徑同步到你的 host 本機，另一種是 Named volume。\n\n可參考官網 volumes 設定方式 [docker-short-syntax](https://docs.docker.com/compose/compose-file/#short-syntax-3)\n\n方法一： 同步到你的 host 本機\n\n可參考 [jenkins_host](https://github.com/twtrubiks/docker-jenkins-django-tutorial/tree/master/jenkins_host)\n\n[docker-compose.yml](https://github.com/twtrubiks/docker-jenkins-django-tutorial/blob/master/jenkins_host/docker-compose.yml)\n\n```yml\nversion: '3'\nservices:\n\n    db:\n      image: postgres\n      environment:\n        POSTGRES_PASSWORD: password123\n      ports:\n        - \"5432:5432\"\n      volumes:\n        - pgdata_jenkins_host:/var/lib/postgresql/data/\n\n    api:\n      build: ./api\n      restart: always\n      command: python manage.py runserver 0.0.0.0:8000\n      ports:\n        - \"8002:8000\"\n      volumes:\n        - ./workspace/workspace/demo/api:/docker_api\n      depends_on:\n        - db\n\n    jenkins:\n          image: jenkins/jenkins:lts-jdk11\n          restart: always\n          ports:\n              - \"8080:8080\"\n              - \"50000:50000\"\n          volumes:\n              - ./workspace:/var/jenkins_home\nvolumes:\n    pgdata_jenkins_host:\n```\n\n方法二： Named volume\n\n可參考 [jenkins_volume](https://github.com/twtrubiks/docker-jenkins-django-tutorial/tree/master/jenkins_volume)\n\n[docker-compose.yml](https://github.com/twtrubiks/docker-jenkins-django-tutorial/blob/master/jenkins_volume/docker-compose.yml)\n\n```yml\nversion: '3'\nservices:\n\n    db:\n      image: postgres\n      environment:\n        POSTGRES_PASSWORD: password123\n      ports:\n        - \"5432:5432\"\n      volumes:\n        - pgdata_jenkins:/var/lib/postgresql/data/\n\n    api:\n      build: ./api\n      restart: always\n      command: python /var/jenkins_home/workspace/demo/api/manage.py runserver 0.0.0.0:8000\n      ports:\n        - \"8002:8000\"\n      volumes:\n        - api_data:/docker_api\n        - jenkins_data:/var/jenkins_home\n      depends_on:\n        - db\n\n    jenkins:\n          image: jenkins/jenkins:lts-jdk11\n          restart: always\n          ports:\n              - \"8080:8080\"\n              - \"50000:50000\"\n          volumes:\n              - jenkins_data:/var/jenkins_home\nvolumes:\n    api_data:\n    jenkins_data:\n    pgdata_jenkins:\n```\n\n## Docker + Jenkins + Django + Postgres 實戰教學\n\n一樣一行指令啟動:relaxed:\n\n\u003e docker-compose up\n\n直接瀏覽 [http://localhost:8080/](http://localhost:8080/)，會看到下圖\n\n![](https://i.imgur.com/nMXQc7Z.jpg)\n\n進入 jenkins container\n\n\u003e cat /var/jenkins_home/secrets/initialAdminPassword\n\n![](https://i.imgur.com/6LNxk8F.png)\n\n將得到的 password 貼到 Administrator password 即可，\n\n再來是安裝套件，請依照自己的需求選擇套件，也可以都不要裝，\n\n需要的時候再補裝套件:smirk:\n\n![](https://i.imgur.com/34d8NHY.jpg)\n\n依照你選擇的套件決定安裝速度\n\n![](https://i.imgur.com/j5W5uKh.jpg)\n\n設定你的帳號密碼\n\n![](https://i.imgur.com/cnV0DYb.jpg)\n\n接著我們就可以開始了\n\n![](https://i.imgur.com/03Lzw5i.jpg)\n\n### Jenkins + GitHub Integration Plugin\n\n整合 Jenkins + GitHub :satisfied:\n\n先點選左側的 管理 Jenkins\n\n![](https://i.imgur.com/G110omM.jpg)\n\n選擇 管理外掛程式\n\n![](https://i.imgur.com/qkPBoJx.jpg)\n\n接著搜尋 GitHub Integration Plugin，如果你已經安裝則會出現在已安裝那邊\n\n![](https://i.imgur.com/j2pgRDP.png)\n\n安裝完成後，點選左側的新增作業\n\n![](https://i.imgur.com/Vaksz9s.jpg)\n\n建立一個專案稱為 demo\n\n![](https://i.imgur.com/xb6mFoA.jpg)\n\n描述可以輸入對這專案的說明\n\n![](https://i.imgur.com/MKRrIti.jpg)\n\n選擇 Git ， 這邊使用 **public** 的 REPO，\n\n[Docker 基本教學 - 從無到有 Docker-Beginners-Guide 教你用 Docker 建立 Django + PostgreSQL](https://github.com/twtrubiks/docker-tutorial)\n\n( 後面會說明如何使用 **private** 的 REPO )\n\n![](https://i.imgur.com/qqXx7j9.jpg)\n\n設定完畢之後，選擇馬上建置，你會發現他開始 build 了 :grin:\n\n![](https://i.imgur.com/xewlYwA.jpg)\n\n接著你可以到工作區看，你會發現已經把剛剛的專案順利 clone 下來了:+1:\n\n![](https://i.imgur.com/ARSYVvm.jpg)\n\n接著建議將 api 重新啟動，然後進入 api container 執行必要的指令\n\n```cmd\npython manage.py makemigrations musics\npython manage.py migrate\npython manage.py createsuperuser\n```\n\n![](https://i.imgur.com/ph7o3pU.png)\n\n![](https://i.imgur.com/jZXjdjC.png)\n\n執行完畢之後，我們就可以到 [http://localhost:8002/api/music/](http://localhost:8002/api/music/) 瀏覽。\n\n![](https://i.imgur.com/lzsHjlL.png)\n\n也可以設定遠端觸發建置\n\n![](https://i.imgur.com/Krn70Vi.png)\n\n也就是設定一組 token，例如 twtrubiks，\n\n當我輸入網址 [http://localhost:8080/job/demo/build?token=twtrubiks](http://localhost:8080/job/demo/build?token=twtrubiks) 就會自動開始 build 。\n\n### Jenkins + GitHub Webhooks 實戰\n\n聰明的你現在一定會問，這樣我每次 push 完，都要自己再去 jenkins build ，有夠麻煩 :expressionless:\n\n能不能 push 之後，透過 Webhooks 讓 jenkins 偵測到，然後自動 build 呢 :question:\n\n當然可以 :flushed:\n\n由於需要 https ， 所以我們透過 ngrok 幫助我們完成，可參考 [如何使用 ngrok](https://github.com/twtrubiks/facebook-messenger-bot-tutorial#%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-ngrok)\n\n\u003e ./ngrok http 8080\n\nport 設定 8080 是因為 jenkins 的 port 為 8080\n\n![](https://i.imgur.com/MYv5Z59.png)\n\n點選組態\n\n![](https://i.imgur.com/vbQrNkF.png)\n\n找到建置觸發程序，並選擇 GitHub hook trigger for GITScm polling\n\n![](https://i.imgur.com/NXtvmVZ.png)\n\n接著到 [Docker 基本教學 - 從無到有 Docker-Beginners-Guide 教你用 Docker 建立 Django + PostgreSQL](https://github.com/twtrubiks/docker-tutorial)\n\n專案中設定 Webhooks ( 你可以直接 fork 這個專案去改 )\n\n![](https://i.imgur.com/xwtkmOO.png)\n\nPayload URL 就是填入 ngrok 幫你產生的 https 的網址，記得要在網址後面補上 `github-webhook`，\n\n例如範例的 [https://65daeaf5.ngrok.io/github-webhook/](https://65daeaf5.ngrok.io/github-webhook/ )\n\n![](https://i.imgur.com/zGLgLlh.png)\n\n如果設定正確，會有一個綠色的小勾勾\n\n![](https://i.imgur.com/sbZwq9n.png)\n\n這時候，你可以對  [Docker 基本教學 - 從無到有 Docker-Beginners-Guide 教你用 Docker 建立 Django + PostgreSQL](https://github.com/twtrubiks/docker-tutorial)\n\n專案 commit 後再 push，你會發現 jenkins 自動開始 build 了 :satisfied:\n\n![](https://i.imgur.com/kkLJ6nr.png)\n\n也可以點選左側的 GitHub Hook Log 觀看紀錄\n\n![](https://i.imgur.com/wJilA17.png)\n\n### Jenkins + BitBucket private repo 實戰\n\n如果你是使用 **private** 的 REPO， 需要多設定 SSH KEY ，這裡使用 BitBucket 當作範例。\n\n首先，進入你的 jenkins container 產生 ssh key ，可參考 [generating-a-new-ssh-key](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#generating-a-new-ssh-key)。\n\n如果還是不懂，也可參考 [Git-Tutorials GIT 基本使用教學](https://github.com/twtrubiks/Git-Tutorials)，或是直接看之前的影片教學\n\n[github 基本教學 - 從無到有](https://www.youtube.com/watch?v=py3n6gF5Y00)，影片教學包含如何產生 SSH key。\n\n![](https://i.imgur.com/THw32js.png)\n\n\u003e cat /var/jenkins_home/.ssh/id_rsa.pub\n\n![](https://i.imgur.com/vbgfzhJ.png)\n\n到你的 BitBucket private repo 的地方設定\n\n![](https://i.imgur.com/eWC0GWz.png)\n\n貼上剛剛的 id_rsa.pub\n\n![](https://i.imgur.com/khM9X0n.png)\n\n如果你貼上一個 private repository，你會發現會有紅色警告\n\n![](https://i.imgur.com/RpfbFJu.png)\n\n這時候有兩種方法 Add Credentials\n\n第一種\n\n![](https://i.imgur.com/h3DE2b7.png)\n\n第二種 ( 安全一點 :stuck_out_tongue: )\n\n![](https://i.imgur.com/5J5ZpGW.png)\n\n如果設定正確，你會發現紅字消失了\n\n![](https://i.imgur.com/bOF7ZsK.png)\n\n### Jenkins + Notifications - Send Email\n\n管理 Jenkins -\u003e 設定系統\n\n![](https://i.imgur.com/lZwWdXS.png)\n\n找到電子郵件通知，並且設定，這邊使用 gmail 當作範例，\n\n測設定完成後你也可以寄測試信看看設定有沒有正確 :relaxed:\n\n![](https://i.imgur.com/4vOsthJ.png)\n\n如果你使用 gmail，然後一直寄不出去，你可以參考 [使用-gmail-寄信---前置作業](https://github.com/twtrubiks/Flask-Mail-example#使用-gmail-寄信---前置作業) 的設定。\n\n接著再回到專案的組態\n\n![](https://i.imgur.com/vbQrNkF.png)\n\n選擇電子郵件通知\n\n![](https://i.imgur.com/gmYMohn.png)\n\n輸入建立失敗時，誰要收到 email 通知\n\n![](https://i.imgur.com/EDGB577.png)\n\n### Jenkins + Slack\n\n這裡使用 [Slack](https://slack.com/) 當作範例 :blush:\n\n之前我也有簡單整合過 [Slack](https://slack.com/)，\n\n可參考[使用Hubot建立屬於自己的機器人 (Build Your Own Robot With Hubot)](https://github.com/twtrubiks/mybot)。\n\n安裝 Slack Notification Plugin\n\n![](https://i.imgur.com/T3apVow.png)\n\n接著到你自己的 [Slack](https://slack.com/) ( 申請步驟這邊不介紹了 )，點選左邊 Channels 的 +\n\n![](https://i.imgur.com/PibIvkJ.png)\n\n建立一個 channel\n\n![](https://i.imgur.com/8vEnSx8.png)\n\n點選右上角齒輪 Add an app\n\n![](https://i.imgur.com/ceEYhCg.png)\n\n搜尋 jenkins\n\n![](https://i.imgur.com/VrsiDJi.png)\n\nInstall\n\n![](https://i.imgur.com/zE5MXpQ.png)\n\n接著會有圖文教學教你如何將 Slack 整合進去 jenkins\n\n![](https://i.imgur.com/zayZzKU.png)\n\n要設定的有三個地方，分別為 **Base URL**、**Integration Token**、**Chnnel**\n\n![](https://i.imgur.com/uQmedh6.png)\n\n你的 Post to Channel\n\n![](https://i.imgur.com/aHkZw0C.png)\n\n回到 Jenkins，左側管理 Jenkins，設定系統\n\n![](https://i.imgur.com/LGp8yn0.png)\n\n找到 Slack, 設定 *Workspace* *Credential* *Default channel / member id*\n\n![](https://i.imgur.com/jUmj4c3.png)\n\n點選 Add Credential ( 使用這個安全一點:relaxed: )\n\n![](https://i.imgur.com/f3q4kzC.png)\n\n最後可以點 Test Connection 測試看看是否設定正確，如果正確會顯示 Success :grin:\n\n接著再回到 jenkins 專案裡的組態\n\n![](https://i.imgur.com/8MMxUEa.png)\n\n點選 建置後動作 並選擇 Slack Notifications\n\n![](https://i.imgur.com/djodDCN.png)\n\n依照自己需求通知的做設定\n\n![](https://i.imgur.com/vPy8eyR.png)\n\n接著設定完成，讓我們來試試看 :flushed:\n\n可以手動點選馬上建置或是如果你已經 GitHub Integration Plugin 直接 commit push 一次即可，\n\n回到你的 slack 你會發現成功了 :satisfied:\n\n![](https://i.imgur.com/qLLEDsa.png)\n\n## 軟體版本週期\n\n既然都對 CI / CD 有基本的認識了，那麼你一定要再了解軟體版本週期。這個是什麼呢？我相信\n\n大家一定常常聽導什麼 Alpha Beta 之類的，其實這就是指軟體版本的週期，以下我將簡單介紹他\n\n的週期。\n\n### Alpha\n\nAlpha（ α ）版本基本上就是測試版本，很多功能都未完善，因為是屬於軟體版本週期中的最初階\n\n段。這階段通常會由開發者下去做測試。\n\n### Beta\n\nBeta 版本是最早對外公開的軟體版本，由一般大眾協助測試，通常 Beta 版本包含所有的功能，但\n\n可能會有一些已知的 bug，Beta 版本有時候也會作為測試市場對產品的反應。\n\n### Release Candidate\n\nRelease Candidate（ 簡稱 RC ），通常這版本會成為最終產品候選的版本，這階段通常不會有嚴重\n\n的 bug，有些開源軟體會推出 RC2，而 RC2 則會成為正式版本。\n\n### Release to Manufacting\n\nRelease to Manufacting（ 簡稱 RTM ），這版本基本上是已經要上線了。\n\n### General availability\n\nGeneral availability（ 簡稱 GA ），這階段軟體基本上已機上線了。\n\n## Job chaining in Jenkins\n\n依照文章最開始的 CI / CD 介紹的圖，使用簡單 Build -\u003e Deploy -\u003e Test 的 workflow，\n\n依照這個 workflow，我將介紹 Jenkins 的 Job chaining\n\n* [Youtube Tutorial PART 9 - Jenkins Job chaining tutorial](https://youtu.be/FOhxViut4cI)\n\n## Build / Delivery Pipeline Plugin\n\n剛剛介紹了 Job chaining 的概念，接下來要推薦大家可以將 Job chaining 視覺化的套件。\n\n### Delivery Pipeline Plugin\n\n* [Youtube Tutorial PART 10 - Jenkins + Delivery Pipeline tutorial](https://youtu.be/kBAAtMOclv8)\n\n[Delivery Pipeline Plugin](https://wiki.jenkins.io/display/JENKINS/Delivery+Pipeline+Plugin)\n\nDelivery Pipeline Plugin 要求 job 要有 downstream/upstream relationships （上下游的關係）。\n\n### Build Pipeline Plugin\n\n* [Youtube Tutorial PART 11 - Jenkins + Build Pipeline tutorial](https://youtu.be/Dk4busLipS0)\n\n[Build Pipeline Plugin](https://wiki.jenkins.io/display/JENKINS/Build+Pipeline+Plugin)\n\n## Remote access API\n\n建議看影片，實戰給大家看會比較有感覺 😁\n\n* [Youtube Tutorial PART 12 - Jenkins +  Remote access API tutorial](https://youtu.be/p7uxurX4MnI)\n\n可參考 [Remote access API](https://wiki.jenkins.io/display/JENKINS/Remote+access+API)。\n\n主要是我們可以透過 terminal 呼叫 API，達到幫我們 build 的功能。\n\n如何取得自己的 User ID 以及 API Token ，請先點選右上角\n\n![](https://i.imgur.com/vEHGxH6.png)\n\n設定 -\u003e API Token\n\n![](https://i.imgur.com/ZgfPxpK.png)\n\n點選顯示 API Token 後，\n\n![](https://i.imgur.com/35Z4rao.png)\n\n溫馨小提醒  :heart:\n\n以下使用 curl 來當做範例，如果你是 windows 或 Linux 用戶，\n\n請自己安裝 curl，這邊就不再做介紹了☺️\n\n官方範例\n\n```cmd\ncurl -X POST JENKINS_URL/job/JOB_NAME/build \\\n  --user USER:TOKEN \\\n  --data-urlencode json='{\"parameter\": [{\"name\":\"id\", \"value\":\"123\"}, {\"name\":\"verbosity\", \"value\":\"high\"}]}'\n```\n\n範例，假設 job 為 demo\n\n```cmd\ncurl -X POST http://localhost:8080/job/demo \\\n   --user twtrubiks:8d3215553ca9623300f4967827c61291\n```\n\n`-d` 參數說明\n\n\u003e -d/--data , Send specified data in POST request.\n\n`--data-urlencode` 參數說明\n\n\u003e --data-urlencode , (HTTP) This posts data, similar to the other -d, --data options with the exception that this performs URL-encoding.\n\n`-u` 參數說明\n\n\u003e -u/--user \u003cuser[:password]\u003e , Set user and password\n\n範例\n\n```cmd\ncurl --user name:password http://www.example.com\ncurl -u user:password http://www.example.com\n```\n\n`-X` 參數說明\n\n\u003e -X/--request The request method to use.\n\n範例\n\n```cmd\ncurl -X POST http://www.example.com\n```\n\n如果在 terminal 中輸入後，什麼都沒發生，就代表成功了（ 但通常應該都會有錯誤😅 ），\n\n如果，你看到以下錯誤\n\n```cmd\n....\n\u003ctitle\u003eError 403 No valid crumb was included in the request\u003c/title\u003e\n....\n```\n\n![](https://i.imgur.com/QYhNler.png)\n\n就代表你有啟動比較安全的機制 CSRF Protection（ 預設是啟動的 ）。\n\n要如何解決呢？ 請繼續往下看😊\n\n### CSRF Protection\n\n主要是防止 CSRF 攻擊，\n\n如果不知道什麼是 CSRF ，可參考我之前寫的 [CSRF-tutorial 📝](https://github.com/twtrubiks/CSRF-tutorial)\n\n管理 Jenkins -\u003e 設定全域安全性\n\n![](https://i.imgur.com/78mW8qh.png)\n\n防範 CSRF 入侵預設有被打勾\n\n![](https://i.imgur.com/auFI5Uy.png)\n\n把打勾取消，就可以用剛剛的方法了。\n\n但是，如果我還是希望打勾防範 CSRF 入侵，那我該怎麼辦呢😬\n\n這時候，必須先得到 Jenkins-Crumb\n\n```cmd\ncurl -s -u twtrubiks:8d3215553ca9623300f4967827c61291  http://localhost:8080/crumbIssuer/api/json\n```\n\n![](https://i.imgur.com/WgrbIKi.png)\n\n`-s` 參數說明\n\n\u003e -s/--silent Silent mode. Don't output anything\n\n然後再將 Jenkins-Crumb 的值帶進去，如下（ 假設 job 為 demo ）\n\n```cmd\ncurl -X POST http://localhost:8080/job/demo/build --user twtrubiks:8d3215553ca9623300f4967827c61291  -H \"Jenkins-Crumb:6fbe69cd42a261330cb37e74af1ed1d1\"\n```\n\n![](https://i.imgur.com/xwmGGO2.png)\n\n`-H` 參數說明\n\n\u003e -H/--header  Custom header\n\n如果沒跳出任何資訊 ( 有跳訊息通常是有錯誤 )，就代表成功了👍\n\n![](https://i.imgur.com/lqb8HQL.png)\n\n你可以回到你的 Jenkins ，你會發現他自動開始 build 了 :satisfied:\n\n### SSH Plugin - SSH remote hosts\n\n這個 Jenkins Plugin 可以幫助你遠端 ssh 到主機上執行 script,\n\n請到 Manage Jenkins -\u003e Manage Plugins 底下安裝 Plugin\n\n![alt tag](https://i.imgur.com/EDE9SB8.png)\n\n之後到 Manage Jenkins -\u003e System Configuration -\u003e Configure System 底下\n\n設定你的 SSH remote hosts\n\n![alt tag](https://i.imgur.com/sBWXYfB.png)\n\n最後你到一般的 job 裡就會看到 Execute shell script on remote host using ssh\n\n![alt tag](https://i.imgur.com/dI9PD44.png)\n\n順便補充一下, aws ssh key 設定的部份,\n\nKind 的部份選擇 SSH Username with private key\n\n![alt tag](https://i.imgur.com/79D9SbG.png)\n\n這邊再把你的 key 貼上去\n\n![alt tag](https://i.imgur.com/8r8adqF.png)\n\n### 設定時區\n\nManage Jenkins -\u003e Tools and Actions -\u003e Script Console\n\n直接執行以下的指令\n\n```cmd\nSystem.setProperty('user.timezone', 'Asia/Taipei')\n```\n\nManage Jenkins -\u003e Status Information -\u003e System Information\n\n![alt tag](https://i.imgur.com/mh5Touq.png)\n\nManage Jenkins -\u003e Manage Users -\u003e 選擇 user -\u003e User Defined Time Zone\n\n![alt tag](https://i.imgur.com/byNu4JT.png)\n\n### 設定權限 Security\n\n之後到 Manage Jenkins -\u003e Security -\u003e Configure Global Security,\n\n找到 Authorization 之後選擇 Project-based Matrix Authorization Strategy\n\n這個設定是依據專案分權限, 你可以依照自己的需求設定\n\n![alt tag](https://i.imgur.com/aC0lr98.png)\n\n然後因為你是選擇依照專案分權限,\n\n你在 job 中的設定會多出 Enable project-based security,\n\n可選擇是否繼承上面的 Security 設定,\n\n也可以依照 user 設定 (像是這個專案只有誰可以看到這樣)\n\n![alt tag](https://i.imgur.com/y35InG0.png)\n\n## 後記：\n\n這次和大家介紹 Jenkins，相信大家一定覺得 Jenkins 超棒 :heart_eyes: ，我也只介紹比較基本的功能，如果要全部介紹完，\n\n要花好多時間 ( 默默研究中:sweat_smile: )。如果你是沒有導入CI 的團隊，我會建議先導入幾個重要的部份就好，整個流程不一\n\n定要完全的複製到你們的團隊上，可以一小部分一小部分慢慢導入，這樣整個團隊的反彈也不會那麼大。\n\n最後大家可以朝下面這張圖的目標前進\n\n![](https://i.imgur.com/dCASBwT.png)\n\n圖片來源 [https://chrisshayan.atlassian.net/wiki/spaces/my/blog/2013/07/23/4227074/Continuous+Delivery+Matrix](https://chrisshayan.atlassian.net/wiki/spaces/my/blog/2013/07/23/4227074/Continuous+Delivery+Matrix)\n\n## 執行環境\n\n* Linux\n* Mac\n* Python 3.6.2\n* windows 10\n\n## Reference\n\n* [https://docs.docker.com/](https://docs.docker.com/)\n* [docker jenkins](https://hub.docker.com/r/jenkins/jenkins)\n\n## Donation\n\n文章都是我自己研究內化後原創，如果有幫助到您，也想鼓勵我的話，歡迎請我喝一杯咖啡:laughing:\n\n![alt tag](https://i.imgur.com/LRct9xa.png)\n\n[贊助者付款](https://payment.opay.tw/Broadcaster/Donate/9E47FDEF85ABE383A0F5FC6A218606F8)\n\n## License\n\nMIT license\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwtrubiks%2Fdocker-jenkins-django-tutorial","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftwtrubiks%2Fdocker-jenkins-django-tutorial","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwtrubiks%2Fdocker-jenkins-django-tutorial/lists"}