はじめに
ブログ記事の作成から公開までの流れを自動化するために、便利なスクリプトを作成しました。このスクリプトを使うことで、記事の作成、編集、公開までの一連の作業を効率化できます。
内容
blogスクリプトの機能
プロジェクトのルートディレクトリにある blog
スクリプトは以下の機能を提供します:
記事ファイルの自動生成
- 日付とタイトルから適切なファイル名を生成
- Hugoのフロントマターを自動で設定
- 記事の基本構造(はじめに、内容、まとめ)を自動挿入
編集環境の自動起動
- VSCodeで記事ファイルを自動で開く
- 編集完了まで待機する機能
公開プロセスの自動化
- Gitへの追加・コミット
- リモートリポジトリへのプッシュ
- GitHub Actionsによる自動デプロイ
使用方法
./blog "記事のタイトル"
例:
./blog "新しいブログ記事"
スクリプトの流れ
- タイトルを受け取り、日付と組み合わせてファイル名を生成
hugo new
コマンドで記事ファイルを作成- フロントマターのタイトルを更新
- 基本的な記事構造を追加
- VSCodeで記事を開いて編集待機
- 編集完了後、公開確認
- 公開する場合、Git操作を実行
スクリプトコード
#!/bin/bash
# Blog post creation script
# Usage: ./blog <title>
if [ -z "$1" ]; then
echo "Usage: blog <title>"
echo "Example: blog 'My New Post'"
exit 1
fi
# Get the title and create filename
TITLE="$1"
DATE=$(date +%Y-%m-%d)
FILENAME_TITLE=$(echo "$TITLE" | sed 's/ /-/g' | tr '[:upper:]' '[:lower:]')
FILENAME="content/posts/${DATE}-${FILENAME_TITLE}.md"
# Create new Hugo post
echo "Creating new post: $FILENAME"
hugo new "$FILENAME"
if [ ! -f "$FILENAME" ]; then
echo "Failed to create post file"
exit 1
fi
# Update the title in the frontmatter
sed -i '' "s/title: .*/title: \"$TITLE\"/" "$FILENAME"
# Add some initial content
cat >> "$FILENAME" << 'EOF'
## はじめに
## 内容
## まとめ
EOF
echo "Opening $FILENAME in VSCode..."
echo "Edit your post and save. The script will wait for you to finish editing."
echo "Press Ctrl+C to cancel without publishing."
# Open in VSCode and wait for it to close
code --wait "$FILENAME"
# Check if user wants to publish
echo ""
read -p "Do you want to publish this post? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "Publishing post..."
# Add and commit the new post
git add "$FILENAME"
git commit -m "Add new blog post: $TITLE"
# Push to remote
git push origin main
echo "Post published successfully!"
echo "Your blog will be updated shortly via GitHub Actions."
else
echo "Post saved as draft. You can publish it later with:"
echo " git add $FILENAME"
echo " git commit -m 'Add new blog post: $TITLE'"
echo " git push origin main"
fi
コード解説
1. 引数チェック
if [ -z "$1" ]; then
echo "Usage: blog <title>"
echo "Example: blog 'My New Post'"
exit 1
fi
タイトルが渡されているかチェックし、なければ使用方法を表示して終了。
2. ファイル名生成
TITLE="$1"
DATE=$(date +%Y-%m-%d)
FILENAME_TITLE=$(echo "$TITLE" | sed 's/ /-/g' | tr '[:upper:]' '[:lower:]')
FILENAME="content/posts/${DATE}-${FILENAME_TITLE}.md"
- 現在の日付を取得
- タイトルをファイル名用に変換(スペース→ハイフン、小文字化)
- 最終的なファイルパスを生成
3. Hugo記事作成
hugo new "$FILENAME"
if [ ! -f "$FILENAME" ]; then
echo "Failed to create post file"
exit 1
fi
Hugoコマンドで記事ファイルを作成し、失敗時はエラーで終了。
4. フロントマター更新
sed -i '' "s/title: .*/title: \"$TITLE\"/" "$FILENAME"
生成されたファイルのタイトルを指定したものに更新。
5. 基本構造追加
cat >> "$FILENAME" << 'EOF'
## はじめに
## 内容
## まとめ
EOF
記事の基本的な構造を追加。
6. 編集・公開プロセス
code --wait "$FILENAME"
read -p "Do you want to publish this post? (y/N): " -n 1 -r
if [[ $REPLY =~ ^[Yy]$ ]]; then
git add "$FILENAME"
git commit -m "Add new blog post: $TITLE"
git push origin main
fi
- VSCodeで編集(
--wait
で編集完了まで待機) - 公開確認後、Git操作を実行
便利な機能
- ファイル名の自動正規化: スペースをハイフンに変換し、小文字に統一
- エラーハンドリング: ファイル作成失敗時の適切なエラーメッセージ
- 公開の選択制: 編集後に公開するかどうかを選択可能
- ドラフト保存: 公開しない場合でもドラフトとして保存