Test Raporunu Slack Kanalına Otomatik Olarak İletmek

Testleri çalıştırdık nihayetinde rapor oluştu. İlgili raporu, ekibin haberi olsun diye slack kanalına otomatik olarak yollamak istiyoruz diyelim. Toplam 5 adımda bunu yapabilmek mümkün, adımlar şöyle:

  • Test otomasyon raporunun iletileceği slack kanalının oluşturulması.

  • İlgili kanala raporları yollayacak bot/app oluşturulması.

  • Bot’a, kanal üzerinde işlem yapabilmesi için yetki verilmesi

  • Bot’un slack kanalına davet edilmesi.

  • Slack API’leri kullanarak, raporun kanala iletilmesi.

Slack Kanalı Oluşturma

Slack uygulaması üzerinden:

  • ChannelsAdd channelsCreate a new channel butonuna tıklanır.

Gelen ekranda:

  • Project starter kit

  • Team support

  • 1-1 Coaching

gibi çeşitli templateler var. Size uyan herhangi bir template varsa seçebilirsiniz, aksi durumda Blank channel seçip, kanala bir isim verip kaydettikten sonra kanalınız açılmış demektir.

Kanal oluşturduktan sonra, kanalın ID’sini mutlaka bir yere not etmelisiniz. Kanal ID’sine erişmek için şu adımları takip edebilirsin.

  • Uygulama üzerinden Slack kanalına git

  • Kanalın üzerine tıkla ve kanal detaylarına git

  • Detaylar arasında Channel ID’yi bul.

Channel ID genellikle C harfi ile başlıyor.

Örnek: C0931HQTPE1

Bot Oluşturmak

https://api.slack.com/ adresine gidelim ve Slack hesabımıza login olalım.

Gelen ekranda:

  • Your Apps butonuna tıklanır.

  • Create New AppFrom scratch seçilir. Akabinde Name app & choose workspace ekranı gelecektir.

  • App Name kısmına, botunuzun adını verin. Örn: Ulak

  • Pick a workspace to develop your app in: kısmına oluşturduğunuz kanal hangi workspace’de ise onu seçin.

  • Create App diyerek botu oluşturalım. Yeni botumuz hayırlı olsun 🎉😀🎉

Slack Botuna Yetkilerin Verilmesi

Şimdi, botun ayarlarına gidelim. Features kısmından önce Incoming Webhooks’u aktif edelim sonrasında OAuth & Permissions sekmesine gidip “Install to size_ait_olan_workspace“ butonu olması gerekli ona tıklayalım.

Akabinde Scopes bölümünde bota şu yetkileri verelim:

  • chat:write

  • files:write

  • files:read

  • incoming-webhook

Bot’un Slack Kanalına Davet Edilmesi

Slack kanalını oluşturduk, peşinden botu oluşturup yetkilerini verdik. Sırada ilgili botun kanala davet edilmesi kaldı. Bot’un kanala davet edilmesi önemli, aksi durumda ilgili kanala rapor yollayamayız.

Bot’u kanala davet etmek için, ilgili kanalda mesaj attığımız kutucuğa gelip şu komutu çalıştırmalısınız:

/invite @senin-test-otomasyon-botunun-ismi

Dosya’nın Slack Kanalına Gönderilmesi

Bu bölüme uyarıyla başlayalım. Slack’in dokümanda bahsettiği gibi dosya gönderimi için files.upload metodunu kullanıyorsanız 11 Mart 2025 tarihine kadar yeni yönteme geçmeniz gerekmekte. Biz yeni yöntemle ilerliyor olacağız.

Slack’in bahsettiği yeni yöntemle dosya gönderim işini 3 adımda yapabileceğiz. Bu 3 adım kısaca şöyle:

  1. files.getUploadURLExternal end-pointine git. Dosya adı ve dosya boyutuyla(byte cinsinden) alakalı bilgi ver.

  2. İlk adımdan dönen cevapta, dosyayı upload etmen gereken URL ve dosyaya atanan ID bilgisi verilecek. Dosyayı ilgili URL’ye upload et.

  3. Son aşama olan files.completeUploadExternal end-pointine git. Dosyanın hangi kanala, hangi isimle ve açıklamayla atılacağını söyle.

