當我撰寫與Apache APISIX相關的部落格文章時,我希望我的同事們能先行審閱。但這是我的個人部落格,由於我混合了個人與商業內容,因此我不希望將它們納入版本庫。我需要一種僅供少數人預覽的方式,類似於Vercel的預覽功能。我正在使用GitLab Pages,但這裡並沒有現成的此類功能。
I tried two methods: GitHub gists and PDFs. Both have issues.
Gists的展示效果不如最終網頁精美。我試圖透過使用DocGist來改善這種情況。雖然有所改進,但仍非萬全之策。
此外,由於我使用Asciidoc撰寫文章,Gists無法顯示圖片。我必須將圖片設置在註釋中,這會打斷閱讀的流暢性。我曾嘗試將圖片附加到gist中,但它們在文章中的流暢性仍然無法呈現。相較於註釋,這種方式的優點是內容有序;缺點則是我需要修改Asciidoc。
I used gists because I’m used to GitHub reviews. But since it’s my blog, I neither need nor want the same kind of reviews as in a regular Merge Request. I need people to point me to when something needs to be clarified or I missed a logical jump, not that I made a typo (I use Grammarly for this). For this reason, a PDF export of a post is enough to review.
然而,PDF格式本身也存在問題:網頁可能是無限延伸的,而標準PDF頁面則將前者切割成固定尺寸。這可能導致圖表被分割。此外,PDF格式使得內容的傳播變得更加困難。
在本文中,我將描述如何配置GitLab Pages以獲得我所期望的預覽效果。
GitLab Pages概述
GitLab Pages與GitHub Pages類似:
透過GitLab Pages,您可以直接從GitLab中的倉庫發布靜態網站。
要使用Pages發布網站,您可以使用任何靜態網站生成器,如Gatsby、Jekyll、Hugo、Middleman、Harp、Hexo或Brunch。您也可以直接發布使用純HTML、CSS和JavaScript編寫的任何網站。
這就是您看到這篇博客文章的方式。我發現GitLab Pages沒有預覽功能。我向專家詢問無果;GitLab不提供預覽。
規劃工作
I didn’t believe it initially, but you only need to create a dedicated artifact. Since the artifact consists of web files, the browser will render them.
想法是創建一個可通過URL訪問的工件,該URL不易被預測。然後我可以與我的同事分享該URL並請求他們的審查。首先,我們可以複製現有的master
構建:
stages:
- preview
preview:
stage: preview
image:
name: registry.gitlab.com/nfrankel/nfrankel.gitlab.io:latest
before_script: cd /builds/nfrankel/nfrankel.gitlab.io
script: bundle exec jekyll b --future -t --config _config.yml -d public
artifacts:
paths:
- public
only:
refs:
- preview
variables:
JEKYLL_ENV: production
此時,網站可在https://$CI_PROJECT_NAMESPACE.gitlab.io/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/public/index.html
訪問。然而,還有很多問題需要修復。
實現功能
讓我們按重要性順序解決這些問題。
修復訪問權限
該項目是私有的;因此,只有我可以訪問該工件:這違背了最初提供預覽給他人的目的。
I want to give my teammates only limited access to my GitLab repository. I gave them Guest access, according to the Principle of least privilege. However, it still didn’t work.
根據文檔,您還必須使您的流水線公開。前往設置 > CI/CD > 通用流水線,並勾選公開流水線的複選框。
修復相對鏈接
I use Jekyll to build HTML from Asciidoc. To generate links, Jekyll uses two configuration parameters:
- 域名,例如,通過
url
設置 - 路徑,例如,
/
,與baseurl
在預覽中均有所不同。您必須在YAML配置文件中設置這些參數;並無環境變量替代方案。
讓我們相應地調整構建:
preview:
stage: preview
image:
name: registry.gitlab.com/nfrankel/nfrankel.gitlab.io:latest
before_script:
- cd /builds/nfrankel/nfrankel.gitlab.io
- "printf 'url: https://%s.gitlab.io\n' $CI_PROJECT_NAMESPACE >> _config_preview.yml" #1
- "printf 'baseurl: /-/%s/-/jobs/%s/artifacts/public/\n' $CI_PROJECT_NAME $CI_JOB_ID >> _config_preview.yml" #2
- cat _config_preview.yml #3
script: bundle exec jekyll b --future -t --config _config.yml,_config_preview.yml -d public #4
- 使用
CI_PROJECT_NAMESPACE
環境變量設置url
。由於它固定不變,我本可以使用硬編碼值,但這樣會使腳本更具可重用性 - 使用
CI_PROJECT_NAME
和CI_JOB_ID
環境變量設置baseurl
。後者是需求中的隨機部分 - 為調試目的顯示配置內容
- 使用它!
提升可用性
每次都分發正確的URL實在煩人。最好在構建後在控制台中記錄下來:
after_script: echo https://$CI_PROJECT_NAMESPACE.gitlab.io/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/public/index.html
還有一點缺失。GitLab Pages提供一個索引頁面。例如,如果您請求https://blog.frankel.ch,他們將提供根index.html
。使用普通工件則非如此。鑑於我只想提供一個預覽帖子,這不是問題,因此我沒有進一步研究配置。
使用方法
至此,我只需推送至我的preview
分支:
git push --force origin HEAD:preview
錦上添花的是,我們無需本地擁有該分支;只需推送至遠程分支即可。
結論
在這篇文章中,我展示了如何在幾個步驟內預覽GitLab Pages並與隊友分享預覽的URL。最困難的部分是理解網頁工件通常是使用瀏覽器進行渲染的。
進一步探討: