要說整個 2023 年最紅的話題之一,ChatGPT 絕對不會缺席。於 2022 年 11 月橫空出世,在短時間內席捲全世界,並造就直到今天仍在持續的 AI 浪潮。過去所謂的人工智慧,大多都是透過條件式判斷,其實只是有限的自動回覆程式而已;但 ChatGPT 是真的能分析使用者輸入的內容,而且可以根據上下文自己判斷,並給出具建設性的回覆。然而除了單純文字聊天以外,後來有人發現它其實對工程師的程式撰寫也非常有幫助!

我算是 ChatGPT 剛發布時就有關注,也看了不少關於 GPT-3.5 的文章跟影片;不過因為 OpenAI 當時還是個名不見經傳的公司,註冊帳號雖然免費但還要手機驗證有點麻煩,所以一直處於觀望的狀態。後來 GPT-4 問世,更新資料並提高回覆內容的正確性,可是需要花錢訂閱~身為免費仔當然還是繼續觀望。但在微軟爸爸入股後,把 ChatGPT 整合到 Bing 搜尋,偶然看到某個影片分享 Skype 的 Bing 帳號也有導入 GPT-4 模型,重點是幾乎沒有限制而且完全免費!這才讓我開始真正頻繁的使用聊天機器人,來輔助我寫程式。其中一個實際案例是在我寫 Laravel 的 queue 相關程式時,原本苦惱要怎麼在處理 queue 的前後加入動作,後來問了 Bing 才發現原來新版的 Laravel 有提供 queue 的 middleware!使用上跟一般的 middleware 一樣,但是處理邏輯可以拆到另外一個 class 降低耦合並提高重用性。自己思考時絕對想不到的做法,有了聊天機器人相當於多了一位 mentor 可以提問討論。

2023 年 11 月初,在 OpenAI 的開發者大會上,創辦人 Sam Altman 發表了新的 GPT-4 Turbo 模型,擁有更快的回應、更正確的回覆以及更長的上下文,同時也公布 GTPs:任何人都可以客製自己的 ChatGPT 聊天機器人,並分享給其他人。預告會開放官方的商店,讓使用者能更統一更有效率的搜尋適合的聊天機器人。然而發表會幾天後,OpenAI 因為湧入大量使用者而不得不暫時關閉 ChatGPT Plus 的訂閱,直到今天還沒有開放。上周我不知道被什麼東西打到,突然想要來訂閱 ChatGPT Plus,但也因為服務暫停而被拒於門外...還好網路有人分享了可以繞過阻擋機制直接訂閱;當初我看得原始的連結已不可考,後來在網路上搜尋到類似的文章。使用瀏覽器開發者模式 console 的方式對我來說有用...至少在 12/5 時還有用,在暫停訂閱歧見想要突破防線的人可以試試。

20 美元的訂閱,折合台幣大概是 NT 630 左右,另外還要加上大約 NT 10 的刷卡手續費;順帶一題我是用玉山 Pi 拍錢包信用卡,國外消費應該會有最高 4% 的回饋...雖然是 P 幣但不無小補。回到 ChatGPT Plus,訂閱成功之後我簡單比較了一下免費的 GPT-3.5 與訂閱後的 GPT-4,首先反應速度 3.5 狂勝,幾乎是送出後馬上收到回覆;但也有讓不少使用者詬病的正確性問題。使用 4 回覆速度會比較慢,但這也可能表示它比較有經過思考?(心理作用)然後 4 在使用者要求在網路上搜尋時,會調用 Bing 搜尋查找網頁資料,可以多少突破目前 GPT-4 本身知識庫只到 2023 年 4 月的瓶頸。除此之外,一般正常使用好像沒什麼區別...但就跟「繳了補習班費用後才開始用功」的道理一樣,客家小資心裡當然是要在花錢訂閱後更加榨乾好好利用它囉~(欸不是)以下是幾個我在訂閱後嘗試過,覺得可以讓 ChatGPT Plus 更值得的心得:

GPTs

圖片

自訂聊天機器人之前其實也有,但只能通過提示詞(prompt)簡單客製,現在的 GPT-4 提供一個更友善的介面可以自訂名稱,上傳文件充實機器人的知識庫,另外還能分享出來給其他人使用。這段影片有簡單演示一下如何透過爬蟲程式擷取網站內容,然後餵給 GPTs 當作知識庫。官方商店前幾天有新聞提到必須延期到 2024 年才會開放,但有一些第三方服務也收集了不少 GPTs 可以搜尋利用;推薦使用這個網站,收集的數量很多,但目前沒有使用者評價回覆機制,會有點難判斷這個 GPTs 是不是真的有用?另外還有收集 GPTs 的 GPTs:23.500+ Best Custom GPTs,可以用聊天的方式幫你找適合的 GPTs。最後要留意的是,使用 GPTs 會有額度限制,提出太多問題後有可能會被限制流量,需要等待一段時間後才能在提問喔~

