go:embedを使用したファイルの埋め込み
Go言語で外部ファイルを読み込むとき、go:embedディレクティブを使うと実行バイナリにファイルを埋め込むことができます。
変数の前に//go:embed ファイル名
のように書きます。
コード
main.go
package main
import (
_ "embed"
"fmt"
)
//go:embed secret.pem
var secretKey []byte
func main() {
fmt.Printf("埋め込んだファイルの中身\n%s\n", secretKey)
}
secret.pem
-----BEGIN PRIVATE KEY-----
FOOBAR0123456789foobar0123456789FOOBAR0123456789foobar0123456789
FOOBAR0123456789foobar0123456789FOOBAR0123456789foobar0123456789
-----END PRIVATE KEY-----
実行結果
$ go run main.go
埋め込んだファイルの中身
-----BEGIN PRIVATE KEY-----
FOOBAR0123456789foobar0123456789FOOBAR0123456789foobar0123456789
FOOBAR0123456789foobar0123456789FOOBAR0123456789foobar0123456789
-----END PRIVATE KEY-----
GitHub Actionsで動かしてみる
秘密鍵のようにコミットしたくないファイルは Actions secretsに中身を設定して、そこからsecret.pemファイルを作成するようにしてみます。
Actions secretsでは改行がそのままでは使えないようなのでbase64でエンコードしてから設定しています。
$ base64 secret.pem
LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCkZPT0JBUjAxMjM0NTY3ODlmb29iYXIwMTIzNDU2Nzg5Rk9PQkFSMDEyMzQ1Njc4OWZvb2JhcjAxMjM0NTY3ODkKRk9PQkFSMDEyMzQ1Njc4OWZvb2JhcjAxMjM0NTY3ODlGT09CQVIwMTIzNDU2Nzg5Zm9vYmFyMDEyMzQ1Njc4OQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg==
.gitignore
secret.pem
.github/workflows/embed.yml
name: Embed
on:
push:
branches:
- "main"
jobs:
test:
name: Embed
runs-on: ubuntu-latest
steps:
- name: Setup Go
uses: actions/setup-go@v3
with:
go-version: '>=1.18'
- name: Checkout
uses: actions/checkout@v3
- name: Create secret.pem
env:
SECRET_KEY: ${{ secrets.SECRET_KEY }}
run: echo -n $SECRET_KEY | base64 --decode > secret.pem
- name: Run
run: go run main.go
Action実行結果
参考
GithubActionsでjsonファイルをSecretsから展開する(Base64)