운영에서 정기적인 프로그램 리노베이션 자동화
담당은 @ryooo 입니다. 잘 부탁드립니다.
소개
게임 서비스를 운영하고 있으면 정기적인 이벤트 페스티벌 등의 운영 태스크가 있습니다.
모든 파라미터가 마스터화되어 있으면 데이터 투입만으로 실시할 수 있습니다만, 다양한 사정으로부터 그렇게 되어 있지 않고, 소스 파일상에서 필요한 대응도 몇개인가 있습니다.
그러한 속인적이 되기 쉬운 구현 업무를 자동화해, 엔지니어는 신기능 개발 등의 보다 가치를 낳는 작업에 조금이라도 커밋할 수 있으면 하는 툴의 소개입니다.
※ 소스의 완전한 공개까지는 되어 있지 않고, 본고에서도 여러가지 사랑하고 있습니다만 용서해 주세요.
무엇을 할 수 있는가
input (설정 파일 준비)
소스 파일 수정을 위한 변수 정보가 포함된 설정 파일(yml)
process(rake 작업에 흘리면)
output (프로그램을 수정합니다)
수정된 프로그램
※ 실제로는 설정 파일의 push를 트리거에 CI로 움직이는 것이 좋다고 생각합니다.
전제
자신의 팀은 기본적으로 다음 워크플로에서 이벤트를 개발하고 있습니다.
① 이벤트에 대한 브랜치 작성
② 이벤트에 필요한 프로그램을 수정한다
③ 플래너가 설정한 파라미터와 디자이너가 작성한 이미지를 커밋
그 후 리뷰 테스트 릴리스가 됩니다.
이번 소개하고 있는 것은, 상기의 ②를 실시하기 위한 툴이 됩니다.
구현 소개
개요
설정 파일 (yml)과 템플릿 파일 (erb)에서 리노베이션 후 소스 코드 생성
리노베이션 후 소스 코드를 다음 세 가지 중 하나로 출력
1. 파일로 출력
2. 소스 파일의 제자리에 있는 소스 코드 바꾸기
3. 소스 파일의 제자리에 추가
파일로 출력
템플릿 파일
구현 예
yml = YAML.load("冒頭で紹介したymlの設定ファイル")
yml[:configs].each do |config|
erbs = YAML.load("前述したテンプレートファイル")
# ymlの設定ファイル内容をhashで読み込み、OpenStructのインスタンスを通して、bindingとしてerbに流し込む
result_code = ERB.new(erbs['migrate']).result(OpenStruct.new(config).instance_eval {binding})
# result_codeをファイルに出力(割愛)
end
출력되는 소스 코드
class EventHoge20161231 < ActiveRecord::Migration
def change
stage_count = 2
monster_ids = [1, 2, 3]
name = 'イベント○○'
stage_count.times do |i|
Stage.create({
:name => "#{name} ステージ#{i}",
})
end
monster_ids.each do |monster_id|
Monster.create({
:id => monster_id,
})
end
end
end
※ seeds.rb에서도 migrate에서도 좋지만 migrate라고 이런 느낌이 듭니다.
소스 파일에서 제자리의 소스 코드 바꾸기
템플릿 파일
소스 파일의 지정
미리, 소스에는 치환 범위를 코멘트로 기재해 둡니다.
# dev.event_hoge.consts start
EVENT_RELEASED_AT = Time.parse("2016/11/30 15:00:00")
# dev.event_hoge.consts end
구현 예
new_code = ERB.new(erbs['program_gsubs'][k]).result(OpenStruct.new(config).instance_eval {binding})
new_code = new_code.gsub(%Q{'}, %Q{"}).gsub(%Q{\/}, %Q{\\/})
from = "# dev\.#{type}\.#{k} start"
to = "# dev\.#{type}\.#{k} end"
script = <<-EOS
find #{Rails.root}/app -type f -name '*.rb' -print0 |
xargs -0 perl -0pi -e 's/#{from}(.*?)#{to}/#{from}\n#{new_code}\n#{to}/s'
EOS
`#{script}`
출력되는 소스 코드
주석의 start ~ end 범위를 템플릿 파일의 구현에 따라 바꿉니다.
# dev.event_hoge.consts start
-EVENT_RELEASED_AT = Time.parse("2016/11/30 15:00:00")
+EVENT_RELEASED_AT = Time.parse("2016/12/31 15:00:00")
# dev.event_hoge.consts end
소스 파일의 제자리에 추가
템플릿 파일
소스 파일의 지정
monster_ids = []
# dev.event_hoge.monster_ids append
구현 예
new_code = ERB.new(erbs['program_appends'][k]).result(OpenStruct.new(config).instance_eval {binding})
new_code = new_code.gsub(%Q{'}, %Q{"}).gsub(%Q{\/}, %Q{\\/})
append = "# dev\.#{type}\.#{k} append"
script = <<-EOS
find #{Rails.root}/app -type f -name '*.rb' -print0 |
xargs -0 perl -0pi -e 's/#{append}/#{new_code}\n#{append}/s'
EOS
`#{script}`
출력되는 소스 코드
코멘트의 append의 전행에, 템플릿 파일의 구현에 따른 프로그램을 추기합니다.
monster_ids = []
+monster_ids << [1, 2, 3]
# dev.event_hoge.monster_ids append
마지막으로
Happy Elements 주식회사 카카리아 스튜디오에서는, 함께 만들기를 하는 동료를 모집하고 있습니다!
물건 만들기를 좋아하는 분은 부디 부담없이 응모하십시오.
카카리아 스튜디오 채용 정보
한 사람 한 사람의 치카라를 최대한으로 끌어낼 수 있는 이런 불가능한 환경과 체제, 문화가 있으면 최고의 제조를 이어갈 것이라고 우리는 믿고 있습니다. 카카리아 스튜디오의 멤버로서 우리와 함께 일하고 싶은 동료를 모집하고 있습니다.
Reference
이 문제에 관하여(운영에서 정기적인 프로그램 리노베이션 자동화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ryooo321/items/d78997cf48c460de21f8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
input (설정 파일 준비)
소스 파일 수정을 위한 변수 정보가 포함된 설정 파일(yml)
process(rake 작업에 흘리면)
output (프로그램을 수정합니다)
수정된 프로그램
※ 실제로는 설정 파일의 push를 트리거에 CI로 움직이는 것이 좋다고 생각합니다.
전제
자신의 팀은 기본적으로 다음 워크플로에서 이벤트를 개발하고 있습니다.
① 이벤트에 대한 브랜치 작성
② 이벤트에 필요한 프로그램을 수정한다
③ 플래너가 설정한 파라미터와 디자이너가 작성한 이미지를 커밋
그 후 리뷰 테스트 릴리스가 됩니다.
이번 소개하고 있는 것은, 상기의 ②를 실시하기 위한 툴이 됩니다.
구현 소개
개요
설정 파일 (yml)과 템플릿 파일 (erb)에서 리노베이션 후 소스 코드 생성
리노베이션 후 소스 코드를 다음 세 가지 중 하나로 출력
1. 파일로 출력
2. 소스 파일의 제자리에 있는 소스 코드 바꾸기
3. 소스 파일의 제자리에 추가
파일로 출력
템플릿 파일
구현 예
yml = YAML.load("冒頭で紹介したymlの設定ファイル")
yml[:configs].each do |config|
erbs = YAML.load("前述したテンプレートファイル")
# ymlの設定ファイル内容をhashで読み込み、OpenStructのインスタンスを通して、bindingとしてerbに流し込む
result_code = ERB.new(erbs['migrate']).result(OpenStruct.new(config).instance_eval {binding})
# result_codeをファイルに出力(割愛)
end
출력되는 소스 코드
class EventHoge20161231 < ActiveRecord::Migration
def change
stage_count = 2
monster_ids = [1, 2, 3]
name = 'イベント○○'
stage_count.times do |i|
Stage.create({
:name => "#{name} ステージ#{i}",
})
end
monster_ids.each do |monster_id|
Monster.create({
:id => monster_id,
})
end
end
end
※ seeds.rb에서도 migrate에서도 좋지만 migrate라고 이런 느낌이 듭니다.
소스 파일에서 제자리의 소스 코드 바꾸기
템플릿 파일
소스 파일의 지정
미리, 소스에는 치환 범위를 코멘트로 기재해 둡니다.
# dev.event_hoge.consts start
EVENT_RELEASED_AT = Time.parse("2016/11/30 15:00:00")
# dev.event_hoge.consts end
구현 예
new_code = ERB.new(erbs['program_gsubs'][k]).result(OpenStruct.new(config).instance_eval {binding})
new_code = new_code.gsub(%Q{'}, %Q{"}).gsub(%Q{\/}, %Q{\\/})
from = "# dev\.#{type}\.#{k} start"
to = "# dev\.#{type}\.#{k} end"
script = <<-EOS
find #{Rails.root}/app -type f -name '*.rb' -print0 |
xargs -0 perl -0pi -e 's/#{from}(.*?)#{to}/#{from}\n#{new_code}\n#{to}/s'
EOS
`#{script}`
출력되는 소스 코드
주석의 start ~ end 범위를 템플릿 파일의 구현에 따라 바꿉니다.
# dev.event_hoge.consts start
-EVENT_RELEASED_AT = Time.parse("2016/11/30 15:00:00")
+EVENT_RELEASED_AT = Time.parse("2016/12/31 15:00:00")
# dev.event_hoge.consts end
소스 파일의 제자리에 추가
템플릿 파일
소스 파일의 지정
monster_ids = []
# dev.event_hoge.monster_ids append
구현 예
new_code = ERB.new(erbs['program_appends'][k]).result(OpenStruct.new(config).instance_eval {binding})
new_code = new_code.gsub(%Q{'}, %Q{"}).gsub(%Q{\/}, %Q{\\/})
append = "# dev\.#{type}\.#{k} append"
script = <<-EOS
find #{Rails.root}/app -type f -name '*.rb' -print0 |
xargs -0 perl -0pi -e 's/#{append}/#{new_code}\n#{append}/s'
EOS
`#{script}`
출력되는 소스 코드
코멘트의 append의 전행에, 템플릿 파일의 구현에 따른 프로그램을 추기합니다.
monster_ids = []
+monster_ids << [1, 2, 3]
# dev.event_hoge.monster_ids append
마지막으로
Happy Elements 주식회사 카카리아 스튜디오에서는, 함께 만들기를 하는 동료를 모집하고 있습니다!
물건 만들기를 좋아하는 분은 부디 부담없이 응모하십시오.
카카리아 스튜디오 채용 정보
한 사람 한 사람의 치카라를 최대한으로 끌어낼 수 있는 이런 불가능한 환경과 체제, 문화가 있으면 최고의 제조를 이어갈 것이라고 우리는 믿고 있습니다. 카카리아 스튜디오의 멤버로서 우리와 함께 일하고 싶은 동료를 모집하고 있습니다.
Reference
이 문제에 관하여(운영에서 정기적인 프로그램 리노베이션 자동화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ryooo321/items/d78997cf48c460de21f8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
개요
설정 파일 (yml)과 템플릿 파일 (erb)에서 리노베이션 후 소스 코드 생성
리노베이션 후 소스 코드를 다음 세 가지 중 하나로 출력
1. 파일로 출력
2. 소스 파일의 제자리에 있는 소스 코드 바꾸기
3. 소스 파일의 제자리에 추가
파일로 출력
템플릿 파일
구현 예
yml = YAML.load("冒頭で紹介したymlの設定ファイル")
yml[:configs].each do |config|
erbs = YAML.load("前述したテンプレートファイル")
# ymlの設定ファイル内容をhashで読み込み、OpenStructのインスタンスを通して、bindingとしてerbに流し込む
result_code = ERB.new(erbs['migrate']).result(OpenStruct.new(config).instance_eval {binding})
# result_codeをファイルに出力(割愛)
end
출력되는 소스 코드
class EventHoge20161231 < ActiveRecord::Migration
def change
stage_count = 2
monster_ids = [1, 2, 3]
name = 'イベント○○'
stage_count.times do |i|
Stage.create({
:name => "#{name} ステージ#{i}",
})
end
monster_ids.each do |monster_id|
Monster.create({
:id => monster_id,
})
end
end
end
※ seeds.rb에서도 migrate에서도 좋지만 migrate라고 이런 느낌이 듭니다.
소스 파일에서 제자리의 소스 코드 바꾸기
템플릿 파일
소스 파일의 지정
미리, 소스에는 치환 범위를 코멘트로 기재해 둡니다.
# dev.event_hoge.consts start
EVENT_RELEASED_AT = Time.parse("2016/11/30 15:00:00")
# dev.event_hoge.consts end
구현 예
new_code = ERB.new(erbs['program_gsubs'][k]).result(OpenStruct.new(config).instance_eval {binding})
new_code = new_code.gsub(%Q{'}, %Q{"}).gsub(%Q{\/}, %Q{\\/})
from = "# dev\.#{type}\.#{k} start"
to = "# dev\.#{type}\.#{k} end"
script = <<-EOS
find #{Rails.root}/app -type f -name '*.rb' -print0 |
xargs -0 perl -0pi -e 's/#{from}(.*?)#{to}/#{from}\n#{new_code}\n#{to}/s'
EOS
`#{script}`
출력되는 소스 코드
주석의 start ~ end 범위를 템플릿 파일의 구현에 따라 바꿉니다.
# dev.event_hoge.consts start
-EVENT_RELEASED_AT = Time.parse("2016/11/30 15:00:00")
+EVENT_RELEASED_AT = Time.parse("2016/12/31 15:00:00")
# dev.event_hoge.consts end
소스 파일의 제자리에 추가
템플릿 파일
소스 파일의 지정
monster_ids = []
# dev.event_hoge.monster_ids append
구현 예
new_code = ERB.new(erbs['program_appends'][k]).result(OpenStruct.new(config).instance_eval {binding})
new_code = new_code.gsub(%Q{'}, %Q{"}).gsub(%Q{\/}, %Q{\\/})
append = "# dev\.#{type}\.#{k} append"
script = <<-EOS
find #{Rails.root}/app -type f -name '*.rb' -print0 |
xargs -0 perl -0pi -e 's/#{append}/#{new_code}\n#{append}/s'
EOS
`#{script}`
출력되는 소스 코드
코멘트의 append의 전행에, 템플릿 파일의 구현에 따른 프로그램을 추기합니다.
monster_ids = []
+monster_ids << [1, 2, 3]
# dev.event_hoge.monster_ids append
마지막으로
Happy Elements 주식회사 카카리아 스튜디오에서는, 함께 만들기를 하는 동료를 모집하고 있습니다!
물건 만들기를 좋아하는 분은 부디 부담없이 응모하십시오.
카카리아 스튜디오 채용 정보
한 사람 한 사람의 치카라를 최대한으로 끌어낼 수 있는 이런 불가능한 환경과 체제, 문화가 있으면 최고의 제조를 이어갈 것이라고 우리는 믿고 있습니다. 카카리아 스튜디오의 멤버로서 우리와 함께 일하고 싶은 동료를 모집하고 있습니다.
Reference
이 문제에 관하여(운영에서 정기적인 프로그램 리노베이션 자동화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ryooo321/items/d78997cf48c460de21f8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
yml = YAML.load("冒頭で紹介したymlの設定ファイル")
yml[:configs].each do |config|
erbs = YAML.load("前述したテンプレートファイル")
# ymlの設定ファイル内容をhashで読み込み、OpenStructのインスタンスを通して、bindingとしてerbに流し込む
result_code = ERB.new(erbs['migrate']).result(OpenStruct.new(config).instance_eval {binding})
# result_codeをファイルに出力(割愛)
end
class EventHoge20161231 < ActiveRecord::Migration
def change
stage_count = 2
monster_ids = [1, 2, 3]
name = 'イベント○○'
stage_count.times do |i|
Stage.create({
:name => "#{name} ステージ#{i}",
})
end
monster_ids.each do |monster_id|
Monster.create({
:id => monster_id,
})
end
end
end
템플릿 파일
소스 파일의 지정
미리, 소스에는 치환 범위를 코멘트로 기재해 둡니다.
# dev.event_hoge.consts start
EVENT_RELEASED_AT = Time.parse("2016/11/30 15:00:00")
# dev.event_hoge.consts end
구현 예
new_code = ERB.new(erbs['program_gsubs'][k]).result(OpenStruct.new(config).instance_eval {binding})
new_code = new_code.gsub(%Q{'}, %Q{"}).gsub(%Q{\/}, %Q{\\/})
from = "# dev\.#{type}\.#{k} start"
to = "# dev\.#{type}\.#{k} end"
script = <<-EOS
find #{Rails.root}/app -type f -name '*.rb' -print0 |
xargs -0 perl -0pi -e 's/#{from}(.*?)#{to}/#{from}\n#{new_code}\n#{to}/s'
EOS
`#{script}`
출력되는 소스 코드
주석의 start ~ end 범위를 템플릿 파일의 구현에 따라 바꿉니다.
# dev.event_hoge.consts start
-EVENT_RELEASED_AT = Time.parse("2016/11/30 15:00:00")
+EVENT_RELEASED_AT = Time.parse("2016/12/31 15:00:00")
# dev.event_hoge.consts end
소스 파일의 제자리에 추가
템플릿 파일
소스 파일의 지정
monster_ids = []
# dev.event_hoge.monster_ids append
구현 예
new_code = ERB.new(erbs['program_appends'][k]).result(OpenStruct.new(config).instance_eval {binding})
new_code = new_code.gsub(%Q{'}, %Q{"}).gsub(%Q{\/}, %Q{\\/})
append = "# dev\.#{type}\.#{k} append"
script = <<-EOS
find #{Rails.root}/app -type f -name '*.rb' -print0 |
xargs -0 perl -0pi -e 's/#{append}/#{new_code}\n#{append}/s'
EOS
`#{script}`
출력되는 소스 코드
코멘트의 append의 전행에, 템플릿 파일의 구현에 따른 프로그램을 추기합니다.
monster_ids = []
+monster_ids << [1, 2, 3]
# dev.event_hoge.monster_ids append
마지막으로
Happy Elements 주식회사 카카리아 스튜디오에서는, 함께 만들기를 하는 동료를 모집하고 있습니다!
물건 만들기를 좋아하는 분은 부디 부담없이 응모하십시오.
카카리아 스튜디오 채용 정보
한 사람 한 사람의 치카라를 최대한으로 끌어낼 수 있는 이런 불가능한 환경과 체제, 문화가 있으면 최고의 제조를 이어갈 것이라고 우리는 믿고 있습니다. 카카리아 스튜디오의 멤버로서 우리와 함께 일하고 싶은 동료를 모집하고 있습니다.
Reference
이 문제에 관하여(운영에서 정기적인 프로그램 리노베이션 자동화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ryooo321/items/d78997cf48c460de21f8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
monster_ids = []
# dev.event_hoge.monster_ids append
new_code = ERB.new(erbs['program_appends'][k]).result(OpenStruct.new(config).instance_eval {binding})
new_code = new_code.gsub(%Q{'}, %Q{"}).gsub(%Q{\/}, %Q{\\/})
append = "# dev\.#{type}\.#{k} append"
script = <<-EOS
find #{Rails.root}/app -type f -name '*.rb' -print0 |
xargs -0 perl -0pi -e 's/#{append}/#{new_code}\n#{append}/s'
EOS
`#{script}`
monster_ids = []
+monster_ids << [1, 2, 3]
# dev.event_hoge.monster_ids append
Happy Elements 주식회사 카카리아 스튜디오에서는, 함께 만들기를 하는 동료를 모집하고 있습니다!
물건 만들기를 좋아하는 분은 부디 부담없이 응모하십시오.
카카리아 스튜디오 채용 정보
한 사람 한 사람의 치카라를 최대한으로 끌어낼 수 있는 이런 불가능한 환경과 체제, 문화가 있으면 최고의 제조를 이어갈 것이라고 우리는 믿고 있습니다. 카카리아 스튜디오의 멤버로서 우리와 함께 일하고 싶은 동료를 모집하고 있습니다.
Reference
이 문제에 관하여(운영에서 정기적인 프로그램 리노베이션 자동화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ryooo321/items/d78997cf48c460de21f8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)