GPT Plugins

圖片

圖片

GPT Plugins 也是輔助 GPT-4 非常好用的工具,它是 Beta 功能所以要自己到設定裡面手動開啟,開啟後就可以在 ChatGPT 的聊天視窗內新增 Plugin 了!這個影片介紹了作者使用後覺得最有用的 8 個 Plugin,我自己使用後覺得 WebPlot 跟 Wolram 是最好用的,因為最多可以裝 3 個 Plugin,第 3 個可以根據聊天內容需求動態調整。

twitter-test 前端頁面串接後端 API 實際案例

圖片

最後分享一下這個星期實際使用 ChatGPT,從無到有建立了一個 Side Project前端頁面。我本身是專職後端的工程師,對於這幾年比較新的前端三大框架認識不深,Vue 3 更是完全零基礎。想說既然有 ChatGPT 的幫忙,就來拿原本已經有的純後端 API Side Project,試著用 Vue 3 建立簡單的前端頁面吧~實際上從安裝建立 Vue 3 環境、API 呼叫與共用元件規劃,甚至是後面 CI/CD 加入前端相關 script 的修改,全都是靠跟 ChatGPT 的對話完成。儘管最後的成品畫面非常陽春,但至少在功能上都有達到需求,對完全不熟 Vue 3 的我來說,最後還蠻有成就感的!ChatGPT 確實可以在工作上很大程度的增加工程師的效率,不過因為我的 Side Project 本來就是 public 的專案,所以不會有原始碼洩漏的疑慮;然而公司的 code 就不一定是如此了。在 ChatGPT 的使用上應該要多留意避免直接把原始碼貼給它,儘管工具很方便,在資訊安全方面的把關還是要靠自己的警覺心。

[分享] ChatGPT Plus 訂閱心得

ChatGPT 問世之後,AI 相關服務可以說是百家爭鳴,我自己對未來前景十分看好;雖然被 AI 取代的議題也甚囂塵上,但從歷史看起來工作的需求並不會因為效率變高而減少,反而會因為型態轉變而產生更多新工作。或是未來如果工作可以跟生活脫鉤,可以期待大部分的工作由 AI 代勞,由國家普發基本生活費;大家只要過著像《瓦力》中每天看劇跟喝肥宅快樂水的生活就好~(顆顆)

文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

2023-04-25 173516.png

轉眼間使用 Oracle Cloud Free Tier 當免費仔已經快 2 年,期間相當滿意;目前開 2 台 VM 持續正常運作中。不過 3 月份信箱突然收到一封信,原本以為只是維修通知沒有去理會;後來 3 天後又收到一封。仔細看了一下內容才發現,原來是 Oracle Cloud 要回收閒置 VM 的通知!符合以下 3 個條件中其中之一持續 7 天,就會被列入待回收對象:

  • 95% 的時間中 CPU 使用率低於 15%
  • 網路使用率低於 15%
  • 記憶體使用率低於 15% (僅適用於 ARM 的 VM)

雖然 VM 持續使用中,但因為一台專門做為跳板機,一台用來放 side projects 單純 demo,所以 CPU 使用率以及網路流量都非常低...緊急找了網路上其他前輩的文章,發現這篇文章可以應急一下; Oracle-server-keep-alive-script 比較靈活,使用互動式指令,可以簡單切換啟動或關閉,而且還會自動常駐背景,即使重新啟動 VM 也會自己啟動。然而因為使用簡體中文,所以如果 VM 沒有安裝字型會呈現亂碼~問題不大,單純使用數字選擇也可以動。只是不知道為什麼裝在 side projects 那台 VM 時過不久就會當機...(囧)所以我在那台使用 NeverIdle,簡單使用 go 指令消耗 CPU 資源,但需要自己背景執行,重新啟動 VM 時也要手動重啟。

2023-04-25 175705.png

目前使用 1 個多月,已沒有再收到 Oracle Cloud 的通知;不過他們家這招也是蠻有趣的...一般來說服務商應該不希望使用者浪費太多資源,Oracle Cloud 竟然反其道而行?但既然身為免費仔,當然就是照著人家的規矩走囉~

 

文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

2023-12-01 Updated: 目前機器人已被蝦皮阻擋,作者也萌生退意,此工具已失效,也感謝過去這段時間作者 wdzeng 提供並持續維護這個工具 [分享][已失效] wdzeng/shopee-coins-

 

