From f0766fdefaeadcc526d6a87e29b65f5bf7b26318 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Mon, 6 Feb 2017 20:15:25 +0100 Subject: [PATCH 1/5] extract pipeline mails layout --- .../images/mailers/gitlab_footer_logo.gif | Bin 0 -> 3654 bytes .../images/mailers/gitlab_header_logo.gif | Bin 0 -> 3040 bytes app/mailers/emails/pipelines.rb | 4 +- app/views/layouts/mailer.html.haml | 72 +++++ app/views/layouts/mailer.text.haml | 5 + .../notify/pipeline_failed_email.html.haml | 280 +++++++----------- .../notify/pipeline_failed_email.text.erb | 4 - .../notify/pipeline_success_email.html.haml | 230 +++++--------- .../notify/pipeline_success_email.text.erb | 4 - 9 files changed, 264 insertions(+), 335 deletions(-) create mode 100644 app/assets/images/mailers/gitlab_footer_logo.gif create mode 100644 app/assets/images/mailers/gitlab_header_logo.gif create mode 100644 app/views/layouts/mailer.html.haml create mode 100644 app/views/layouts/mailer.text.haml diff --git a/app/assets/images/mailers/gitlab_footer_logo.gif b/app/assets/images/mailers/gitlab_footer_logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f4ef31947bc4a53d6b2d243d6e9f2c975c84b77 GIT binary patch literal 3654 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 z

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 +%html{ lang: "en" } + %head + %meta{ content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type" }/ + %meta{ content: "width=device-width, initial-scale=1", name: "viewport" }/ + %meta{ content: "IE=edge", "http-equiv" => "X-UA-Compatible" }/ + %title= message.subject + :css + /* CLIENT-SPECIFIC STYLES */ + body, table, td, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } + table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; } + img { -ms-interpolation-mode: bicubic; } + + /* iOS BLUE LINKS */ + a[x-apple-data-detectors] { + color: inherit !important; + text-decoration: none !important; + font-size: inherit !important; + font-family: inherit !important; + font-weight: inherit !important; + line-height: inherit !important; + } + + /* ANDROID MARGIN HACK */ + body { margin:0 !important; } + div[style*="margin: 16px 0"] { margin:0 !important; } + + @media only screen and (max-width: 639px) { + body, #body { + min-width: 320px !important; + } + table.wrapper { + width: 100% !important; + min-width: 320px !important; + } + table.wrapper > tbody > tr > td { + border-left: 0 !important; + border-right: 0 !important; + border-radius: 0 !important; + padding-left: 10px !important; + padding-right: 10px !important; + } + } + %body{ style: "background-color:#fafafa;margin:0;padding:0;text-align:center;min-width:640px;width:100%;height:100%;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" } + %table#body{ border: "0", cellpadding: "0", cellspacing: "0", style: "background-color:#fafafa;margin:0;padding:0;text-align:center;min-width:640px;width:100%;" } + %tbody + %tr.line + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#6b4fbb;height:4px;font-size:4px;line-height:4px;" }   + %tr.header + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" } + %img{ alt: "GitLab", height: "50", src: image_url('mailers/gitlab_header_logo.gif'), width: "55" }/ + %tr + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" } + %table.wrapper{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:640px;margin:0 auto;border-collapse:separate;border-spacing:0;" } + %tbody + %tr + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#ffffff;text-align:left;padding:18px 25px;border:1px solid #ededed;border-radius:3px;overflow:hidden;" } + %table.content{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;border-collapse:separate;border-spacing:0;" } + %tbody + = yield + + %tr.footer + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" } + %img{ alt: "GitLab", height: "33", src: image_url('mailers/gitlab_footer_logo.gif'), style: "display:block;margin:0 auto 1em;", width: "90" }/ + %div + %a{ href: profile_notifications_url, style: "color:#3777b0;text-decoration:none;" } Manage all notifications + · + %a{ href: help_url, style: "color:#3777b0;text-decoration:none;" } Help + %div + You're receiving this email because of your account on + = succeed "." do + %a{ href: root_url, style: "color:#3777b0;text-decoration:none;" }= Gitlab.config.gitlab.host diff --git a/app/views/layouts/mailer.text.haml b/app/views/layouts/mailer.text.haml new file mode 100644 index 00000000000..6a9c6ced9cc --- /dev/null +++ b/app/views/layouts/mailer.text.haml @@ -0,0 +1,5 @@ += yield + +You're receiving this email because of your account on #{Gitlab.config.gitlab.host}. +Manage all notifications: #{profile_notifications_url} +Help: #{help_url} diff --git a/app/views/notify/pipeline_failed_email.html.haml b/app/views/notify/pipeline_failed_email.html.haml index d9ebbaa2704..85a1aea3a61 100644 --- a/app/views/notify/pipeline_failed_email.html.haml +++ b/app/views/notify/pipeline_failed_email.html.haml @@ -1,179 +1,109 @@ - -%html{ lang: "en" } - %head - %meta{ content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type" }/ - %meta{ content: "width=device-width, initial-scale=1", name: "viewport" }/ - %meta{ content: "IE=edge", "http-equiv" => "X-UA-Compatible" }/ - %title= message.subject - :css - /* CLIENT-SPECIFIC STYLES */ - body, table, td, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } - table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; } - img { -ms-interpolation-mode: bicubic; } - - /* iOS BLUE LINKS */ - a[x-apple-data-detectors] { - color: inherit !important; - text-decoration: none !important; - font-size: inherit !important; - font-family: inherit !important; - font-weight: inherit !important; - line-height: inherit !important; - } - - /* ANDROID MARGIN HACK */ - body { margin:0 !important; } - div[style*="margin: 16px 0"] { margin:0 !important; } - - @media only screen and (max-width: 639px) { - body, #body { - min-width: 320px !important; - } - table.wrapper { - width: 100% !important; - min-width: 320px !important; - } - table.wrapper > tbody > tr > td { - border-left: 0 !important; - border-right: 0 !important; - border-radius: 0 !important; - padding-left: 10px !important; - padding-right: 10px !important; - } - } - %body{ style: "background-color:#fafafa;margin:0;padding:0;text-align:center;min-width:640px;width:100%;height:100%;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" } - %table#body{ border: "0", cellpadding: "0", cellspacing: "0", style: "background-color:#fafafa;margin:0;padding:0;text-align:center;min-width:640px;width:100%;" } +%tr.alert + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:10px;border-radius:3px;font-size:14px;line-height:1.3;text-align:center;overflow:hidden;background-color:#d22f57;color:#ffffff;" } + %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;margin:0 auto;" } %tbody - %tr.line - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#6b4fbb;height:4px;font-size:4px;line-height:4px;" }   - %tr.header - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" } - %img{ alt: "GitLab", height: "50", src: image_url('mailers/ci_pipeline_notif_v1/gitlab-logo.gif'), width: "55" }/ %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" } - %table.wrapper{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:640px;margin:0 auto;border-collapse:separate;border-spacing:0;" } + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#ffffff;text-align:center;padding-right:5px;" } + %img{ alt: "x", height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-x-red-inverted.gif'), style: "display:block;", width: "13" }/ + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#ffffff;text-align:center;" } + Your pipeline has failed. +%tr.spacer + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;height:18px;font-size:18px;line-height:18px;" } +   +%tr.section + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:0 15px;border:1px solid #ededed;border-radius:3px;overflow:hidden;" } + %table.info{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;" } + %tbody + %tr + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;" } Project + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;" } + - namespace_name = @project.group ? @project.group.name : @project.namespace.owner.name + - namespace_url = @project.group ? group_url(@project.group) : user_url(@project.namespace.owner) + %a.muted{ href: namespace_url, style: "color:#333333;text-decoration:none;" } + = namespace_name + \/ + %a.muted{ href: project_url(@project), style: "color:#333333;text-decoration:none;" } + = @project.name + %tr + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Branch + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" } + %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" } %tbody %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#ffffff;text-align:left;padding:18px 25px;border:1px solid #ededed;border-radius:3px;overflow:hidden;" } - %table.content{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;border-collapse:separate;border-spacing:0;" } - %tbody - %tr.alert - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:10px;border-radius:3px;font-size:14px;line-height:1.3;text-align:center;overflow:hidden;background-color:#d22f57;color:#ffffff;" } - %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;margin:0 auto;" } - %tbody - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#ffffff;text-align:center;padding-right:5px;" } - %img{ alt: "x", height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-x-red-inverted.gif'), style: "display:block;", width: "13" }/ - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#ffffff;text-align:center;" } - Your pipeline has failed. - %tr.spacer - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;height:18px;font-size:18px;line-height:18px;" } -   - %tr.section - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:0 15px;border:1px solid #ededed;border-radius:3px;overflow:hidden;" } - %table.info{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;" } - %tbody - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;" } Project - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;" } - - namespace_name = @project.group ? @project.group.name : @project.namespace.owner.name - - namespace_url = @project.group ? group_url(@project.group) : user_url(@project.namespace.owner) - %a.muted{ href: namespace_url, style: "color:#333333;text-decoration:none;" } - = namespace_name - \/ - %a.muted{ href: project_url(@project), style: "color:#333333;text-decoration:none;" } - = @project.name - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Branch - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" } - %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" } - %tbody - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" } - %img{ height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-branch-gray.gif'), style: "display:block;", width: "13", alt: "Branch icon" }/ - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" } - %a.muted{ href: commits_url(@pipeline), style: "color:#333333;text-decoration:none;" } - = @pipeline.ref - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Commit - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" } - %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" } - %tbody - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" } - %img{ height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-commit-gray.gif'), style: "display:block;", width: "13", alt: "Commit icon" }/ - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" } - %a{ href: commit_url(@pipeline), style: "color:#3777b0;text-decoration:none;" } - = @pipeline.short_sha - - if @merge_request - in - %a{ href: merge_request_url(@merge_request), style: "color:#3777b0;text-decoration:none;" } - = @merge_request.to_reference - .commit{ style: "color:#5c5c5c;font-weight:300;" } - = @pipeline.git_commit_message.truncate(50) - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Author - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" } - %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" } - %tbody - %tr - - commit = @pipeline.commit - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" } - %img.avatar{ height: "24", src: avatar_icon(commit.author || commit.author_email, 24), style: "display:block;border-radius:12px;margin:-2px 0;", width: "24", alt: "Avatar" }/ - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" } - - if commit.author - %a.muted{ href: user_url(commit.author), style: "color:#333333;text-decoration:none;" } - = commit.author.name - - else - %span - = commit.author_name - %tr.spacer - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;height:18px;font-size:18px;line-height:18px;" } -   - - failed = @pipeline.statuses.latest.failed - %tr.pre-section - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;color:#333333;font-size:15px;font-weight:400;line-height:1.4;padding:15px 0;" } - Pipeline - %a{ href: pipeline_url(@pipeline), style: "color:#3777b0;text-decoration:none;" } - = "\##{@pipeline.id}" - had - = failed.size - failed - #{'build'.pluralize(failed.size)}. - %tr.warning - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;border:1px solid #ededed;border-bottom:0;border-radius:3px 3px 0 0;overflow:hidden;background-color:#fdf4f6;color:#d22852;font-size:14px;line-height:1.4;text-align:center;padding:8px 15px;" } - Logs may contain sensitive data. Please consider before forwarding this email. - %tr.section - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:0 15px;border:1px solid #ededed;border-radius:3px;overflow:hidden;border-top:0;border-radius:0 0 3px 3px;" } - %table.builds{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;border-collapse:collapse;" } - %tbody - - failed.each do |build| - %tr.build-state - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:20px 0;color:#8c8c8c;font-weight:500;font-size:15px;" } - %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" } - %tbody - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;color:#8c8c8c;font-weight:500;font-size:15px;vertical-align:middle;padding-right:5px;" } - %img{ alt: "x", height: "10", src: image_url('mailers/ci_pipeline_notif_v1/icon-x-red.gif'), style: "display:block;", width: "10" }/ - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;color:#8c8c8c;font-weight:500;font-size:15px;vertical-align:middle;" } - = build.stage - %td{ align: "right", style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:20px 0;color:#8c8c8c;font-weight:500;font-size:15px;" } - = render "notify/links/#{build.to_partial_path}", pipeline: @pipeline, build: build - %tr.build-log - - if build.has_trace? - %td{ colspan: "2", style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:0 0 15px;" } - %pre{ style: "font-family:Monaco,'Lucida Console','Courier New',Courier,monospace;background-color:#fafafa;border-radius:3px;overflow:hidden;white-space:pre-wrap;word-break:break-all;font-size:13px;line-height:1.4;padding:12px;color:#333333;margin:0;" } - = build.trace_html(last_lines: 10).html_safe - - else - %td{ colspan: "2" } - %tr.footer - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" } - %img{ alt: "GitLab", height: "33", src: image_url('mailers/ci_pipeline_notif_v1/gitlab-logo-full-horizontal.gif'), style: "display:block;margin:0 auto 1em;", width: "90" }/ - %div - %a{ href: profile_notifications_url, style: "color:#3777b0;text-decoration:none;" } Manage all notifications - · - %a{ href: help_url, style: "color:#3777b0;text-decoration:none;" } Help - %div - You're receiving this email because of your account on - = succeed "." do - %a{ href: root_url, style: "color:#3777b0;text-decoration:none;" }= Gitlab.config.gitlab.host + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" } + %img{ height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-branch-gray.gif'), style: "display:block;", width: "13", alt: "Branch icon" }/ + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" } + %a.muted{ href: commits_url(@pipeline), style: "color:#333333;text-decoration:none;" } + = @pipeline.ref + %tr + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Commit + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" } + %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" } + %tbody + %tr + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" } + %img{ height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-commit-gray.gif'), style: "display:block;", width: "13", alt: "Commit icon" }/ + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" } + %a{ href: commit_url(@pipeline), style: "color:#3777b0;text-decoration:none;" } + = @pipeline.short_sha + - if @merge_request + in + %a{ href: merge_request_url(@merge_request), style: "color:#3777b0;text-decoration:none;" } + = @merge_request.to_reference + .commit{ style: "color:#5c5c5c;font-weight:300;" } + = @pipeline.git_commit_message.truncate(50) + %tr + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Author + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" } + %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" } + %tbody + %tr + - commit = @pipeline.commit + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" } + %img.avatar{ height: "24", src: avatar_icon(commit.author || commit.author_email, 24), style: "display:block;border-radius:12px;margin:-2px 0;", width: "24", alt: "Avatar" }/ + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" } + - if commit.author + %a.muted{ href: user_url(commit.author), style: "color:#333333;text-decoration:none;" } + = commit.author.name + - else + %span + = commit.author_name +%tr.spacer + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;height:18px;font-size:18px;line-height:18px;" } +   +- failed = @pipeline.statuses.latest.failed +%tr.pre-section + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;color:#333333;font-size:15px;font-weight:400;line-height:1.4;padding:15px 0;" } + Pipeline + %a{ href: pipeline_url(@pipeline), style: "color:#3777b0;text-decoration:none;" } + = "\##{@pipeline.id}" + had + = failed.size + failed + #{'build'.pluralize(failed.size)}. +%tr.warning + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;border:1px solid #ededed;border-bottom:0;border-radius:3px 3px 0 0;overflow:hidden;background-color:#fdf4f6;color:#d22852;font-size:14px;line-height:1.4;text-align:center;padding:8px 15px;" } + Logs may contain sensitive data. Please consider before forwarding this email. +%tr.section + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:0 15px;border:1px solid #ededed;border-radius:3px;overflow:hidden;border-top:0;border-radius:0 0 3px 3px;" } + %table.builds{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;border-collapse:collapse;" } + %tbody + - failed.each do |build| + %tr.build-state + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:20px 0;color:#8c8c8c;font-weight:500;font-size:15px;" } + %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" } + %tbody + %tr + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;color:#8c8c8c;font-weight:500;font-size:15px;vertical-align:middle;padding-right:5px;" } + %img{ alt: "x", height: "10", src: image_url('mailers/ci_pipeline_notif_v1/icon-x-red.gif'), style: "display:block;", width: "10" }/ + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;color:#8c8c8c;font-weight:500;font-size:15px;vertical-align:middle;" } + = build.stage + %td{ align: "right", style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:20px 0;color:#8c8c8c;font-weight:500;font-size:15px;" } + = render "notify/links/#{build.to_partial_path}", pipeline: @pipeline, build: build + %tr.build-log + - if build.has_trace? + %td{ colspan: "2", style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:0 0 15px;" } + %pre{ style: "font-family:Monaco,'Lucida Console','Courier New',Courier,monospace;background-color:#fafafa;border-radius:3px;overflow:hidden;white-space:pre-wrap;word-break:break-all;font-size:13px;line-height:1.4;padding:12px;color:#333333;margin:0;" } + = build.trace_html(last_lines: 10).html_safe + - else + %td{ colspan: "2" } diff --git a/app/views/notify/pipeline_failed_email.text.erb b/app/views/notify/pipeline_failed_email.text.erb index ab91c7ef350..520a2fc7d68 100644 --- a/app/views/notify/pipeline_failed_email.text.erb +++ b/app/views/notify/pipeline_failed_email.text.erb @@ -27,7 +27,3 @@ Trace: <%= build.trace_with_state(last_lines: 10)[:text] %> <% end -%> <% end -%> - -You're receiving this email because of your account on <%= Gitlab.config.gitlab.host %>. -Manage all notifications: <%= profile_notifications_url %> -Help: <%= help_url %> diff --git a/app/views/notify/pipeline_success_email.html.haml b/app/views/notify/pipeline_success_email.html.haml index 8add2e18206..19d4add06f5 100644 --- a/app/views/notify/pipeline_success_email.html.haml +++ b/app/views/notify/pipeline_success_email.html.haml @@ -1,154 +1,84 @@ - -%html{ lang: "en" } - %head - %meta{ content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type" }/ - %meta{ content: "width=device-width, initial-scale=1", name: "viewport" }/ - %meta{ content: "IE=edge", "http-equiv" => "X-UA-Compatible" }/ - %title= message.subject - :css - /* CLIENT-SPECIFIC STYLES */ - body, table, td, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } - table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; } - img { -ms-interpolation-mode: bicubic; } - - /* iOS BLUE LINKS */ - a[x-apple-data-detectors] { - color: inherit !important; - text-decoration: none !important; - font-size: inherit !important; - font-family: inherit !important; - font-weight: inherit !important; - line-height: inherit !important; - } - - /* ANDROID MARGIN HACK */ - body { margin:0 !important; } - div[style*="margin: 16px 0"] { margin:0 !important; } - - @media only screen and (max-width: 639px) { - body, #body { - min-width: 320px !important; - } - table.wrapper { - width: 100% !important; - min-width: 320px !important; - } - table.wrapper > tbody > tr > td { - border-left: 0 !important; - border-right: 0 !important; - border-radius: 0 !important; - padding-left: 10px !important; - padding-right: 10px !important; - } - } - %body{ style: "background-color:#fafafa;margin:0;padding:0;text-align:center;min-width:640px;width:100%;height:100%;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" } - %table#body{ border: "0", cellpadding: "0", cellspacing: "0", style: "background-color:#fafafa;margin:0;padding:0;text-align:center;min-width:640px;width:100%;" } +%tr.success + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:10px;border-radius:3px;font-size:14px;line-height:1.3;text-align:center;overflow:hidden;color:#ffffff;background-color:#31af64;" } + %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;margin:0 auto;" } %tbody - %tr.line - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#6b4fbb;height:4px;font-size:4px;line-height:4px;" }   - %tr.header - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" } - %img{ alt: "GitLab", height: "50", src: image_url('mailers/ci_pipeline_notif_v1/gitlab-logo.gif'), width: "55" }/ %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" } - %table.wrapper{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:640px;margin:0 auto;border-collapse:separate;border-spacing:0;" } + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#ffffff;text-align:center;padding-right:5px;" } + %img{ alt: "✓", height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-check-green-inverted.gif'), style: "display:block;", width: "13" }/ + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#ffffff;text-align:center;" } + Your pipeline has passed. +%tr.spacer + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;height:18px;font-size:18px;line-height:18px;" } +   +%tr.section + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:0 15px;border:1px solid #ededed;border-radius:3px;overflow:hidden;" } + %table.info{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;" } + %tbody + %tr + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;" } Project + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;" } + - namespace_name = @project.group ? @project.group.name : @project.namespace.owner.name + - namespace_url = @project.group ? group_url(@project.group) : user_url(@project.namespace.owner) + %a.muted{ href: namespace_url, style: "color:#333333;text-decoration:none;" } + = namespace_name + \/ + %a.muted{ href: project_url(@project), style: "color:#333333;text-decoration:none;" } + = @project.name + %tr + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Branch + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" } + %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" } %tbody %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#ffffff;text-align:left;padding:18px 25px;border:1px solid #ededed;border-radius:3px;overflow:hidden;" } - %table.content{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;border-collapse:separate;border-spacing:0;" } - %tbody - %tr.success - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:10px;border-radius:3px;font-size:14px;line-height:1.3;text-align:center;overflow:hidden;color:#ffffff;background-color:#31af64;" } - %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;margin:0 auto;" } - %tbody - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#ffffff;text-align:center;padding-right:5px;" } - %img{ alt: "✓", height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-check-green-inverted.gif'), style: "display:block;", width: "13" }/ - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#ffffff;text-align:center;" } - Your pipeline has passed. - %tr.spacer - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;height:18px;font-size:18px;line-height:18px;" } -   - %tr.section - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:0 15px;border:1px solid #ededed;border-radius:3px;overflow:hidden;" } - %table.info{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;" } - %tbody - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;" } Project - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;" } - - namespace_name = @project.group ? @project.group.name : @project.namespace.owner.name - - namespace_url = @project.group ? group_url(@project.group) : user_url(@project.namespace.owner) - %a.muted{ href: namespace_url, style: "color:#333333;text-decoration:none;" } - = namespace_name - \/ - %a.muted{ href: project_url(@project), style: "color:#333333;text-decoration:none;" } - = @project.name - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Branch - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" } - %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" } - %tbody - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" } - %img{ height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-branch-gray.gif'), style: "display:block;", width: "13", alt: "Branch icon" }/ - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" } - %a.muted{ href: commits_url(@pipeline), style: "color:#333333;text-decoration:none;" } - = @pipeline.ref - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Commit - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" } - %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" } - %tbody - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" } - %img{ height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-commit-gray.gif'), style: "display:block;", width: "13", alt: "Commit icon" }/ - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" } - %a{ href: commit_url(@pipeline), style: "color:#3777b0;text-decoration:none;" } - = @pipeline.short_sha - - if @merge_request - in - %a{ href: merge_request_url(@merge_request), style: "color:#3777b0;text-decoration:none;" } - = @merge_request.to_reference - .commit{ style: "color:#5c5c5c;font-weight:300;" } - = @pipeline.git_commit_message.truncate(50) - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Author - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" } - %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" } - %tbody - %tr - - commit = @pipeline.commit - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" } - %img.avatar{ height: "24", src: avatar_icon(commit.author || commit.author_email, 24), style: "display:block;border-radius:12px;margin:-2px 0;", width: "24", alt: "Avatar" }/ - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" } - - if commit.author - %a.muted{ href: user_url(commit.author), style: "color:#333333;text-decoration:none;" } - = commit.author.name - - else - %span - = commit.author_name - %tr.spacer - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;height:18px;font-size:18px;line-height:18px;" } -   - %tr.success-message - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;color:#333333;font-size:15px;font-weight:400;line-height:1.4;padding:15px 5px;text-align:center;" } - - build_count = @pipeline.statuses.latest.size - - stage_count = @pipeline.stages_count - Pipeline - %a{ href: pipeline_url(@pipeline), style: "color:#3777b0;text-decoration:none;" } - = "\##{@pipeline.id}" - successfully completed - #{build_count} #{'build'.pluralize(build_count)} - in - #{stage_count} #{'stage'.pluralize(stage_count)}. - %tr.footer - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" } - %img{ alt: "GitLab", height: "33", src: image_url('mailers/ci_pipeline_notif_v1/gitlab-logo-full-horizontal.gif'), style: "display:block;margin:0 auto 1em;", width: "90" }/ - %div - %a{ href: profile_notifications_url, style: "color:#3777b0;text-decoration:none;" } Manage all notifications - · - %a{ href: help_url, style: "color:#3777b0;text-decoration:none;" } Help - %div - You're receiving this email because of your account on - = succeed "." do - %a{ href: root_url, style: "color:#3777b0;text-decoration:none;" }= Gitlab.config.gitlab.host + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" } + %img{ height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-branch-gray.gif'), style: "display:block;", width: "13", alt: "Branch icon" }/ + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" } + %a.muted{ href: commits_url(@pipeline), style: "color:#333333;text-decoration:none;" } + = @pipeline.ref + %tr + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Commit + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" } + %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" } + %tbody + %tr + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" } + %img{ height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-commit-gray.gif'), style: "display:block;", width: "13", alt: "Commit icon" }/ + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" } + %a{ href: commit_url(@pipeline), style: "color:#3777b0;text-decoration:none;" } + = @pipeline.short_sha + - if @merge_request + in + %a{ href: merge_request_url(@merge_request), style: "color:#3777b0;text-decoration:none;" } + = @merge_request.to_reference + .commit{ style: "color:#5c5c5c;font-weight:300;" } + = @pipeline.git_commit_message.truncate(50) + %tr + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Author + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" } + %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" } + %tbody + %tr + - commit = @pipeline.commit + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" } + %img.avatar{ height: "24", src: avatar_icon(commit.author || commit.author_email, 24), style: "display:block;border-radius:12px;margin:-2px 0;", width: "24", alt: "Avatar" }/ + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" } + - if commit.author + %a.muted{ href: user_url(commit.author), style: "color:#333333;text-decoration:none;" } + = commit.author.name + - else + %span + = commit.author_name +%tr.spacer + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;height:18px;font-size:18px;line-height:18px;" } +   +%tr.success-message + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;color:#333333;font-size:15px;font-weight:400;line-height:1.4;padding:15px 5px;text-align:center;" } + - build_count = @pipeline.statuses.latest.size + - stage_count = @pipeline.stages_count + Pipeline + %a{ href: pipeline_url(@pipeline), style: "color:#3777b0;text-decoration:none;" } + = "\##{@pipeline.id}" + successfully completed + #{build_count} #{'build'.pluralize(build_count)} + in + #{stage_count} #{'stage'.pluralize(stage_count)}. diff --git a/app/views/notify/pipeline_success_email.text.erb b/app/views/notify/pipeline_success_email.text.erb index 40e5e306426..0970a3a4e09 100644 --- a/app/views/notify/pipeline_success_email.text.erb +++ b/app/views/notify/pipeline_success_email.text.erb @@ -18,7 +18,3 @@ Commit Author: <%= commit.author_name %> <% build_count = @pipeline.statuses.latest.size -%> <% stage_count = @pipeline.stages_count -%> Pipeline #<%= @pipeline.id %> ( <%= pipeline_url(@pipeline) %> ) successfully completed <%= build_count %> <%= 'build'.pluralize(build_count) %> in <%= stage_count %> <%= 'stage'.pluralize(stage_count) %>. - -You're receiving this email because of your account on <%= Gitlab.config.gitlab.host %>. -Manage all notifications: <%= profile_notifications_url %> -Help: <%= help_url %> From 0df104a389438665df2c7248ae022cdbb767f838 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Tue, 7 Feb 2017 16:06:27 +0100 Subject: [PATCH 2/5] use custom brand logo in pipeline mails --- app/helpers/emails_helper.rb | 14 +++++++++++++ app/views/layouts/mailer.html.haml | 2 +- spec/helpers/emails_helper_spec.rb | 32 ++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb index 2843ad96efa..3beddff9206 100644 --- a/app/helpers/emails_helper.rb +++ b/app/helpers/emails_helper.rb @@ -1,4 +1,6 @@ module EmailsHelper + include AppearancesHelper + # Google Actions # https://developers.google.com/gmail/markup/reference/go-to-action def email_action(url) @@ -49,4 +51,16 @@ module EmailsHelper msg = "This link is valid for #{password_reset_token_valid_time}. " msg << "After it expires, you can #{link_tag}." end + + def header_logo + if brand_item && brand_item.header_logo? + brand_header_logo + else + image_tag( + image_url('mailers/gitlab_header_logo.gif'), + size: "55x50", + alt: "GitLab" + ) + end + end end diff --git a/app/views/layouts/mailer.html.haml b/app/views/layouts/mailer.html.haml index 39133f8cdb3..53268cc22f8 100644 --- a/app/views/layouts/mailer.html.haml +++ b/app/views/layouts/mailer.html.haml @@ -48,7 +48,7 @@ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#6b4fbb;height:4px;font-size:4px;line-height:4px;" }   %tr.header %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" } - %img{ alt: "GitLab", height: "50", src: image_url('mailers/gitlab_header_logo.gif'), width: "55" }/ + = header_logo %tr %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" } %table.wrapper{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:640px;margin:0 auto;border-collapse:separate;border-spacing:0;" } diff --git a/spec/helpers/emails_helper_spec.rb b/spec/helpers/emails_helper_spec.rb index 3223556e1d3..b9519e387eb 100644 --- a/spec/helpers/emails_helper_spec.rb +++ b/spec/helpers/emails_helper_spec.rb @@ -43,4 +43,36 @@ describe EmailsHelper do end end end + + describe '#header_logo' do + context 'there is a brand item with a logo' do + it 'returns the brand header logo' do + appearance = create :appearance, header_logo: fixture_file_upload( + Rails.root.join('spec/fixtures/dk.png') + ) + + expect(header_logo).to eq( + %{Dk} + ) + end + end + + context 'there is a brand item without a logo' do + it 'returns the default header logo' do + create :appearance, header_logo: nil + + expect(header_logo).to eq( + %{GitLab} + ) + end + end + + context 'there is no brand item' do + it 'returns the default header logo' do + expect(header_logo).to eq( + %{GitLab} + ) + end + end + end end From 84420c89d5fbf98a19fb831a4489e9d5441e18ad Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Tue, 7 Feb 2017 18:23:58 +0100 Subject: [PATCH 3/5] add documentation for custom brand logo in email --- doc/README.md | 1 + .../branded_page_and_email_header.md | 15 +++++++++++++++ .../appearance.png | Bin 0 -> 10253 bytes .../custom_brand_header.png | Bin 0 -> 10014 bytes .../custom_email_header.png | Bin 0 -> 37472 bytes 5 files changed, 16 insertions(+) create mode 100644 doc/customization/branded_page_and_email_header.md create mode 100644 doc/customization/branded_page_and_email_header/appearance.png create mode 100644 doc/customization/branded_page_and_email_header/custom_brand_header.png create mode 100644 doc/customization/branded_page_and_email_header/custom_email_header.png diff --git a/doc/README.md b/doc/README.md index 1943d656aa7..c082b91a6b1 100644 --- a/doc/README.md +++ b/doc/README.md @@ -50,6 +50,7 @@ - [System hooks](system_hooks/system_hooks.md) Notifications when users, projects and keys are changed. - [Update](update/README.md) Update guides to upgrade your installation. - [Welcome message](customization/welcome_message.md) Add a custom welcome message to the sign-in page. +- [Header logo](customization/branded_page_and_email_header.md) Change the logo on the overall page and email header. - [Reply by email](administration/reply_by_email.md) Allow users to comment on issues and merge requests by replying to notification emails. - [Migrate GitLab CI to CE/EE](migrate_ci_to_ce/README.md) Follow this guide to migrate your existing GitLab CI data to GitLab CE/EE. - [Git LFS configuration](workflow/lfs/lfs_administration.md) diff --git a/doc/customization/branded_page_and_email_header.md b/doc/customization/branded_page_and_email_header.md new file mode 100644 index 00000000000..9a0f0b382fa --- /dev/null +++ b/doc/customization/branded_page_and_email_header.md @@ -0,0 +1,15 @@ +# Changing the logo on the overall page and email header + +Navigate to the **Admin** area and go to the **Appearance** page. + +Upload the custom logo (**Header logo**) in the section **Navigation bar**. + +![appearance](branded_page_and_email_header/appearance.png) + +After saving the page, your GitLab navigation bar will contain the custom logo: + +![custom_brand_header](branded_page_and_email_header/custom_brand_header.png) + +The GitLab pipeline emails will also have the custom logo: + +![custom_email_header](branded_page_and_email_header/custom_email_header.png) diff --git a/doc/customization/branded_page_and_email_header/appearance.png b/doc/customization/branded_page_and_email_header/appearance.png new file mode 100644 index 0000000000000000000000000000000000000000..abbba6f9ac9facf1b58d2caf1c3aa09830cf0342 GIT binary patch literal 10253 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 literal 0 HcmV?d00001 diff --git a/doc/customization/branded_page_and_email_header/custom_brand_header.png b/doc/customization/branded_page_and_email_header/custom_brand_header.png new file mode 100644 index 0000000000000000000000000000000000000000..7390f8a5e4e82cf3a5fc9f8127e3d7a17f54d764 GIT binary patch literal 10014 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 literal 0 HcmV?d00001 diff --git a/doc/customization/branded_page_and_email_header/custom_email_header.png b/doc/customization/branded_page_and_email_header/custom_email_header.png new file mode 100644 index 0000000000000000000000000000000000000000..705698ef4a8ca046c47b1702a5a731753d63c7dd GIT binary patch literal 37472 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 Ivaf^x8xA~MP5=M^ literal 0 HcmV?d00001 From 26da2c45ac4071f7a33a34c89162709d5a1bc470 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Tue, 7 Feb 2017 22:17:59 +0100 Subject: [PATCH 4/5] add changelog entry --- changelogs/unreleased/feature-brand-logo-in-emails.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/feature-brand-logo-in-emails.yml diff --git a/changelogs/unreleased/feature-brand-logo-in-emails.yml b/changelogs/unreleased/feature-brand-logo-in-emails.yml new file mode 100644 index 00000000000..a7674b9b25e --- /dev/null +++ b/changelogs/unreleased/feature-brand-logo-in-emails.yml @@ -0,0 +1,4 @@ +--- +title: Brand header logo for pipeline emails +merge_request: 9049 +author: Alexis Reigel From c1e94479bd565a3deebe7452f186815157082cbb Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Fri, 17 Feb 2017 10:05:13 +0100 Subject: [PATCH 5/5] restrict height of the custom brand logo in emails --- app/helpers/emails_helper.rb | 5 ++++- spec/helpers/emails_helper_spec.rb | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb index 3beddff9206..a6d9e37ac76 100644 --- a/app/helpers/emails_helper.rb +++ b/app/helpers/emails_helper.rb @@ -54,7 +54,10 @@ module EmailsHelper def header_logo if brand_item && brand_item.header_logo? - brand_header_logo + image_tag( + brand_item.header_logo, + style: 'height: 50px' + ) else image_tag( image_url('mailers/gitlab_header_logo.gif'), diff --git a/spec/helpers/emails_helper_spec.rb b/spec/helpers/emails_helper_spec.rb index b9519e387eb..cd112dbb2fb 100644 --- a/spec/helpers/emails_helper_spec.rb +++ b/spec/helpers/emails_helper_spec.rb @@ -52,7 +52,7 @@ describe EmailsHelper do ) expect(header_logo).to eq( - %{Dk} + %{Dk} ) end end