Bu yazımda Hugo ile oluşturulmuş bir web sitesini, CI/CD aracı olan TravisCI ile AWS S3 üzerine yayınlayacağız.
Neden Hugo
Şimdiye kadar onlarca araç denedim, kullandım. Sunucu taraflı olarak Drupal 7’yi uzun süre kullandım, siteyi statik şekilde arşivledim ve kenara aldım. Onlarca statik web sitesi aracı denedim, Jekyll, Octopress, Pelikan, Lektor ve bir aklıma gelen gelmeyen bir çok araç. Zilyon adet çözüm mevcut. Bu tür araçları kullanırken gördüğüm en büyük sorunlar:
Sunucu taraflı olanların canlı sistem olmaları, bakıma ve izlenmeye ihtiyaç duymaları, kaynak tüketmeleri, güvenlik açıkları, veri tabanı bağımlılıkları…
Şu anda aklıma gelen taslakları, yazılım geliştirirken karşılaştığım “pis kokan” kod parçalarını markdown ile rahatça yazabildiğim Heroku üzerinde çalışan bir Django uygulaması mevcut.
İşi profesyonel bloggerlık olmayan ve bakmakla yükümlü olduğu diğer “canlı” web uygulamaları olan bizler için statik web sitelerini çok daha sevimli bulanlardanım.
Hikaye kısmını burada bırakıp sürecimizi üç aşamaya ayıralım:
- Develop: Hugo’nun kurulması ve lokal geliştirme ortamının oluşturulmasını anlatacağız.
- Config: TravisCI ve AWS S3 ayarlarının yapılmasını burada anlatacağız.
- Deploy & Run: TravisCI ile web sitemizi nasıl yayınlayacağımızı anlatacağız.
İhtiyacınız olanlar:
- TravisCI hesabı
- AWS hesabı
1. Develop
GoHugo > Installing adresinden işletim sisteminize uygun ve kolayınıza gelen yöntemlerden biri ile komut satırı aracını kurmanız gerekiyor.
Debian tabanlı bir işletim sisteminde kurulum çok basit:
wget https://github.com/gohugoio/hugo/releases/download/v0.37.1/hugo_0.37.1_Linux-64bit.deb
sudo dpkg -i hugo_0.37.1_Linux-64bit.deb
Quick Start kısmını takip ederek iki dakika içinde ilk içeriğinizi yazmaya başlayabilirsiniz.
Hugo ile henüz yayınlanmasını istemediğiniz içerikleri taslak olarak kaydedebilir, veya ileri bir yayınlanma tarihi verebilirsiniz. Böylece açıkça belirtmediğiniz taktirde taslaklarınız veya ileri tarihli yazılarınız yayınlanmamamış olur.
Yazılarınızı yazarken taslak aşamasından olan yazılarınızı da görmek isteyebilirsiniz.
Bunu Hugo’ya belirtmemiz gerekiyor. Makefile
kullanmayı seviyorum. make
dediğinizde http://127.0.0.1:1313 adresindeki web sunucusuyla sitenizin
önizlemesini görebilirsiniz.
Makefile
downloaddefault: develop
DEVELOP := hugo
–watch serve
–destination /tmp/blog_dev
–buildDrafts
–buildFuture
–baseURL=127.0.0.1
develop:
$(DEVELOP)
.PHONY: default develop
Artık Github’da web siteniz için yeni bir repo oluşturabilir ve değişikliklerinizi push edebilirsiniz.
2. Config
S3 Bucket Oluşturma ve İzinleri Ayarlama
S3 Console adresinden yeni bir bucket
oluşturalım. Web sitesi olarak kullanacak ve özel bir alan adı üzerinden yayın yapmayı düşünüyorsanız, foo.example.com
isminde bucket açmanız gerekiyor. Bkz.
S3 VirtualHosting
IAM servisi ile travisci için bir kullanıcı oluşturalım ve oluşturulan Access Key ve Access Secret değerlerini kaydedelim. Kaydetmediğiniz taktirde her ihtiyacınız olduğunda yeni bir Security Credential oluşturmanız gerekecek.
Bucket ve kullanıcımızı oluşturduk. TravisCI üzerinden S3’e dosyalarımızı yükleyecek bu kullanıcımıza gerekli izinleri vermek için
Add Permission > Attach existing policies directly > Create Policy > JSON
yolunu takip ederek
AWS S3 Website Policy
download{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::foo.example.com/*"
]
}
]
}
gerekli izinleri veriyoruz.
Deploy & Run
Hugo web sitemizi çalışır hale getirdik, S3 bucket oluşturup izinleri ayarladık. TravisCI ile Hugo web sitemizi derleyip, S3 üzerine yayınlayabiliriz.
Öncelikle reponun ana dizinine .travis.yml
adında bir dosya eklememiz gerekiyor.
TravisCI Config
downloadsudo: required
dist: trusty
before_install:
- wget https://github.com/gohugoio/hugo/releases/download/v0.37.1/hugo_0.37.1_Linux-64bit.deb && sudo dpkg -i hugo_0.37.1_Linux-64bit.deb
script:
- hugo --theme=paperback
deploy:
provider: s3
on: master
skip_cleanup: true
access_key_id: $S3_KEY
secret_access_key: $S3_SECRET
bucket: $S3_BUCKET
region: $S3_REGION
acl: public-read
local_dir: public
Yirmi satırdan az bir konfigürasyon dosyası ile sitemizi yayınlayabiliyoruz.
İlk beş satırda hugonun kurulumunu yapıyoruz.
sudo: required
dist: trusty
before_install:
- wget https://github.com/gohugoio/hugo/releases/download/v0.37.1/hugo_0.37.1_Linux-64bit.deb && sudo dpkg -i hugo_0.37.1_Linux-64bit.deb
Hugonun public
dizini altına paperback
dizini altına web sitemizi oluşturmasını
sağlıyoruz. Temayı buradan vermek zorunda değilsiniz. config.toml
dosyanızda
theme = "paperback"
ile temayı tanımlayıp hugo
komutunu parametresiz çalıştırmanız
yeterli.
script:
- hugo --theme=paperback
Bu satırları tek tek açıklayalım.
deploy:
provider: s3
on: master
skip_cleanup: true
access_key_id: $S3_KEY
secret_access_key: $S3_SECRET
bucket: $S3_BUCKET
region: $S3_REGION
acl: public-read
local_dir: public
satır 12, sadece master branch için deployement yapılacağını bildiriyor.
Başka ifadeyle develop
üzerinden derleme tetiği verdiğinizde bu kısım
dikkate alınmayacaktır.
satır 14-17, başlarında $ olan ifadeler, bu ifadelerin TravisCI üzerinden tanımlanan Environment Variable olduğunu bildiriyor.
satır 18, yüklenecek yeni dosyaların herkes tarafından görülebilmesi için S3 üzerine yüklenen dosyaların izinleri anonim olarak ayarlanıyor.
satır 19, oluşturulan dosyaların hangi klasörde olduğunu ve deployement’ın bu klasörden yapılmasını gerektiğini bildiriyor.