前陣子在 PTT 省錢版發現有鄉民分享,因為平常就有在貪小便宜收集蝦幣, 如果可以自動化那真是太棒了!後來作者還更神的串接了 Github 的 Actions 服務,只要有 Github 帳號搭配簡單的設定步驟,就能實現每天自動領蝦幣的功能。可惜好景不長...或許是因為太多人使用引發官方關注,不到一個月 repo 就被強制關閉 GG 惹~沒辦法只好回頭去研究 docker 的用法。儘管作者對於 docker 的使用也有詳細步驟說明,但我在實作時還是有踩到一些坑;所以在這裡稍微紀錄一下:

  • 環境準備
    • 作者提供的簽到執行方式是 docker,所以首先必須自己準備一個已經安裝好 docker 的主機環境
    • 自己的電腦當然也可以,但考量到之後會使用排自動執行,雲端空間會比較恰當
    • 我是使用去年介紹過的 Oracle Cloud Free Tier,有興趣的人可以參考一下
  • Failed to save cookie: EISDIR: illegal operation on a directory
    • 發生原因是因為 volume cookie 檔時連結到目錄而不是檔案
    • 解決方式是在 volume 之前先建立一個空的文字檔,再執行 docker run
  • 排程建立方式
    • 作者提供的 docker run command 是一次性的指令,如果想要自動執行,當然就必須倚靠排程
    • 在設定 crontab 的過程中,發現 docker run 一直 run 不起來,後來 goolge 後才知道 crontab 在使用 docker 時不需要加 -it 的參數
    • 另外 docker run 後的 container 會殘留在列表之中,可以透過指令清除
    • 最後我把一連串動作寫成 shell script,透過排程設定每天執行,達成自動化的目的
  • shopee-coins-bot.sh
    #!/bin/sh
    # 紀錄現在的時間
    now=$(date)
    echo "$now"
    # 執行 docker run 蝦皮自動簽到機器人
    docker run -v /home/ubuntu/shopee-coins-bot-cookie:/cookie hyperbola/shopee-coins-bot:1 -f -c /cookie
    # 睡 5 分鐘,通常執行大概會花 1 分鐘左右
    sleep 5m
    # 清除已離開的 docker container
    docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
  • crontab 每天 00:33 執行 shopee-coins-bot.sh,並記錄在 shopee-coins-bot.log
    33 0 * * * /bin/bash /home/ubuntu/shopee-coins-bot.sh >> /home/ubuntu/shopee-coins-bot.log

感謝作者 wdzeng 分享這麼實用的工具,也希望有使用的人可以不吝給予專案 star 喔~

文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

秉持著客家精神(?),一直以來我的虛擬主機都是用免費方案~(挺)之前是用 AWS 免費方案,但是他給的服務與規格實在太陽春了!EC2 連最基本的 Laravel 跑起來都卡卡 der...(囧)最近一年改用 GCP 免費方案,90 天內提供 300 美金的額度任你用;跑一般的服務絕對是綽綽有餘,到期前基本上用不完。目前已經換了 3 個免洗帳號,用起來沒有什麼缺點,就是時間短了點...儘管透過製作映像檔,轉成 vmdk 匯出的方式,在免洗帳號轉換時,幾乎可以無痛重啟一台一模一樣的 GCE;但是每 3 個月就要重做一次有點兒懶啊~這陣子就在尋覓是不是有更方便的免費方案,突然發現原來 Oracle 也有提供類似的雲端服務:Oracle Cloud,而且也有免費方案,30 天內提供 300 美金的額度,部分服務如果使用指定配置甚至是永久免費聽起來就很威!申請一個免費帳號不會很難,網路上教學資源豐富,我就不特別說明了。我申請的時候需要輸入手機號碼,但是沒有簡訊驗證;目前亞洲區域離我們比較近的地點,只有首爾、東京跟大阪。我自己是選東京,區域選擇後就不能轉換,可以根據自己的喜好(?)決定。另外申請後頁面明明說 15 分鐘就可以啟用,但我等了大概 12 小時才真正完成整個手續;如果有急用在線等可能要考慮一下~

操作介面算是淺顯易懂,主要會用到的大概是「運算 / 執行處理」:相當於 EC2/GCE,還有「網路 / 虛擬雲端網路」:網路防火牆相關設定。永久免費好像可以開 2 台最低規格的執行處理,目前我也只開 2 台所以不清楚。機器的等級是 1CPU, 1GB 記憶體,個人覺得比 AWS, GCP 要好,實際使用起來也有比較順。比較特別的是如果建立時使用 Ubuntu 20.04,裡面的 iptables 有特別的設定,所以即使網路防火牆有開還是會被作業系統自己的 iptables 擋掉,所以要自己手動清除 iptables 原本的設定

目前用起來感覺還不錯,目前建立的執行處理也都有註明是「永久免費」;只是不確定 30 天後的情況如何,就先再觀察看看囉~

10/2 更新:

目前使用大概快 2 個月,永久免費方案給的蠻大方的,目前我運行 2 台 instance,規格開最低,不過使用起來還蠻順暢的。其中一台是用來做 SSH Tunnel,上班日都會連回家裡的 NAS 聽音樂;原本有點擔心流量爆表,但是目前為止還沒被收過錢!另外還給了一組固定 IP,我覺得整個就是佛心來著的~非常推薦拿來架一些小型 Side Project 或是個人使用的服務。感恩 Oracle,讚嘆 Oracle!

文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

這幾天收到 Let's encrypt 的提醒網域認證即將過期的信件,覺得奇怪我不是有設定 crontab 自動更新嗎?後來搜尋了一下才發現,原來 Certbot 預設的 renew 在萬用字元 (wildcard) 的域名會失敗。因為我有透過 Cloudflare 做 DNS 管理,網路上建議透過外掛 certbot-dns-cloudflare 更新,以下是設定方式:
  • 先到 Cloudflare > 右上角我的設定檔 > API Token > Global API Key > 檢視 取得 token
  • 2021-02-01_100006.png
  • 進入主機
  • # 建立目錄與檔案
    sudo mkdir ~/certbot
    sudo vi ~/certbot/cloudflare.ini
     
    dns_cloudflare_email = "Cloudflare 的帳號"
    dns_cloudflare_api_key = "Global API Key"
     
    # 修改目錄與檔案權限
    sudo chmod 0700 ~/certbot
    sudo chmod 0400 ~/certbot/cloudflare.ini
     
    # 安裝前需要同意 certbot 使用 root 權限
    sudo snap set certbot trust-plugin-with-root=ok
    
    # 安裝 certbot-dns-cloudflare
    sudo snap install certbot-dns-cloudflare
     
    # 重新認證域名 example.com, *.example.com 請改為你的域名
    sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/certbot/cloudflare.ini -d "example.com" -d "*.example.com" --preferred-challenges dns-01

不過這時我才發現,使用免費域名(Freenom)的認證仍會失敗,因為無法透過 API 自動修改 Cloudflare DNS 設定...(囧)好吧,那就只能手動重新認證域名

# 手動認證域名,cloudflare 新增 TXT 訊息,example.ga, *.example.ga 請改為你的域名
sudo certbot certonly --preferred-challenges dns --manual -d "example.ga" -d "*.example.ga" --server https://acme-v02.api.letsencrypt.org/directory

# 確認 TXT 是否生效
nslookup -type=txt _acme-challenge.example.ga

# 成功通過認證後重啟 nginx
sudo service nginx restart

# 確認認證
sudo certbot certificates

總算是延期成功,沒想到萬用字元域名更新竟然需要另外特別處理,當免費仔還不給用 API!(怒)要繼續當下去只好勤奮一點,每三個月自己手動認證一次囉~其實也不會很麻煩啦!

參考資料

文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

前一陣子在研究 CI/CD,想到前公司是使用 GitLab 作為版本控管以及 CI/CD 的解決方案,那就來架一台試試看吧。現在要自架 GitLab 服務相當簡單,除了自己準備好環境即可一鍵安裝,使用 docker 快速建立也是個好選擇。以下分別以二種方式進行安裝,順便留個紀錄:

GCP

  • 建立 Compute Engine,GitLab 服務本身算是蠻吃記憶體的,官方建議的配備是四核心 CPU 以及 4GB 以上的 RAM。我開了一台雙核 4GB 的機器個人使用沒有問題,再低可能會有跑不起來的問題,請選用 e2-medium (2 個 vCPU,4 GB 記憶體) 以上等級的規格
  • 根據官方提供的安裝文件進行安裝,這邊以 ubuntu 為例
    # 更新套件來源並安裝相關套件
    sudo apt-get update
    sudo apt-get install curl openssh-server ca-certificates postfix tzdata -y
    
    # 下載 gitlab ce 一鍵安裝包
    curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
    
    # 安裝 gitlab ce
    sudo apt-get install gitlab-ce
    
    # 修改 external_url 參數為對外網址
    sudo vi /etc/gitlab/gitlab.rb
    
    # 更新設定並重新啟動 GitLab
    sudo gitlab-ctl reconfigure
  • 第一次 GitLab 連線需要設定 root 的密碼,設定完後就算是建立完成了
  • 因為之後需要串 CI/CD,所以還需要建立 GitLab Runner;它算是實際執行 CI/CD 時的程序。安裝方式也有很多種,這邊我偷懶使用 docker 快速建立,請先確認 docker 已經安裝完成
    # 啟用一個 GitLab Runner 的 docker container
    docker run -d --name gitlab-runner --restart always \
      -v /var/run/docker.sock:/var/run/docker.sock \
      -v /srv/gitlab-runner/config:/etc/gitlab-runner \
      gitlab/gitlab-runner:latest
    
    # 查看列表確認是否啟用成功
    docker ps -a