Dosya gönderme işleminin 3 aşamayı bölünmesi hız ve güvenlik kaygılarından dolayı ortaya çıkmış. Bu aşamalar sayesinde büyük boyutlu dosyalar hızlı biçimde taranabilir ve gönderme işlemi yapılabilir.

Birinci Adım

curl --location 'https://slack.com/api/files.getUploadURLExternal' \
--header 'Authorization: Bearer xoxb-senin-token-buraya-gelecek' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'filename=rapor.tar.gz' \
--data-urlencode 'length=185988'

İlk istekte dikkat edilmesi gereken alanlar:

  • Authorization: buraya botunuza ait olan token bilgisi gelmelidir. İlgili token’ı api.slack.com adresinden, botunuza ait OAuth & PermissionsOAuth Tokens sekmesi altında bulabilirsiniz.

  • Content-type: mutlaka x-www-form-urlencoded olmalıdır.

  • Filename: dosyanızın adını uzantısıyla birlikte yazmalısınız

  • Length: dosyanızın byte cinsinden boyutu. Örneğin 186KB’lık dosya için 185988 şeklinde yazdım.

Bu bilgileri doldurduktan sonra POST işlemi yapmanız gerekmekte.

Dönen cevap şuna benzemeli:

upload_url'ye ikinci adımda, file_id'ye üçüncü adımda ihtiyacımız olacak.

İkinci Adım

Birinci adımdan elde ettiğimiz upload_url’ye POST işlemi yapacağız. isteği form olarak yapıp dosya path’ini belirtmemiz gerekmekte.

curl --location 'https://files.slack.com/upload/v1/sana-verilen-url' \
--form '=@"/Users/zaferdu/Downloads/dosya-adi.tar.gz"'

İkinci adımda bir şeyleri yanlış yapsanız bile 200 cevabı dönebiliyor. Bu nedenle cevap olarak hem 200 hem de dosya boyutunuzu byte cinsinden döndüğünden emin olun.

Üçüncü Adım

curl --location 'https://slack.com/api/files.completeUploadExternal' \
--header 'Authorization: Bearer xoxb-senin-token-buraya-gelecek' \
--header 'Content-Type: application/json; charset=utf-8;' \
--data '{
    "files": [
        {
            "id": "F08849C1WGN",
            "title": "test-otomasyon-rapor.tar-gz"

        }
    ],
    "channel_id": "C2874HQNPE1",
    "initial_comment": "init comment"
}'

Dikkat edilmesi gereken parametreler:

  • Authorization: ilk adımda da lazım olmuştu, token’ı nereden alacağınızı biliyorsunuz.

  • Id: ilk isteği attıktan sonra dönen cevapta dosyanızın id'si veriliyor. Buraya o id’yi yazmalısınız.

  • Title: dosyanızın slack kanalında hangi isimle görünmesini istiyorsanız, onu yazabilirsiniz. İlk adımda belirttiğiniz dosya isminden farklı olabilir.

  • Channel_id: dosyayı hangi kanala yollacacaksanız onun ID bilgisi gerekmekte. Birden fazla kanala yollamak istiyorsanız aralarına virgül koyabilirsiniz.

  • Initial_comment: dosyayı hangi açıklamayla atmak istiyorsanız o bilgiyi girebilirsiniz.

Tüm bu bilgileri doldurup files.completeUploadExternal end-pointine POST işlemi yapmalısınız.

Her şey yolunda gittiyse, dosya kanala gitmiş olmalı.

Bundan Sonrası

Dosyanın Slack Kanalına Gönderilmesi akışını cURL üzerinden anlatmayı tercih ettim. Sebebi; tüm ekipler için ortak bir dil olabilir şeklinde düşünmemdir. Kullandığınız pipeline Azure, Github, Gitlab vb. olabilir ve rapor ortaya çıktıktan sonra bu işlemleri yapmak için Bash, Java, JS gibi farklı programlama dillerini kullanabilirsiniz. Dolayısıyla cURL bu programlama dillerinin ortasında duruyor, siz hangi programlama dili kullanıyorsanız ona göre implemente edebilirsiniz.

Bir sonraki yazıda görüşmek üzere, şimdilik hoşça kalın 👋👋