Featured image of post Woodpeak Git Push 至私有 git

Woodpeak Git Push 至私有 git

Git 連線限制

最近在設定部落格的自動更新,發現自己架的 gitea 伺服器只有對外開放 https
git 指令內預設是走 ssh 才能使用免密碼,用 key 作身分驗證
為了解決身分驗證的問題,花了一些時間整理解決方式

如果你的目的是 GitHub 或 GitLab 這種不是自己架的,不會有這問題

順便紀錄怎麼使用 drone-git-push

1. 改用 https + 帳號密碼驗證

如果原本 gitea 就已經設定好 https 連線,這是簡單方便的方式,只要改專案的CICD設定就好了
將 git remote 的設定字串,改成下面的格式就好了

📄 secret-remote-string
1
https://username:password@your.gitea.com/username/repository.git

如果擔心明文會洩漏帳號密碼,可以用 woodpecker secret
先在 woodpecker 中加入上面的 remote 字串,到專案的 secret
再改專案中的 .woodpecker 設定檔, remote 的地方改成調用 secret

</> yml
1
2
3
4
5
6
7
8
steps:

  - name: Commit changes
    image: appleboy/drone-git-push
    settings:
      branch: main
      remote:
        from_secret: secret-remote-string

2. IP直連

假設已經準備好 ssh key (如果沒有,可以跳去後面看完整教學)

預先調整網路設定,讓 woodpecker 伺服器跟 gitea 伺服器可以用 IP 直連
例如穿透、轉發或乾脆放同網段

改完之後,將 git remote 改成如下格式,搭配原本的 key 連線即可

1
git@gitea-ip:username/repository.git

如果 gitea 的 ssh port 不是在預設的 22

1
ssh://git@gitea-ip:port/username/repository.git

3. revers proxy 轉發 22 port

這個方法是第一個方法的延伸,如果有時間設定建議可以改成這樣,後面使用也比較方便
既然 gitea 用非標準的 port,那就在 revers proxy 改回來就好了

當然,如果你能直接改 gitea 的 port 最省事

通常 revers proxy 會設定讓大部分內網段都能連到(至少我是這樣設定),不用再重複設定網段穿透
至於對不對外開放可以另外考慮,我只設定內網不同網段也可以連到

設定方式請參考 Gitea - 自己的 Git 自己架

drone-git-push 使用教學

例如使用 ssh key 認證,push 到 github 上

設定連線 SSH Key

使用指令產生公私鑰

bash
1
ssh-keygen -f keyname

中間 -f 可以自行選擇存放的位置跟檔名
如果沒指定 -f ,預設存在 ~/.ssh/

完成之後會生成 keyname 跟 keyname.pub 兩個檔案
keyname.pub 就是公鑰
keyname 就是私鑰,必須要保存好


將公鑰上傳到 github

到 github 點右上角大頭貼 > settings > 左邊 SSH and GPG keys

點 new SSH key, title 打方便辨識的名字,例如我就放一個 Key 是 woodpecker 專用
將 keyname.pub 的內容貼上就完成了

將公鑰的內容貼進去就可以了


將私鑰內容貼到 woodpecker secret

打開 woodpecker 到專案內點齒輪設定 > Secrets

點 add secrets

name 可以寫個方便辨識的名字
value 貼上私鑰的內容 (END後面的換行要保留)

📄 value
1
2
3
4
-----BEGIN OPENSSH PRIVATE KEY-----
abcdefghi...
OOXXc=
-----END OPENSSH PRIVATE KEY-----

Avalable Plugin 可以指定這個 secret 只有哪個步驟能用
例如我可以填上 appleboy/drone-git-push,就只有 image 用到 drone-git-push 這些步驟能用
留空白代表不限制

Avalable at following event 可以指定在哪些 git 或 woodpecker 操作可以使用這個 secret
這邊的 git 操作指的是你的操作觸發 woodpecker,而不是 drone-git-push 內的動作

woodpecker 設定檔

照前面設定把 Key 跟 secret 設定好之後,就可以在流程內加步驟了

</> yml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  - name: push git
    image: appleboy/drone-git-push
    environment:
      PLUGIN_BRANCH: main
      PLUGIN_SSH_KEY:
        from_secret: github_key
      PLUGIN_REMOTE: "git@github.com:user/repo.git"
      PLUGIN_AUTHOR_NAME: user
      PLUGIN_AUTHOR_EMAIL: email
      PLUGIN_COMMIT: true
      PLUGIN_COMMIT_MESSAGE: "Auto generated using Woodpecker CI"

上面寫的是基本用法
如果除了 git push 的指令還需要跑別的東西,可以用 commands
例如,我的編譯跑完之後,我只想推送編譯完的檔案出去,而不是專案原始碼

  • 先 cd 進到編譯完的 public 資料夾
  • 初始化儲存庫
  • 強制推送至 github
</> yml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
  - name: deploy git page
    image: appleboy/drone-git-push
    environment:
      PLUGIN_BRANCH: main
      PLUGIN_SSH_KEY:
        from_secret: github_key
      PLUGIN_REMOTE: "git@github.com:ZoneLin/blog-public.git"
      PLUGIN_AUTHOR_NAME: zoneLin
      PLUGIN_AUTHOR_EMAIL: th5331958@gmail.com
      PLUGIN_FORCE: true
      PLUGIN_COMMIT: true
      PLUGIN_COMMIT_MESSAGE: "Auto generated using Woodpecker CI"
    commands:
    - cd public
    - git init
    - /bin/drone-git-push

隨副 drone-git-push 用法參考
https://woodpecker-ci.org/plugins/Git%20Push

參考來源

Photo by Yancy Min on Unsplash

使用 Hugo 建立
主題 StackJimmy 設計