docker on NAS

  • 這邊以 NAS 為主,去年趁雙 11 特價購入的 NAS 上面,已有多個使用 docker 自架的服務;不過自行升級到 16GB 的記憶體使用率一直很低...明明有多餘的 RAM 卻沒有用到感覺很虧!(咦?)這次試著在上面安裝 GitLab,總算是讓使用率突破 20% 了!以下是 QNAP Container Station,docker-compose.yml 的設定,這邊一併把 GitLab Runner 也包含進去:
    version: '3'
    
    services:
            gitlab:
                    image: gitlab/gitlab-ce:latest
                    container_name: gitlab
                    restart: always
                    environment:
                            GITLAB_OMNIBUS_CONFIG: |
                                    # GitLab 對外網址
                                    external_url "https://gitlab.xxx"
                                    # ssh 對外顯示 port;這邊要特別注意,這個 port 是對外顯示用,所以要跟下面 ports 對應,但實際 docker 內部仍是使用 22 作為 ssh 的 port
                                    gitlab_rails['gitlab_shell_ssh_port'] = 50022
                                    gitlab_rails['lfs_enabled'] = true
                                    gitlab_rails['manage_backup_path'] = true
                                    gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
                                    gitlab_rails['backup_keep_time'] = 604800
                                    gitlab_rails["time_zone"] = "Asia/Taipei"
                                    # 這邊因為我有用 SSH Tunnel 服務,所以只開 80 port
                                    nginx['listen_port'] = 80
                                    nginx['listen_https'] = false
                                    # GitLab 有內建 letsencrypt 自動更新,不過我有透過 SSH Tunnel 服務已有 https,不確定設定這個是不是有用...
                                    letsencrypt['enable'] = true
                                    # 憑證快到期仍未更新時,發送通知的 email
                                    letsencrypt['contact_emails'] = ['gitlab@gmail.com']
                                    letsencrypt['auto_renew_hour'] = "12"
                                    letsencrypt['auto_renew_minute'] = "30"
                                    letsencrypt['auto_renew_day_of_month'] = "*/7"
    
                    volumes:
                            - ./gitlab/config:/etc/gitlab
                            - ./gitlab/logs:/var/log/gitlab
                            - ./gitlab/data:/var/opt/gitlab
                    ports:
                            - "50443:443"
                            - "50080:80"
                            - "50022:22"
            gitlab-runner:
                    container_name: gitlab-runner
                    image: gitlab/gitlab-runner:latest
                    restart: always
                    volumes:
                            - "/var/run/docker.sock:/var/run/docker.sock"
                            - "./gitlab/runner-config:/etc/gitlab-runner"

shared Runner

  • 接下來我們要註冊一個 Shared runner,讓在這個 GitLab 裡面的專案都可以透過這個 Runner 跑 CI/CD 的 jobs
  • 先進入 GitLab 的 Admin Area,點選 Runner 查看列表
  • 2021-01-17T02-39-15.485Z.png
  • 右上方的 Set up a shared Runner manually 區塊有一些註冊時需要輸入的訊息:2. 是 GitLab 的對外網址 3. 是 token
  • 使用剛剛啟用的 gitlab-runner container
    # 註冊 GitLab Runner
    docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
     
    Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
    # 這邊輸入 GitLab 的對外網址,參考 Set up a shared Runner manually 2. 的部分
    
    Please enter the gitlab-ci token for this runner
    # 這邊輸入 GitLab 的 token,參考 Set up a shared Runner manually 3. 的部分
    
    Please enter the gitlab-ci description for this runner
    # 這邊可以設定這個 Runner 的說明,非必填
    
    Please enter the gitlab-ci tags for this runner (comma separated):
    # 這邊可以設定這個 Runner 的 tags,非必填
    
    Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
    docker
    # 選擇這個 Runner 的執行方式,因為我們是使用 docker 啟用,所以這邊要輸入 docker
    docker
    
    Please enter the Docker image (eg. ruby:2.6):
    # 執行時預設啟用的 docekr image,這邊視專案而定,之後在 .gitlab-ci.yml 也可以更改
  • 設定完成後如果沒有問題,就會在 Admin Area > Runner 列表中出現

以上完成安裝 GitLab,以及註冊啟用 GitLab Runner,算是完成 CI/CD 的前置作業,之後要如何設定專案 CI/CD,以及 .gitlab-ci.yml;或許下次有機會再分享?也可以參考一下後面提供的參考資料連結,自行實作看看喔!

參考資料

 ​​

文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

最近入手一台新 NAS,因為內建 docker,自架了不少服務在上面。可惜家裡的使用社區網路,沒有對外的實體 IP;通常需要透過業者設定 Port Forwarding,才能從外部連回家裡的機器。致電客服要求申請,他們卻回覆目前已經沒有提供這個服務了;想換一家業者,但合約到期還要 3 個多月...萬念俱灰的情況下,突然想到 ngrok 這個第三方服務,提供 SSH Tunnel 技術,實現本機也可以對外的目的。既然有這種服務,那應該也會有開源的解決方法吧?找了一下果然有,而且還不少;我試用了其中的 antoniomika/sish, beyondcode/expose 不過自架的過程不太順利,server 端感覺有架起來,但 client 端連不過去~後來發現 frp,用 Go 撰寫提供執行檔馬上可用,而且還有中文文件可以查閱。利用 GCP 免費帳號建立的 Compute Engine 做為跳板,終於建立成功了!
 
下面紀錄一下建立的步驟:
文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

CI/CD 在整個開發流程中算是最後的環節,如果公司大一些有 MIS/DevOps 部門,這一塊通常會有專業人士處理;工程師寫完程式後只要 merge master branch,理論上就會自動觸發 CI/CD。不過個人專案不比公司產品,不會特別花錢購買完整的服務不說,自己還要學習怎麼「兜」出 CI/CD 的處理流程。市面上有不少提供 CI/CD 服務的廠商,這邊選用的是 CircleCI免費版提供每周 2500 的額度,以及單線程處理。額度的部分老實說我不是很懂他怎麼計算的,至少我目前還沒有遇到超額得情況?單線程處理對於個人專案來說絕對夠用,畢竟只有一個人開發嘛...(汗)

CircleCI 帳號的建立以及與 GitHub 的串接,這部分網路上已有不少前輩分享請自行 Google;這邊我會以個人專案 twitter-test 為例,直接說明 config.yml 的設定配置。以下是 CI/CD 大致的流程:

  1. 把程式碼 merge 到 GitHub 的 master branch,觸發 CircleCI
  2. 開始 build
  3. 透過 docker 建立環境,使用 CircleCI 專用的 .env 以及測試設定,進行單元測試與整合測試
  4. 開始 deploy
  5. 利用在 CircleCI 設定的 SSH Keys,以 ssh 的方式登入 AWS EC2 更新程式碼並執行 deploy.sh
  6. 完成整個 CI/CD 流程

其中 5. 需要在 CircleCI 設定 SSH Keys,設定流程如下:

- 先進入 AWS EC2 主機後,設定一組 CircleCI 用的登入 key

ssh-keygen -t rsa -b 4096 -m pem -C "circleci@twitter-test"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa): /home/ubuntu/.ssh/id_rsa_circleci
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ubuntu/.ssh/id_rsa_circleci
Your public key has been saved in /home/ubuntu/.ssh/id_rsa_circleci.pub
The key fingerprint is:
SHA256:HIbCXi1JQmCDNB4EX/L3laqG7VHc8G3z/8mALUcDi6Y circleci@twitter-test
The key's randomart image is:
+---[RSA 4096]----+
|=*=o+ .          |
|ooo* o +   .     |
| .. + * = o.     |
|   . + * B..o    |
|    .   Soo.+o   |
|     o oo  .+o.  |
|    . =E   o +.  |
|     o .    o o..|
|      .        o+|
+----[SHA256]-----+

- 這樣會產生 id_rsa_circleci 與 id_rsa_circleci.pub 2 個檔案,把 id_rsa_circleci.pub 寫入 authorized_keys 中

cat ~/.ssh/id_rsa_circleci.pub >> ~/.ssh/authorized_keys

- 取得 id_rsa_circleci 的 PRIVATE KEY

cat ~/.ssh/id_rsa_circleci

20200909005.jpg

- 接著回到 CircleCI,到「Project Settings」

20200909001.jpg

- 選擇左側「SSH Keys」,下面 Additional SSH Keys 區塊,選擇「Add SSH Key」

20200909003.jpg

- 這邊的 Hostname 就是 AWS EC2 的對外 domain 或是 IP,Private Key 就是剛剛在 id_rsa_circleci 取得的那一長串

20200909004.jpg

- 然後到左側「Environment Variables」,「Add Variable」:

  • HOST_NAME:同上,AWS EC2 的對外 domain 或是 IP
  • USER_NAME:登入 AWS EC2 的帳號,我這邊是使用 ubuntu

20200909002.jpg

到這邊 CircleCI 與 AWS EC2 的設定就完成了,接下來要搭配 config.yml 的設定,說明如下:

version: 2

jobs:
  build:
    # 測試環境是根據我的 docker 檔案設定
    docker:
      - image: circleci/php:7.3-node-browsers
      - image: mysql:5.7
        command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --innodb-use-native-aio=0 --server-id=1 --log_bin=ON
        # 這是測試環境的 MySQL 設定,對應到 .env.circleci 裡面的 DB 設定
        environment:
            MYSQL_HOST: 127.0.0.1
            MYSQL_DB: circleci
            MYSQL_USER: root
            MYSQL_ROOT_PASSWORD: root

    working_directory: ~/app

    steps:
      - checkout
      - run: sudo apt update
      - run: sudo apt install -y libsqlite3-dev zlib1g-dev
      - run: sudo apt install -y mariadb-client
      - run: sudo docker-php-ext-install zip
      - run: sudo docker-php-ext-install pdo_mysql bcmath pcntl mbstring
      - run: sudo composer self-update
      - restore_cache:
          keys:
              - composer-v1-{{ checksum "composer.lock" }}
              - composer-v1-
      # 測試環境是根據 .env.circleci 的設定進行
      - run: cp .env.circleci .env
      - run: composer install -n --ignore-platform-reqs
      - save_cache:
          key: composer-v1-{{ checksum "composer.lock" }}
          paths:
              - vendor
      # 這裡是 node.js 的設定,因為這個專案是純後端,所以都註解掉了
      #- restore_cache: # special step to restore the dependency cache if `package.json` does not change
      #    keys:
      #        - node-v1-{{ checksum "package.json" }}
      #        # fallback to using the latest cache if no exact match is found (See https://circleci.com/docs/2.0/caching/)
      #        - node-v1-
      #- run: npm install
      #- save_cache: # special step to save the dependency cache with the `package.json` cache key template
      #    key: node-v1-{{ checksum "package.json" }}
      #    paths:
      #        - node_modules
      #- run: npm run production
      # 建立資料庫,對應到 .env.circleci 裡面的 DB 設定
      - run:
          name: Mysql database
          command: mysql -h 127.0.0.1 -uroot -proot -e "CREATE DATABASE circleci;"
      - run: php artisan key:generate
      - run: php artisan migrate --env=circleci
      - run: php artisan horizon:install
      - run: php artisan passport:install
      - run:
          name: Run Laravel Server
          command: php artisan serve
          background: true
      # 這邊執行測試時是使用 phpunit.xml.circleci 的設定
      - run: vendor/bin/phpunit -c phpunit.xml.circleci
      # 這邊是 Laravel Dusk 的測試,因為這個專案是純後端,所以都註解掉了
      # - run:
      #     name: Start Chrome Driver
      #     command: ./vendor/laravel/dusk/bin/chromedriver-linux
      #     background: true
      # - run:
      #     name: Run Laravel Dusk Tests
      #     command: php artisan dusk
  deploy:
    machine:
      image: circleci/classic:edge
    steps:
      # 這邊其實很單純的就是 ssh 到 EC2 後,切換目錄,執行 git pull 以及 Shell Script;USER_NAME 與 HOST_NAME 則是對應到我們之前在 CircleCI 設定的環境變數
      - run: ssh ${USER_NAME}@${HOST_NAME} 'cd /var/work/twitter-test/ && git pull origin master && sh ./.circleci/deploy.sh'

workflows:
  version: 2
  main:
    jobs:
      - build:
          filters:
            branches:
              # 限定在 master 變動時,才會 build
              only: master
      - deploy:
          requires:
            - build
          filters:
            branches:
              # 限定在 master 變動時,才會 deploy
              only: master

ssh 進入主機後,因為 Laravel 有不少指令需要執行,我這邊是使用 Shell Script 幫我完成,另外因為我在 EC2 上面跑得是 docker,所以需要透過 docker exec 協助執行;以下是 deploy.sh 的說明:

#!/bin/sh

# container name
container=twitter-test
docker_command="docker exec -i $container"

# shutdown the laravel app
$docker_command php artisan down

# update PHP dependencies
$docker_command composer install  --no-interaction --no-dev --prefer-dist
# --no-interaction Do not ask any interactive question
# --no-dev  Disables installation of require-dev packages.
# --prefer-dist  Forces installation from package dist even for dev versions.

# update database
$docker_command php artisan migrate --force
# --force  Required to run when in production.

# cache boost configuration and routes
$docker_command php artisan cache:clear
$docker_command php artisan config:cache
$docker_command php artisan route:cache

# horizon
$docker_command php artisan horizon:purge
$docker_command php artisan horizon:terminate
$docker_command php artisan queue:restart

# rise from the ashes
$docker_command php artisan up

echo 'Deploy finished.'

全部執行過一遍,大概會在 CircleCI 顯示以下畫面

20200909019.jpg

這些就是最基本的 CI/CD 設定了,雖然很陽春,最後 deploy 是靠 Script 執行,不是正統的分目錄版本有問題還可以緊急切換的那種...(汗)不過對於個人專案來說可以做到自動化處理,也算是有達到目的...吧?僅供參考囉

參考資料

Laravel(EC2)CircleCIによるデプロイ(deploy)の自動化

文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

偶然發現 AWS 有提供教育版免費試用的服務,稱為:AWS Educate。剛好手邊有個之前申請的美國 edu email,來試著申請看看吧!

- 點選「加入 AWS Educate」

2020-09-08T15-16-44.422Z.png

- 選擇「Student」

2020-09-08T15-17-34.334Z.png

- 填寫一些關於學校的資料,比較重要的是第一個選項「學校名稱」,在自動完成列表中的學校有跟 AWS 合作,如果透過這些學校完成申請,會拿到 $100 美金的額度;當然這部分會對應到後面填寫的 email。如果不是,則是 $30 的額度。另外最後還有 Promo Code,也會影響申請完成後獲得的額度。這部分我在網路上沒找到,所以最後只拿到 $30...(囧)

- 畢業月份是 6 月,年份請用今年+4,生日年份則是今年-18

2020-09-08T15-17-34.335Z.png

- 合約要看完,右邊下拉列拉到底後,勾選「I Agree」後「SUBMIT」

2020-09-08T15-23-33.769Z.png

- 完成申請

2020-09-08T15-24-06.399Z.png

- edu 的信箱會馬上收到一封信,點選信中的連結完成 email 認證

FireShotCapture003.png

- 認證完成後會再收到一封通知信,大概是說明會需要等待一段時間審核,我的經驗是 2 天

FireShotCapture006.png

- 2 天後會收到審核通過的通知信,點選「Click」設定密碼,帳號就是這個 email 

FireShotCapture012.png

- 從 AWS Educate 登入系統

FireShotCapture015.png

- 點選「AWS Account」就可以看到你目前擁有的額度,以及有效時間;接著點選「AWS Educate Starter Account」

FireShotCapture018.png

- 這邊會有一個中介頁,左邊是一些常見的 FAQ,右邊有詳細的額度,點選「AWS Console」即可轉入熟悉的 AWS 管理控制台

FireShotCapture021.png

- 幾乎 AWS 所有的服務都可以用,但是僅限於美國東部 (維吉尼亞州北部) us-east-1 這個區域

FireShotCapture024.png

到這邊就算是整個完成申請與實際使用了。老實說 $30 額度其實不怎麼夠阿...以 EC2 最低配備每小時 0.0116 計算,也只能連續開 100 多天;整體來說開個免費帳號試用都比這個要划算很多~(囧)原本以為歪果仁對學生的很大方 der...失算了~又或許如果你的 email 有在 AWS 合作的學校中,獲得 $100 的額度,也可以勉強用到一年...吧?

文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

- 安裝 docker/docker-compose

sudo apt-get update
sudo apt-get remove docker docker-engine docker.io
sudo apt install docker.io -y
sudo service docker start

 

- docker-compose 最新版安裝請參考官網說明

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

 

- 讓目前登入的使用者可以使用 docker
sudo usermod -aG docker $USER

 

- 讓 docker 在重新開機時啟動

sudo systemctl enable docker

 

- 安裝 phpredisadmin via docker

sudo vi docker-compose.yml

 

phpredisadmin:
  image: erikdubbelboer/phpredisadmin:latest
  container_name: phpredisadmin
  restart: always
  environment:
    - ADMIN_USER=admin #登入名稱
    - ADMIN_PASS=admin #登入密碼
    - REDIS_1_HOST=localhost #登入位置
    - REDIS_1_PORT=6379
    - REDIS_1_DATABASES=16 #如果是使用 Amazon ElastiCache 需要特別指定
  ports:
    - "9999:80" #本機port 對應 container port
文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

Close

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

reload

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